haya-select 1.0.119 → 1.0.120
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.
|
@@ -14,6 +14,22 @@ export function pickHayaSelectOption(systemTest: object, testId: string, { optio
|
|
|
14
14
|
* @returns {Promise<void>} Completes after the matching visible option is clicked.
|
|
15
15
|
*/
|
|
16
16
|
export function clickVisibleHayaSelectOption(systemTest: object, { optionValue, timeout }: ClickVisibleHayaSelectOptionOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Opens a HayaSelect instance by clicking its select container.
|
|
19
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
20
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
21
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
22
|
+
* @returns {Promise<void>} Completes after the select opens.
|
|
23
|
+
*/
|
|
24
|
+
export function openHayaSelect(systemTest: object, testId: string, { timeout, useBaseSelector }?: HayaSelectOpenOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Closes a HayaSelect instance by clicking its select container.
|
|
27
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
28
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
29
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
30
|
+
* @returns {Promise<void>} Completes after the select closes.
|
|
31
|
+
*/
|
|
32
|
+
export function closeHayaSelect(systemTest: object, testId: string, { timeout, useBaseSelector }?: HayaSelectOpenOptions): Promise<void>;
|
|
17
33
|
/**
|
|
18
34
|
* Waits until a HayaSelect renders exactly the expected current-option labels.
|
|
19
35
|
* @param {object} systemTest Browser session used by the running spec.
|
|
@@ -23,6 +39,14 @@ export function clickVisibleHayaSelectOption(systemTest: object, { optionValue,
|
|
|
23
39
|
* @returns {Promise<void>} Completes after the current options match.
|
|
24
40
|
*/
|
|
25
41
|
export function expectHayaSelectCurrentOptions(systemTest: object, testId: string, expectedTexts: string[], { timeout }?: ExpectHayaSelectCurrentOptionsOptions): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Waits until a HayaSelect and its portal-rendered options are closed.
|
|
44
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
45
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
46
|
+
* @param {ExpectHayaSelectOptionsClosedOptions} [options] Optional Selenium timeout override.
|
|
47
|
+
* @returns {Promise<void>} Completes after no visible options remain.
|
|
48
|
+
*/
|
|
49
|
+
export function expectHayaSelectOptionsClosed(systemTest: object, testId: string, { timeout }?: ExpectHayaSelectOptionsClosedOptions): Promise<void>;
|
|
26
50
|
/**
|
|
27
51
|
* System test helper for interacting with HayaSelect instances.
|
|
28
52
|
*/
|
|
@@ -37,15 +61,29 @@ export default class HayaSelectSystemTestHelper {
|
|
|
37
61
|
selectContainerSelector: string;
|
|
38
62
|
searchInputSelector: string;
|
|
39
63
|
optionsContainerSelectorFallback: string;
|
|
40
|
-
/**
|
|
41
|
-
|
|
64
|
+
/**
|
|
65
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
66
|
+
* @returns {Promise<void>} Completes after the select opens.
|
|
67
|
+
*/
|
|
68
|
+
open({ timeout, useBaseSelector }?: HayaSelectOpenOptions): Promise<void>;
|
|
42
69
|
_optionsContainerSelector: string | null | undefined;
|
|
43
|
-
/**
|
|
44
|
-
|
|
70
|
+
/**
|
|
71
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
72
|
+
* @returns {Promise<void>} Completes after the select closes.
|
|
73
|
+
*/
|
|
74
|
+
close({ timeout, useBaseSelector }?: HayaSelectOpenOptions): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* @param {ExpectHayaSelectOptionsClosedOptions} [options] Optional timeout.
|
|
77
|
+
* @returns {Promise<void>} Completes after no visible options remain.
|
|
78
|
+
*/
|
|
79
|
+
expectClosed({ timeout }?: ExpectHayaSelectOptionsClosedOptions): Promise<void>;
|
|
45
80
|
/** @returns {Promise<boolean>} */
|
|
46
81
|
isOpen(): Promise<boolean>;
|
|
47
|
-
/**
|
|
48
|
-
|
|
82
|
+
/**
|
|
83
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
84
|
+
* @returns {Promise<void>} Completes after the select container click.
|
|
85
|
+
*/
|
|
86
|
+
clickSelectContainer({ timeout, useBaseSelector }?: HayaSelectOpenOptions): Promise<void>;
|
|
49
87
|
/**
|
|
50
88
|
* @param {string} selector
|
|
51
89
|
* @returns {Promise<Array<import("selenium-webdriver").WebElement>>}
|
|
@@ -56,6 +94,12 @@ export default class HayaSelectSystemTestHelper {
|
|
|
56
94
|
* @returns {Promise<Array<import("selenium-webdriver").WebElement>>}
|
|
57
95
|
*/
|
|
58
96
|
findVisibleElements(selector: string): Promise<Array<any>>;
|
|
97
|
+
/**
|
|
98
|
+
* Counts visible elements by CSS selector in browser layout state.
|
|
99
|
+
* @param {string} selector CSS selector to count.
|
|
100
|
+
* @returns {Promise<number>} Number of visible elements.
|
|
101
|
+
*/
|
|
102
|
+
visibleElementsCount(selector: string): Promise<number>;
|
|
59
103
|
/** @returns {Promise<string>} */
|
|
60
104
|
optionsContainerSelector(): Promise<string>;
|
|
61
105
|
/** @returns {Promise<string[]>} */
|
|
@@ -74,6 +118,10 @@ export type HayaSelectSystemTestHelperOptions = {
|
|
|
74
118
|
systemTest: object;
|
|
75
119
|
testId: string;
|
|
76
120
|
};
|
|
121
|
+
export type HayaSelectOpenOptions = {
|
|
122
|
+
timeout?: number;
|
|
123
|
+
useBaseSelector?: boolean;
|
|
124
|
+
};
|
|
77
125
|
export type PickHayaSelectOptionOptions = {
|
|
78
126
|
optionText?: string;
|
|
79
127
|
optionValue?: string | number;
|
|
@@ -88,5 +136,8 @@ export type ClickVisibleHayaSelectOptionOptions = {
|
|
|
88
136
|
export type ExpectHayaSelectCurrentOptionsOptions = {
|
|
89
137
|
timeout?: number;
|
|
90
138
|
};
|
|
139
|
+
export type ExpectHayaSelectOptionsClosedOptions = {
|
|
140
|
+
timeout?: number;
|
|
141
|
+
};
|
|
91
142
|
export type WebElement = any;
|
|
92
143
|
//# sourceMappingURL=system-test-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-test-helpers.d.ts","sourceRoot":"","sources":["../src/system-test-helpers.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-test-helpers.d.ts","sourceRoot":"","sources":["../src/system-test-helpers.js"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,iDANW,MAAM,UACN,MAAM,iEACN,2BAA2B,GACzB,OAAO,CAAC,IAAI,CAAC,CA8BzB;AAED;;;;;GAKG;AACH,yDAJW,MAAM,4BACN,mCAAmC,GACjC,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;;;;GAMG;AACH,2CALW,MAAM,UACN,MAAM,iCACN,qBAAqB,GACnB,OAAO,CAAC,IAAI,CAAC,CAMzB;AAED;;;;;;GAMG;AACH,4CALW,MAAM,UACN,MAAM,iCACN,qBAAqB,GACnB,OAAO,CAAC,IAAI,CAAC,CAMzB;AAED;;;;;;;GAOG;AACH,2DANW,MAAM,UACN,MAAM,iBACN,MAAM,EAAE,gBACR,qCAAqC,GACnC,OAAO,CAAC,IAAI,CAAC,CAyBzB;AAED;;;;;;GAMG;AACH,0DALW,MAAM,UACN,MAAM,gBACN,oCAAoC,GAClC,OAAO,CAAC,IAAI,CAAC,CAMzB;AAED;;GAEG;AACH;IACE,yDAAyD;IACzD,qBADY,iCAAiC,EAqB5C;IARC,gBAA4B;IAC5B,eAAoB;IACpB,qBAA0C;IAC1C,0BAA2E;IAC3E,iCAAoG;IACpG,gCAAkG;IAClG,4BAA0F;IAC1F,yCAAuF;IAGzF;;;OAGG;IACH,oCAHW,qBAAqB,GACnB,OAAO,CAAC,IAAI,CAAC,CAazB;IATC,qDAAqC;IAWvC;;;OAGG;IACH,qCAHW,qBAAqB,GACnB,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;OAGG;IACH,2BAHW,oCAAoC,GAClC,OAAO,CAAC,IAAI,CAAC,CAazB;IAED,kCAAkC;IAClC,UADc,OAAO,CAAC,OAAO,CAAC,CAS7B;IAED;;;OAGG;IACH,oDAHW,qBAAqB,GACnB,OAAO,CAAC,IAAI,CAAC,CAMzB;IAED;;;OAGG;IACH,uBAHW,MAAM,GACJ,OAAO,CAAC,KAAK,CAAC,GAAuC,CAAC,CAAC,CAInE;IAED;;;OAGG;IACH,8BAHW,MAAM,GACJ,OAAO,CAAC,KAAK,CAAC,GAAuC,CAAC,CAAC,CAanE;IAED;;;;OAIG;IACH,+BAHW,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAc3B;IAED,iCAAiC;IACjC,4BADc,OAAO,CAAC,MAAM,CAAC,CAW5B;IAED,mCAAmC;IACnC,eADc,OAAO,CAAC,MAAM,EAAE,CAAC,CAM9B;IAED;;;OAGG;IACH,mDAHW;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAC,MAAM,CAAA;KAAC,mBACpD,OAAO,CAAC,IAAI,CAAC,CA6DzB;CACF;gDApWa;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC;oCACpC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAC;0CAC7C;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAC;kDACnH;IAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC;oDAChD;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC;mDAClB;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import waitFor from "awaitery/build/wait-for.js";
|
|
2
2
|
import { By } from "selenium-webdriver";
|
|
3
3
|
/** @typedef {{systemTest: object, testId: string}} HayaSelectSystemTestHelperOptions */
|
|
4
|
+
/** @typedef {{timeout?: number, useBaseSelector?: boolean}} HayaSelectOpenOptions */
|
|
4
5
|
/** @typedef {{optionText?: string, optionValue?: string | number, search?: boolean, timeout?: number, useBaseSelector?: boolean}} PickHayaSelectOptionOptions */
|
|
5
6
|
/** @typedef {{optionValue: string | number, timeout?: number}} ClickVisibleHayaSelectOptionOptions */
|
|
6
7
|
/** @typedef {{timeout?: number}} ExpectHayaSelectCurrentOptionsOptions */
|
|
8
|
+
/** @typedef {{timeout?: number}} ExpectHayaSelectOptionsClosedOptions */
|
|
7
9
|
/** @typedef {import("selenium-webdriver").WebElement} WebElement */
|
|
8
10
|
const DEFAULT_TIMEOUT = 5000;
|
|
9
11
|
/**
|
|
@@ -45,6 +47,28 @@ export async function pickHayaSelectOption(systemTest, testId, { optionText, opt
|
|
|
45
47
|
export async function clickVisibleHayaSelectOption(systemTest, { optionValue, timeout = DEFAULT_TIMEOUT }) {
|
|
46
48
|
await clickVisibleSelectOptionByValue(systemTest, optionValue, timeout);
|
|
47
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Opens a HayaSelect instance by clicking its select container.
|
|
52
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
53
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
54
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
55
|
+
* @returns {Promise<void>} Completes after the select opens.
|
|
56
|
+
*/
|
|
57
|
+
export async function openHayaSelect(systemTest, testId, { timeout = DEFAULT_TIMEOUT, useBaseSelector = true } = {}) {
|
|
58
|
+
const helper = new HayaSelectSystemTestHelper({ systemTest, testId });
|
|
59
|
+
await helper.open({ timeout, useBaseSelector });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Closes a HayaSelect instance by clicking its select container.
|
|
63
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
64
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
65
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
66
|
+
* @returns {Promise<void>} Completes after the select closes.
|
|
67
|
+
*/
|
|
68
|
+
export async function closeHayaSelect(systemTest, testId, { timeout = DEFAULT_TIMEOUT, useBaseSelector = true } = {}) {
|
|
69
|
+
const helper = new HayaSelectSystemTestHelper({ systemTest, testId });
|
|
70
|
+
await helper.close({ timeout, useBaseSelector });
|
|
71
|
+
}
|
|
48
72
|
/**
|
|
49
73
|
* Waits until a HayaSelect renders exactly the expected current-option labels.
|
|
50
74
|
* @param {object} systemTest Browser session used by the running spec.
|
|
@@ -70,6 +94,17 @@ export async function expectHayaSelectCurrentOptions(systemTest, testId, expecte
|
|
|
70
94
|
return expectedTexts.every((expectedText, index) => visibleTexts[index]?.includes(expectedText));
|
|
71
95
|
}, timeout, `Timed out waiting for ${testId} current options: ${expectedTexts.join(", ")}`);
|
|
72
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Waits until a HayaSelect and its portal-rendered options are closed.
|
|
99
|
+
* @param {object} systemTest Browser session used by the running spec.
|
|
100
|
+
* @param {string} testId Wrapper `data-testid` around the select.
|
|
101
|
+
* @param {ExpectHayaSelectOptionsClosedOptions} [options] Optional Selenium timeout override.
|
|
102
|
+
* @returns {Promise<void>} Completes after no visible options remain.
|
|
103
|
+
*/
|
|
104
|
+
export async function expectHayaSelectOptionsClosed(systemTest, testId, { timeout = DEFAULT_TIMEOUT } = {}) {
|
|
105
|
+
const helper = new HayaSelectSystemTestHelper({ systemTest, testId });
|
|
106
|
+
await helper.expectClosed({ timeout });
|
|
107
|
+
}
|
|
73
108
|
/**
|
|
74
109
|
* System test helper for interacting with HayaSelect instances.
|
|
75
110
|
*/
|
|
@@ -93,27 +128,48 @@ export default class HayaSelectSystemTestHelper {
|
|
|
93
128
|
this.searchInputSelector = `${this.rootSelector} [data-testid='haya-select/search-input']`;
|
|
94
129
|
this.optionsContainerSelectorFallback = "[data-testid='haya-select/options-container']";
|
|
95
130
|
}
|
|
96
|
-
/**
|
|
97
|
-
|
|
98
|
-
|
|
131
|
+
/**
|
|
132
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
133
|
+
* @returns {Promise<void>} Completes after the select opens.
|
|
134
|
+
*/
|
|
135
|
+
async open({ timeout = DEFAULT_TIMEOUT, useBaseSelector = true } = {}) {
|
|
136
|
+
await this.clickSelectContainer({ timeout, useBaseSelector });
|
|
99
137
|
this._optionsContainerSelector = null;
|
|
100
|
-
await waitFor({ timeout
|
|
138
|
+
await waitFor({ timeout }, async () => {
|
|
101
139
|
const openedElements = await this.findElements(`${this.componentSelector}[data-opened='true']`);
|
|
102
140
|
if (openedElements.length === 0) {
|
|
103
141
|
throw new Error(`Expected HayaSelect to open: ${this.testId}`);
|
|
104
142
|
}
|
|
105
143
|
});
|
|
106
144
|
}
|
|
107
|
-
/**
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
145
|
+
/**
|
|
146
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
147
|
+
* @returns {Promise<void>} Completes after the select closes.
|
|
148
|
+
*/
|
|
149
|
+
async close({ timeout = DEFAULT_TIMEOUT, useBaseSelector = true } = {}) {
|
|
150
|
+
await this.clickSelectContainer({ timeout, useBaseSelector });
|
|
151
|
+
await waitFor({ timeout }, async () => {
|
|
111
152
|
const openedElements = await this.findElements(`${this.componentSelector}[data-opened='true']`);
|
|
112
153
|
if (openedElements.length > 0) {
|
|
113
154
|
throw new Error(`Expected HayaSelect to close: ${this.testId}`);
|
|
114
155
|
}
|
|
115
156
|
});
|
|
116
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* @param {ExpectHayaSelectOptionsClosedOptions} [options] Optional timeout.
|
|
160
|
+
* @returns {Promise<void>} Completes after no visible options remain.
|
|
161
|
+
*/
|
|
162
|
+
async expectClosed({ timeout = DEFAULT_TIMEOUT } = {}) {
|
|
163
|
+
await waitFor({ timeout }, async () => {
|
|
164
|
+
const optionsContainerSelector = await this.optionsContainerSelector();
|
|
165
|
+
const open = await this.isOpen();
|
|
166
|
+
const visibleContainersCount = await this.visibleElementsCount(optionsContainerSelector);
|
|
167
|
+
const visibleOptionsCount = await this.visibleElementsCount(`${optionsContainerSelector} [data-testid='haya-select/option']`);
|
|
168
|
+
if (open || visibleContainersCount > 0 || visibleOptionsCount > 0) {
|
|
169
|
+
throw new Error(`Expected ${this.testId} options to close, got open=${open}, visibleContainers=${visibleContainersCount}, visibleOptions=${visibleOptionsCount}`);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
117
173
|
/** @returns {Promise<boolean>} */
|
|
118
174
|
async isOpen() {
|
|
119
175
|
const openedElements = await this.findElements(`${this.componentSelector}[data-opened='true']`);
|
|
@@ -122,9 +178,12 @@ export default class HayaSelectSystemTestHelper {
|
|
|
122
178
|
const searchInputs = await this.findVisibleElements(this.searchInputSelector);
|
|
123
179
|
return searchInputs.length > 0;
|
|
124
180
|
}
|
|
125
|
-
/**
|
|
126
|
-
|
|
127
|
-
|
|
181
|
+
/**
|
|
182
|
+
* @param {HayaSelectOpenOptions} [options] Optional selector scope and timeout.
|
|
183
|
+
* @returns {Promise<void>} Completes after the select container click.
|
|
184
|
+
*/
|
|
185
|
+
async clickSelectContainer({ timeout = DEFAULT_TIMEOUT, useBaseSelector = true } = {}) {
|
|
186
|
+
const selectContainer = await this.systemTest.find(this.selectContainerSelector, { timeout, useBaseSelector });
|
|
128
187
|
await selectContainer.click();
|
|
129
188
|
}
|
|
130
189
|
/**
|
|
@@ -148,6 +207,19 @@ export default class HayaSelectSystemTestHelper {
|
|
|
148
207
|
}
|
|
149
208
|
return visibleElements;
|
|
150
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* Counts visible elements by CSS selector in browser layout state.
|
|
212
|
+
* @param {string} selector CSS selector to count.
|
|
213
|
+
* @returns {Promise<number>} Number of visible elements.
|
|
214
|
+
*/
|
|
215
|
+
async visibleElementsCount(selector) {
|
|
216
|
+
return Number(await this.systemTest.getDriver().executeScript(`
|
|
217
|
+
return Array.from(document.querySelectorAll(arguments[0])).filter((element) => {
|
|
218
|
+
const style = window.getComputedStyle(element)
|
|
219
|
+
return style.display !== "none" && style.visibility !== "hidden" && element.getClientRects().length > 0
|
|
220
|
+
}).length
|
|
221
|
+
`, selector));
|
|
222
|
+
}
|
|
151
223
|
/** @returns {Promise<string>} */
|
|
152
224
|
async optionsContainerSelector() {
|
|
153
225
|
if (this._optionsContainerSelector)
|
|
@@ -290,4 +362,4 @@ function testIdSelector(testId) {
|
|
|
290
362
|
function cssAttributeValue(value) {
|
|
291
363
|
return String(value).replaceAll("\\", "\\\\").replaceAll('"', '\\"');
|
|
292
364
|
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFDeEYsaUtBQWlLO0FBQ2pLLHNHQUFzRztBQUN0RywwRUFBMEU7QUFDMUUsb0VBQW9FO0FBRXBFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQTtBQUU1Qjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxlQUFlLEVBQUUsZUFBZSxHQUFHLElBQUksRUFBQztJQUN6SixNQUFNLE1BQU0sR0FBRyxJQUFJLDBCQUEwQixDQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUE7SUFDbkUsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO0lBQ3ZHLE1BQU0sYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBRTNCLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFBO1FBQ25HLE1B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QyxJQUFJLENBQy9DLEtBQUssSUFBSSxFQUFFO1FBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUU1RSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxPQUFPLENBQUE7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsRUFDRCxPQUFPLEVBQ1AsMENBQTBDLFFBQVEsRUFBRSxDQUNyRCxDQUFBO0lBRUQsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzVDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBTTtJQUM1QixPQUFPLGlCQUFpQixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3ZELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHdhaXRGb3IgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3dhaXQtZm9yLmpzXCJcbmltcG9ydCB7Qnl9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuXG4vKiogQHR5cGVkZWYge3tzeXN0ZW1UZXN0OiBvYmplY3QsIHRlc3RJZDogc3RyaW5nfX0gSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXJPcHRpb25zICovXG4vKiogQHR5cGVkZWYge3tvcHRpb25UZXh0Pzogc3RyaW5nLCBvcHRpb25WYWx1ZT86IHN0cmluZyB8IG51bWJlciwgc2VhcmNoPzogYm9vbGVhbiwgdGltZW91dD86IG51bWJlciwgdXNlQmFzZVNlbGVjdG9yPzogYm9vbGVhbn19IFBpY2tIYXlhU2VsZWN0T3B0aW9uT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHt7b3B0aW9uVmFsdWU6IHN0cmluZyB8IG51bWJlciwgdGltZW91dD86IG51bWJlcn19IENsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb25PcHRpb25zICovXG4vKiogQHR5cGVkZWYge3t0aW1lb3V0PzogbnVtYmVyfX0gRXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zT3B0aW9ucyAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gV2ViRWxlbWVudCAqL1xuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSA1MDAwXG5cbi8qKlxuICogU2VsZWN0cyBhbiBvcHRpb24gaW4gYSBIYXlhU2VsZWN0IGluc3RhbmNlLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgV3JhcHBlciBgZGF0YS10ZXN0aWRgIGFyb3VuZCB0aGUgc2VsZWN0LlxuICogQHBhcmFtIHtQaWNrSGF5YVNlbGVjdE9wdGlvbk9wdGlvbnN9IG9wdGlvbnMgVGV4dC92YWx1ZSB0byBjaG9vc2UgYW5kIHdoZXRoZXIgdG8gdHlwZSBpbnRvIHRoZSBzZWFyY2ggZmllbGQgZmlyc3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICogQHJlamVjdHMge0Vycm9yfSBXaGVuIG5laXRoZXIgdGV4dCBub3IgdmFsdWUgaXMgc3VwcGxpZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaWNrSGF5YVNlbGVjdE9wdGlvbihzeXN0ZW1UZXN0LCB0ZXN0SWQsIHtvcHRpb25UZXh0LCBvcHRpb25WYWx1ZSwgc2VhcmNoID0gZmFsc2UsIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWV9KSB7XG4gIGNvbnN0IGhlbHBlciA9IG5ldyBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcih7c3lzdGVtVGVzdCwgdGVzdElkfSlcbiAgY29uc3Qgc2VsZWN0RWxlbWVudCA9IGF3YWl0IHN5c3RlbVRlc3QuZmluZChoZWxwZXIuc2VsZWN0Q29udGFpbmVyU2VsZWN0b3IsIHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxuICBhd2FpdCBzZWxlY3RFbGVtZW50LmNsaWNrKClcblxuICBpZiAoc2VhcmNoKSB7XG4gICAgaWYgKCFvcHRpb25UZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9wdGlvblRleHQgd2hlbiBzZWFyY2hpbmcgJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBjb25zdCBzZWFyY2hFbGVtZW50ID0gYXdhaXQgc3lzdGVtVGVzdC5maW5kKGhlbHBlci5zZWFyY2hJbnB1dFNlbGVjdG9yLCB7dGltZW91dCwgdXNlQmFzZVNlbGVjdG9yfSlcbiAgICBhd2FpdCBzZWFyY2hFbGVtZW50LnNlbmRLZXlzKG9wdGlvblRleHQpXG4gIH1cblxuICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCBoZWxwZXIub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcblxuICBpZiAodHlwZW9mIG9wdGlvblZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYXdhaXQgY2xpY2tWaXNpYmxlU2VsZWN0T3B0aW9uQnlWYWx1ZShzeXN0ZW1UZXN0LCBvcHRpb25WYWx1ZSwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG9wdGlvblRleHQpIHtcbiAgICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVRleHQoc3lzdGVtVGVzdCwgb3B0aW9uVGV4dCwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKVxuICAgIHJldHVyblxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb25WYWx1ZSBvciBvcHRpb25UZXh0IGZvciAke3Rlc3RJZH1gKVxufVxuXG4vKipcbiAqIENsaWNrcyBhbiBvcHRpb24gaW4gYW4gYWxyZWFkeS1vcGVuIEhheWFTZWxlY3QgZHJvcGRvd24uXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtDbGlja1Zpc2libGVIYXlhU2VsZWN0T3B0aW9uT3B0aW9uc30gb3B0aW9ucyBPcHRpb24gdmFsdWUgdG8gY2hvb3NlLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgbWF0Y2hpbmcgdmlzaWJsZSBvcHRpb24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb24oc3lzdGVtVGVzdCwge29wdGlvblZhbHVlLCB0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUfSkge1xuICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVZhbHVlKHN5c3RlbVRlc3QsIG9wdGlvblZhbHVlLCB0aW1lb3V0KVxufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGEgSGF5YVNlbGVjdCByZW5kZXJzIGV4YWN0bHkgdGhlIGV4cGVjdGVkIGN1cnJlbnQtb3B0aW9uIGxhYmVscy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFdyYXBwZXIgYGRhdGEtdGVzdGlkYCBhcm91bmQgdGhlIHNlbGVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGV4cGVjdGVkVGV4dHMgQ3VycmVudCBvcHRpb24gdGV4dCBmcmFnbWVudHMgaW4gcmVuZGVyZWQgb3JkZXIuXG4gKiBAcGFyYW0ge0V4cGVjdEhheWFTZWxlY3RDdXJyZW50T3B0aW9uc09wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBTZWxlbml1bSB0aW1lb3V0IG92ZXJyaWRlLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgY3VycmVudCBvcHRpb25zIG1hdGNoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zKHN5c3RlbVRlc3QsIHRlc3RJZCwgZXhwZWN0ZWRUZXh0cywge3RpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVR9ID0ge30pIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBgJHt0ZXN0SWRTZWxlY3Rvcih0ZXN0SWQpfSBbZGF0YS10ZXN0aWQ9XCJoYXlhLXNlbGVjdC9jdXJyZW50LW9wdGlvblwiXWBcbiAgYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS53YWl0KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcbiAgICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgICBjb25zdCB2aXNpYmxlVGV4dHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgaWYgKGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgIHZpc2libGVUZXh0cy5wdXNoKGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh2aXNpYmxlVGV4dHMubGVuZ3RoICE9PSBleHBlY3RlZFRleHRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4cGVjdGVkVGV4dHMuZXZlcnkoKGV4cGVjdGVkVGV4dCwgaW5kZXgpID0+IHZpc2libGVUZXh0c1tpbmRleF0/LmluY2x1ZGVzKGV4cGVjdGVkVGV4dCkpXG4gICAgfSxcbiAgICB0aW1lb3V0LFxuICAgIGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgJHt0ZXN0SWR9IGN1cnJlbnQgb3B0aW9uczogJHtleHBlY3RlZFRleHRzLmpvaW4oXCIsIFwiKX1gXG4gIClcbn1cblxuLyoqXG4gKiBTeXN0ZW0gdGVzdCBoZWxwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSGF5YVNlbGVjdCBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyIHtcbiAgLyoqIEBwYXJhbSB7SGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXJPcHRpb25zfSBvcHRpb25zICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIsIGdvdDogJHtvcHRpb25zfWApXG4gICAgfVxuXG4gICAgY29uc3Qge3N5c3RlbVRlc3QsIHRlc3RJZCwgLi4ucmVzdEFyZ3N9ID0gb3B0aW9uc1xuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXI6ICR7ZXh0cmFLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuc3lzdGVtVGVzdCA9IHN5c3RlbVRlc3RcbiAgICB0aGlzLnRlc3RJZCA9IHRlc3RJZFxuICAgIHRoaXMucm9vdFNlbGVjdG9yID0gdGVzdElkU2VsZWN0b3IodGVzdElkKVxuICAgIHRoaXMuY29tcG9uZW50U2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdCddYFxuICAgIHRoaXMuY2hldnJvbkNvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3QvY2hldnJvbi1jb250YWluZXInXWBcbiAgICB0aGlzLnNlbGVjdENvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvc2VsZWN0LWNvbnRhaW5lciddYFxuICAgIHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L3NlYXJjaC1pbnB1dCddYFxuICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yRmFsbGJhY2sgPSBcIltkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9ucy1jb250YWluZXInXVwiXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIG9wZW4oKSB7XG4gICAgYXdhaXQgdGhpcy5jbGlja1NlbGVjdENvbnRhaW5lcigpXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gbnVsbFxuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIG9wZW46ICR7dGhpcy50ZXN0SWR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLmNsaWNrU2VsZWN0Q29udGFpbmVyKClcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcGVuZWRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke3RoaXMuY29tcG9uZW50U2VsZWN0b3J9W2RhdGEtb3BlbmVkPSd0cnVlJ11gKVxuXG4gICAgICBpZiAob3BlbmVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIEhheWFTZWxlY3QgdG8gY2xvc2U6ICR7dGhpcy50ZXN0SWR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAqL1xuICBhc3luYyBpc09wZW4oKSB7XG4gICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgc2VhcmNoSW5wdXRzID0gYXdhaXQgdGhpcy5maW5kVmlzaWJsZUVsZW1lbnRzKHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvcilcblxuICAgIHJldHVybiBzZWFyY2hJbnB1dHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGlja1NlbGVjdENvbnRhaW5lcigpIHtcbiAgICBjb25zdCBzZWxlY3RDb250YWluZXIgPSBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZmluZCh0aGlzLnNlbGVjdENvbnRhaW5lclNlbGVjdG9yLCB7dGltZW91dDogNTAwMH0pXG5cbiAgICBhd2FpdCBzZWxlY3RDb250YWluZXIuY2xpY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD4+fVxuICAgKi9cbiAgYXN5bmMgZmluZEVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRWaXNpYmxlRWxlbWVudHMoc2VsZWN0b3IpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKHNlbGVjdG9yKVxuICAgIGNvbnN0IHZpc2libGVFbGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgIGlmIChhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKCkpIHtcbiAgICAgICAgdmlzaWJsZUVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUVsZW1lbnRzXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKCkge1xuICAgIGlmICh0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpIHJldHVybiB0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JcblxuICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG4gICAgY29uc3QgY29tcG9uZW50RWxlbWVudHMgPSBvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwID8gb3BlbmVkRWxlbWVudHMgOiBhd2FpdCB0aGlzLmZpbmRWaXNpYmxlRWxlbWVudHModGhpcy5jb21wb25lbnRTZWxlY3RvcilcbiAgICBjb25zdCBpZCA9IGNvbXBvbmVudEVsZW1lbnRzLmxlbmd0aCA+IDAgPyBhd2FpdCBjb21wb25lbnRFbGVtZW50c1swXS5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpIDogbnVsbFxuXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gaWQgPyBgW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb25zLWNvbnRhaW5lciddW2RhdGEtaWQ9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKGlkKX1cIl1gIDogdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3JGYWxsYmFja1xuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgb3B0aW9uVGV4dHMoKSB7XG4gICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IChhd2FpdCBvcHRpb24uZ2V0VGV4dCgpKS50cmltKCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2luZGV4PzogbnVtYmVyLCB0ZXh0Pzogc3RyaW5nLCB2YWx1ZT86IHN0cmluZ3xudW1iZXJ9fSBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNlbGVjdE9wdGlvbih7aW5kZXgsIHRleHQsIHZhbHVlLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBjcml0ZXJpYSBmb3Igc2VsZWN0T3B0aW9uLCBnb3Q6IHVuZGVmaW5lZFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VsZWN0T3B0aW9uIGNyaXRlcmlhOiAke2V4dHJhS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXVtkYXRhLXZhbHVlPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSl9XCJdYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1swXVxuXG4gICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gZm9yIHZhbHVlOiAke3ZhbHVlfWApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5kZXggPT0gXCJudW1iZXJcIikge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1tpbmRleF1cblxuICAgICAgICBpZiAoIW9wdGlvbikgdGhyb3cgbmV3IEVycm9yKGBObyBvcHRpb24gYXQgaW5kZXg6ICR7aW5kZXh9YClcblxuICAgICAgICBhd2FpdCBvcHRpb24uY2xpY2soKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuXG4gICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25UZXh0ID0gKGF3YWl0IG9wdGlvbi5nZXRUZXh0KCkpLnRyaW0oKVxuXG4gICAgICAgICAgaWYgKG9wdGlvblRleHQgPT09IHRleHQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBmb3VuZCB3aXRoIHRleHQ6ICR7dGV4dH1gKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHZhbHVlLCB0ZXh0LCBvciBpbmRleCB3aGVuIHNlbGVjdGluZyBhbiBvcHRpb25cIilcbiAgfVxufVxuXG4vKipcbiAqIENsaWNrcyBhIHZpc2libGUgSGF5YVNlbGVjdCBvcHRpb24gYnkgYmFja2VuZCB2YWx1ZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gb3B0aW9uVmFsdWUgQmFja2VuZCB2YWx1ZSBzdG9yZWQgaW4gYGRhdGEtdmFsdWVgLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgTWF4aW11bSB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXSBPcHRpb25zIGNvbnRhaW5lciBzZWxlY3RvciB0byBzY29wZSB0aGUgbG9va3VwLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgbWF0Y2hpbmcgdmlzaWJsZSBvcHRpb24gaXMgY2xpY2tlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tWaXNpYmxlU2VsZWN0T3B0aW9uQnlWYWx1ZShzeXN0ZW1UZXN0LCBvcHRpb25WYWx1ZSwgdGltZW91dCwgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gXCJcIikge1xuICBjb25zdCBzZWxlY3RvciA9IGAke29wdGlvbnNDb250YWluZXJTZWxlY3RvciA/IGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gYCA6IFwiXCJ9W2RhdGEtdGVzdGlkPVwiaGF5YS1zZWxlY3Qvb3B0aW9uXCJdW2RhdGEtdmFsdWU9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKG9wdGlvblZhbHVlKX1cIl1gXG4gIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCBmaW5kVmlzaWJsZUVsZW1lbnQoc3lzdGVtVGVzdCwgc2VsZWN0b3IsIHRpbWVvdXQpXG4gIGF3YWl0IGVsZW1lbnQuY2xpY2soKVxufVxuXG4vKipcbiAqIENsaWNrcyBhIHZpc2libGUgSGF5YVNlbGVjdCBvcHRpb24gYnkgZGlzcGxheWVkIHRleHQuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBWaXNpYmxlIGZyYWdtZW50IHJlbmRlcmVkIGJ5IHRoZSBvcHRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3JdIE9wdGlvbnMgY29udGFpbmVyIHNlbGVjdG9yIHRvIHNjb3BlIHRoZSBsb29rdXAuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVRleHQoc3lzdGVtVGVzdCwgZXhwZWN0ZWRUZXh0LCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBcIlwiKSB7XG4gIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge1dlYkVsZW1lbnR9ICovIChcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLndhaXQoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdG9yID0gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID8gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBgIDogXCJcIn1bZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYFxuICAgICAgICBjb25zdCBvcHRpb25FbGVtZW50cyA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG5cbiAgICAgICAgZm9yIChjb25zdCBvcHRpb25FbGVtZW50IG9mIG9wdGlvbkVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKCEoYXdhaXQgb3B0aW9uRWxlbWVudC5pc0Rpc3BsYXllZCgpKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhY3R1YWxUZXh0ID0gYXdhaXQgb3B0aW9uRWxlbWVudC5nZXRUZXh0KClcbiAgICAgICAgICBpZiAoYWN0dWFsVGV4dC5pbmNsdWRlcyhleHBlY3RlZFRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uRWxlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHZpc2libGUgc2VsZWN0IG9wdGlvbiB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fWBcbiAgICApXG4gIClcblxuICBhd2FpdCBlbGVtZW50LmNsaWNrKClcbn1cblxuLyoqXG4gKiBGaW5kcyBhIHZpc2libGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIENTUyBxdWVyeSB0aGF0IGNhbiBtYXRjaCBvbmUgb3IgbW9yZSBub2Rlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IE1heGltdW0gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxXZWJFbGVtZW50Pn0gRmlyc3QgZGlzcGxheWVkIG1hdGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kVmlzaWJsZUVsZW1lbnQoc3lzdGVtVGVzdCwgc2VsZWN0b3IsIHRpbWVvdXQpIHtcbiAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkud2FpdChcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuICAgIHRpbWVvdXQsXG4gICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciB2aXNpYmxlIHNlbGVjdG9yICR7c2VsZWN0b3J9YFxuICApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7V2ViRWxlbWVudH0gKi8gKGVsZW1lbnQpXG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGF0YS10ZXN0aWQgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSYXcgdmFsdWUgZnJvbSB0aGUgY29tcG9uZW50J3MgYHRlc3RJRGAgcHJvcC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEF0dHJpYnV0ZSBzZWxlY3RvciBmb3IgdGhlIHZhbHVlLlxuICovXG5mdW5jdGlvbiB0ZXN0SWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBbZGF0YS10ZXN0aWQ9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKHRlc3RJZCl9XCJdYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgYSB2YWx1ZSBmb3IgdXNlIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZSBSYXcgYXR0cmlidXRlIHZhbHVlIHRvIGludGVycG9sYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHNhZmUgZm9yIGEgZG91YmxlLXF1b3RlZCBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIGNzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiXFxcXFxcXFxcIikucmVwbGFjZUFsbCgnXCInLCAnXFxcXFwiJylcbn1cbiJdfQ==
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tdGVzdC1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUVyQyx3RkFBd0Y7QUFDeEYscUZBQXFGO0FBQ3JGLGlLQUFpSztBQUNqSyxzR0FBc0c7QUFDdEcsMEVBQTBFO0FBQzFFLHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFFcEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFBO0FBRTVCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLGVBQWUsRUFBRSxlQUFlLEdBQUcsSUFBSSxFQUFDO0lBQ3pKLE1BQU0sTUFBTSxHQUFHLElBQUksMEJBQTBCLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtJQUNuRSxNQUFNLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLEVBQUMsT0FBTyxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUE7SUFDdkcsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUE7SUFFM0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUMsT0FBTyxFQUFFLGVB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QUksQ0FDL0MsS0FBSyxJQUFJLEVBQUU7UUFDVCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBRTVFLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxNQUFNLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLE9BQU8sQ0FBQTtZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQyxFQUNELE9BQU8sRUFDUCwwQ0FBMEMsUUFBUSxFQUFFLENBQ3JELENBQUE7SUFFRCxPQUFPLHlCQUF5QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDNUMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFNO0lBQzVCLE9BQU8saUJBQWlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgd2FpdEZvciBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvd2FpdC1mb3IuanNcIlxuaW1wb3J0IHtCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5cbi8qKiBAdHlwZWRlZiB7e3N5c3RlbVRlc3Q6IG9iamVjdCwgdGVzdElkOiBzdHJpbmd9fSBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlck9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7e3RpbWVvdXQ/OiBudW1iZXIsIHVzZUJhc2VTZWxlY3Rvcj86IGJvb2xlYW59fSBIYXlhU2VsZWN0T3Blbk9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7e29wdGlvblRleHQ/OiBzdHJpbmcsIG9wdGlvblZhbHVlPzogc3RyaW5nIHwgbnVtYmVyLCBzZWFyY2g/OiBib29sZWFuLCB0aW1lb3V0PzogbnVtYmVyLCB1c2VCYXNlU2VsZWN0b3I/OiBib29sZWFufX0gUGlja0hheWFTZWxlY3RPcHRpb25PcHRpb25zICovXG4vKiogQHR5cGVkZWYge3tvcHRpb25WYWx1ZTogc3RyaW5nIHwgbnVtYmVyLCB0aW1lb3V0PzogbnVtYmVyfX0gQ2xpY2tWaXNpYmxlSGF5YVNlbGVjdE9wdGlvbk9wdGlvbnMgKi9cbi8qKiBAdHlwZWRlZiB7e3RpbWVvdXQ/OiBudW1iZXJ9fSBFeHBlY3RIYXlhU2VsZWN0Q3VycmVudE9wdGlvbnNPcHRpb25zICovXG4vKiogQHR5cGVkZWYge3t0aW1lb3V0PzogbnVtYmVyfX0gRXhwZWN0SGF5YVNlbGVjdE9wdGlvbnNDbG9zZWRPcHRpb25zICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBXZWJFbGVtZW50ICovXG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDUwMDBcblxuLyoqXG4gKiBTZWxlY3RzIGFuIG9wdGlvbiBpbiBhIEhheWFTZWxlY3QgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBXcmFwcGVyIGBkYXRhLXRlc3RpZGAgYXJvdW5kIHRoZSBzZWxlY3QuXG4gKiBAcGFyYW0ge1BpY2tIYXlhU2VsZWN0T3B0aW9uT3B0aW9uc30gb3B0aW9ucyBUZXh0L3ZhbHVlIHRvIGNob29zZSBhbmQgd2hldGhlciB0byB0eXBlIGludG8gdGhlIHNlYXJjaCBmaWVsZCBmaXJzdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIG1hdGNoaW5nIHZpc2libGUgb3B0aW9uIGlzIGNsaWNrZWQuXG4gKiBAcmVqZWN0cyB7RXJyb3J9IFdoZW4gbmVpdGhlciB0ZXh0IG5vciB2YWx1ZSBpcyBzdXBwbGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBpY2tIYXlhU2VsZWN0T3B0aW9uKHN5c3RlbVRlc3QsIHRlc3RJZCwge29wdGlvblRleHQsIG9wdGlvblZhbHVlLCBzZWFyY2ggPSBmYWxzZSwgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZX0pIHtcbiAgY29uc3QgaGVscGVyID0gbmV3IEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyKHtzeXN0ZW1UZXN0LCB0ZXN0SWR9KVxuICBjb25zdCBzZWxlY3RFbGVtZW50ID0gYXdhaXQgc3lzdGVtVGVzdC5maW5kKGhlbHBlci5zZWxlY3RDb250YWluZXJTZWxlY3Rvciwge3RpbWVvdXQsIHVzZUJhc2VTZWxlY3Rvcn0pXG4gIGF3YWl0IHNlbGVjdEVsZW1lbnQuY2xpY2soKVxuXG4gIGlmIChzZWFyY2gpIHtcbiAgICBpZiAoIW9wdGlvblRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3B0aW9uVGV4dCB3aGVuIHNlYXJjaGluZyAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaEVsZW1lbnQgPSBhd2FpdCBzeXN0ZW1UZXN0LmZpbmQoaGVscGVyLnNlYXJjaElucHV0U2VsZWN0b3IsIHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxuICAgIGF3YWl0IHNlYXJjaEVsZW1lbnQuc2VuZEtleXMob3B0aW9uVGV4dClcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IGhlbHBlci5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9uVmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBhd2FpdCBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVZhbHVlKHN5c3RlbVRlc3QsIG9wdGlvblZhbHVlLCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAob3B0aW9uVGV4dCkge1xuICAgIGF3YWl0IGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VGV4dChzeXN0ZW1UZXN0LCBvcHRpb25UZXh0LCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9wdGlvblZhbHVlIG9yIG9wdGlvblRleHQgZm9yICR7dGVzdElkfWApXG59XG5cbi8qKlxuICogQ2xpY2tzIGFuIG9wdGlvbiBpbiBhbiBhbHJlYWR5LW9wZW4gSGF5YVNlbGVjdCBkcm9wZG93bi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge0NsaWNrVmlzaWJsZUhheWFTZWxlY3RPcHRpb25PcHRpb25zfSBvcHRpb25zIE9wdGlvbiB2YWx1ZSB0byBjaG9vc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2tWaXNpYmxlSGF5YVNlbGVjdE9wdGlvbihzeXN0ZW1UZXN0LCB7b3B0aW9uVmFsdWUsIHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVR9KSB7XG4gIGF3YWl0IGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VmFsdWUoc3lzdGVtVGVzdCwgb3B0aW9uVmFsdWUsIHRpbWVvdXQpXG59XG5cbi8qKlxuICogT3BlbnMgYSBIYXlhU2VsZWN0IGluc3RhbmNlIGJ5IGNsaWNraW5nIGl0cyBzZWxlY3QgY29udGFpbmVyLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgV3JhcHBlciBgZGF0YS10ZXN0aWRgIGFyb3VuZCB0aGUgc2VsZWN0LlxuICogQHBhcmFtIHtIYXlhU2VsZWN0T3Blbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBzZWxlY3RvciBzY29wZSBhbmQgdGltZW91dC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIHNlbGVjdCBvcGVucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5IYXlhU2VsZWN0KHN5c3RlbVRlc3QsIHRlc3RJZCwge3RpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWV9ID0ge30pIHtcbiAgY29uc3QgaGVscGVyID0gbmV3IEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyKHtzeXN0ZW1UZXN0LCB0ZXN0SWR9KVxuXG4gIGF3YWl0IGhlbHBlci5vcGVuKHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxufVxuXG4vKipcbiAqIENsb3NlcyBhIEhheWFTZWxlY3QgaW5zdGFuY2UgYnkgY2xpY2tpbmcgaXRzIHNlbGVjdCBjb250YWluZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBXcmFwcGVyIGBkYXRhLXRlc3RpZGAgYXJvdW5kIHRoZSBzZWxlY3QuXG4gKiBAcGFyYW0ge0hheWFTZWxlY3RPcGVuT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbmFsIHNlbGVjdG9yIHNjb3BlIGFuZCB0aW1lb3V0LlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgc2VsZWN0IGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlSGF5YVNlbGVjdChzeXN0ZW1UZXN0LCB0ZXN0SWQsIHt0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VULCB1c2VCYXNlU2VsZWN0b3IgPSB0cnVlfSA9IHt9KSB7XG4gIGNvbnN0IGhlbHBlciA9IG5ldyBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcih7c3lzdGVtVGVzdCwgdGVzdElkfSlcblxuICBhd2FpdCBoZWxwZXIuY2xvc2Uoe3RpbWVvdXQsIHVzZUJhc2VTZWxlY3Rvcn0pXG59XG5cbi8qKlxuICogV2FpdHMgdW50aWwgYSBIYXlhU2VsZWN0IHJlbmRlcnMgZXhhY3RseSB0aGUgZXhwZWN0ZWQgY3VycmVudC1vcHRpb24gbGFiZWxzLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgV3JhcHBlciBgZGF0YS10ZXN0aWRgIGFyb3VuZCB0aGUgc2VsZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXhwZWN0ZWRUZXh0cyBDdXJyZW50IG9wdGlvbiB0ZXh0IGZyYWdtZW50cyBpbiByZW5kZXJlZCBvcmRlci5cbiAqIEBwYXJhbSB7RXhwZWN0SGF5YVNlbGVjdEN1cnJlbnRPcHRpb25zT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbmFsIFNlbGVuaXVtIHRpbWVvdXQgb3ZlcnJpZGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBjdXJyZW50IG9wdGlvbnMgbWF0Y2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBlY3RIYXlhU2VsZWN0Q3VycmVudE9wdGlvbnMoc3lzdGVtVGVzdCwgdGVzdElkLCBleHBlY3RlZFRleHRzLCB7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVH0gPSB7fSkge1xuICBjb25zdCBzZWxlY3RvciA9IGAke3Rlc3RJZFNlbGVjdG9yKHRlc3RJZCl9IFtkYXRhLXRlc3RpZD1cImhheWEtc2VsZWN0L2N1cnJlbnQtb3B0aW9uXCJdYFxuICBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLndhaXQoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCBzeXN0ZW1UZXN0LmdldERyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3Moc2VsZWN0b3IpKVxuICAgICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICAgIGNvbnN0IHZpc2libGVUZXh0cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgICAgdmlzaWJsZVRleHRzLnB1c2goYXdhaXQgZWxlbWVudC5nZXRUZXh0KCkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZpc2libGVUZXh0cy5sZW5ndGggIT09IGV4cGVjdGVkVGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhwZWN0ZWRUZXh0cy5ldmVyeSgoZXhwZWN0ZWRUZXh0LCBpbmRleCkgPT4gdmlzaWJsZVRleHRzW2luZGV4XT8uaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSlcbiAgICB9LFxuICAgIHRpbWVvdXQsXG4gICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke3Rlc3RJZH0gY3VycmVudCBvcHRpb25zOiAke2V4cGVjdGVkVGV4dHMuam9pbihcIiwgXCIpfWBcbiAgKVxufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGEgSGF5YVNlbGVjdCBhbmQgaXRzIHBvcnRhbC1yZW5kZXJlZCBvcHRpb25zIGFyZSBjbG9zZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gc3lzdGVtVGVzdCBCcm93c2VyIHNlc3Npb24gdXNlZCBieSB0aGUgcnVubmluZyBzcGVjLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBXcmFwcGVyIGBkYXRhLXRlc3RpZGAgYXJvdW5kIHRoZSBzZWxlY3QuXG4gKiBAcGFyYW0ge0V4cGVjdEhheWFTZWxlY3RPcHRpb25zQ2xvc2VkT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbmFsIFNlbGVuaXVtIHRpbWVvdXQgb3ZlcnJpZGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIG5vIHZpc2libGUgb3B0aW9ucyByZW1haW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBlY3RIYXlhU2VsZWN0T3B0aW9uc0Nsb3NlZChzeXN0ZW1UZXN0LCB0ZXN0SWQsIHt0aW1lb3V0ID0gREVGQVVMVF9USU1FT1VUfSA9IHt9KSB7XG4gIGNvbnN0IGhlbHBlciA9IG5ldyBIYXlhU2VsZWN0U3lzdGVtVGVzdEhlbHBlcih7c3lzdGVtVGVzdCwgdGVzdElkfSlcblxuICBhd2FpdCBoZWxwZXIuZXhwZWN0Q2xvc2VkKHt0aW1lb3V0fSlcbn1cblxuLyoqXG4gKiBTeXN0ZW0gdGVzdCBoZWxwZXIgZm9yIGludGVyYWN0aW5nIHdpdGggSGF5YVNlbGVjdCBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhheWFTZWxlY3RTeXN0ZW1UZXN0SGVscGVyIHtcbiAgLyoqIEBwYXJhbSB7SGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXJPcHRpb25zfSBvcHRpb25zICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXIsIGdvdDogJHtvcHRpb25zfWApXG4gICAgfVxuXG4gICAgY29uc3Qge3N5c3RlbVRlc3QsIHRlc3RJZCwgLi4ucmVzdEFyZ3N9ID0gb3B0aW9uc1xuICAgIGNvbnN0IGV4dHJhS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3B0aW9ucyBmb3IgSGF5YVNlbGVjdFN5c3RlbVRlc3RIZWxwZXI6ICR7ZXh0cmFLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuc3lzdGVtVGVzdCA9IHN5c3RlbVRlc3RcbiAgICB0aGlzLnRlc3RJZCA9IHRlc3RJZFxuICAgIHRoaXMucm9vdFNlbGVjdG9yID0gdGVzdElkU2VsZWN0b3IodGVzdElkKVxuICAgIHRoaXMuY29tcG9uZW50U2VsZWN0b3IgPSBgJHt0aGlzLnJvb3RTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdCddYFxuICAgIHRoaXMuY2hldnJvbkNvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3QvY2hldnJvbi1jb250YWluZXInXWBcbiAgICB0aGlzLnNlbGVjdENvbnRhaW5lclNlbGVjdG9yID0gYCR7dGhpcy5yb290U2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvc2VsZWN0LWNvbnRhaW5lciddYFxuICAgIHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvciA9IGAke3RoaXMucm9vdFNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L3NlYXJjaC1pbnB1dCddYFxuICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yRmFsbGJhY2sgPSBcIltkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9ucy1jb250YWluZXInXVwiXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIYXlhU2VsZWN0T3Blbk9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25hbCBzZWxlY3RvciBzY29wZSBhbmQgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IENvbXBsZXRlcyBhZnRlciB0aGUgc2VsZWN0IG9wZW5zLlxuICAgKi9cbiAgYXN5bmMgb3Blbih7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZX0gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY2xpY2tTZWxlY3RDb250YWluZXIoe3RpbWVvdXQsIHVzZUJhc2VTZWxlY3Rvcn0pXG4gICAgdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gbnVsbFxuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9wZW5lZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7dGhpcy5jb21wb25lbnRTZWxlY3Rvcn1bZGF0YS1vcGVuZWQ9J3RydWUnXWApXG5cbiAgICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIG9wZW46ICR7dGhpcy50ZXN0SWR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SGF5YVNlbGVjdE9wZW5PcHRpb25zfSBbb3B0aW9uc10gT3B0aW9uYWwgc2VsZWN0b3Igc2NvcGUgYW5kIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIHNlbGVjdCBjbG9zZXMuXG4gICAqL1xuICBhc3luYyBjbG9zZSh7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZX0gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY2xpY2tTZWxlY3RDb250YWluZXIoe3RpbWVvdXQsIHVzZUJhc2VTZWxlY3Rvcn0pXG5cbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgICAgaWYgKG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBIYXlhU2VsZWN0IHRvIGNsb3NlOiAke3RoaXMudGVzdElkfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4cGVjdEhheWFTZWxlY3RPcHRpb25zQ2xvc2VkT3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgbm8gdmlzaWJsZSBvcHRpb25zIHJlbWFpbi5cbiAgICovXG4gIGFzeW5jIGV4cGVjdENsb3NlZCh7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVH0gPSB7fSkge1xuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXR9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICBjb25zdCBvcGVuID0gYXdhaXQgdGhpcy5pc09wZW4oKVxuICAgICAgY29uc3QgdmlzaWJsZUNvbnRhaW5lcnNDb3VudCA9IGF3YWl0IHRoaXMudmlzaWJsZUVsZW1lbnRzQ291bnQob3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKVxuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnNDb3VudCA9IGF3YWl0IHRoaXMudmlzaWJsZUVsZW1lbnRzQ291bnQoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddYClcblxuICAgICAgaWYgKG9wZW4gfHwgdmlzaWJsZUNvbnRhaW5lcnNDb3VudCA+IDAgfHwgdmlzaWJsZU9wdGlvbnNDb3VudCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke3RoaXMudGVzdElkfSBvcHRpb25zIHRvIGNsb3NlLCBnb3Qgb3Blbj0ke29wZW59LCB2aXNpYmxlQ29udGFpbmVycz0ke3Zpc2libGVDb250YWluZXJzQ291bnR9LCB2aXNpYmxlT3B0aW9ucz0ke3Zpc2libGVPcHRpb25zQ291bnR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAqL1xuICBhc3luYyBpc09wZW4oKSB7XG4gICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcblxuICAgIGlmIChvcGVuZWRFbGVtZW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgc2VhcmNoSW5wdXRzID0gYXdhaXQgdGhpcy5maW5kVmlzaWJsZUVsZW1lbnRzKHRoaXMuc2VhcmNoSW5wdXRTZWxlY3RvcilcblxuICAgIHJldHVybiBzZWFyY2hJbnB1dHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SGF5YVNlbGVjdE9wZW5PcHRpb25zfSBbb3B0aW9uc10gT3B0aW9uYWwgc2VsZWN0b3Igc2NvcGUgYW5kIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIHNlbGVjdCBjb250YWluZXIgY2xpY2suXG4gICAqL1xuICBhc3luYyBjbGlja1NlbGVjdENvbnRhaW5lcih7dGltZW91dCA9IERFRkFVTFRfVElNRU9VVCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZX0gPSB7fSkge1xuICAgIGNvbnN0IHNlbGVjdENvbnRhaW5lciA9IGF3YWl0IHRoaXMuc3lzdGVtVGVzdC5maW5kKHRoaXMuc2VsZWN0Q29udGFpbmVyU2VsZWN0b3IsIHt0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3J9KVxuXG4gICAgYXdhaXQgc2VsZWN0Q29udGFpbmVyLmNsaWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRFbGVtZW50cyhzZWxlY3Rvcikge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhzZWxlY3RvcikpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pj59XG4gICAqL1xuICBhc3luYyBmaW5kVmlzaWJsZUVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhzZWxlY3RvcilcbiAgICBjb25zdCB2aXNpYmxlRWxlbWVudHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICBpZiAoYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpKSB7XG4gICAgICAgIHZpc2libGVFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpc2libGVFbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB2aXNpYmxlIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvciBpbiBicm93c2VyIGxheW91dCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIENTUyBzZWxlY3RvciB0byBjb3VudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gTnVtYmVyIG9mIHZpc2libGUgZWxlbWVudHMuXG4gICAqL1xuICBhc3luYyB2aXNpYmxlRWxlbWVudHNDb3VudChzZWxlY3Rvcikge1xuICAgIHJldHVybiBOdW1iZXIoXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcbiAgICAgICAgYFxuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYXJndW1lbnRzWzBdKSkuZmlsdGVyKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm4gc3R5bGUuZGlzcGxheSAhPT0gXCJub25lXCIgJiYgc3R5bGUudmlzaWJpbGl0eSAhPT0gXCJoaWRkZW5cIiAmJiBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID4gMFxuICAgICAgICAgIH0pLmxlbmd0aFxuICAgICAgICBgLFxuICAgICAgICBzZWxlY3RvclxuICAgICAgKVxuICAgIClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvcikgcmV0dXJuIHRoaXMuX29wdGlvbnNDb250YWluZXJTZWxlY3RvclxuXG4gICAgY29uc3Qgb3BlbmVkRWxlbWVudHMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHt0aGlzLmNvbXBvbmVudFNlbGVjdG9yfVtkYXRhLW9wZW5lZD0ndHJ1ZSddYClcbiAgICBjb25zdCBjb21wb25lbnRFbGVtZW50cyA9IG9wZW5lZEVsZW1lbnRzLmxlbmd0aCA+IDAgPyBvcGVuZWRFbGVtZW50cyA6IGF3YWl0IHRoaXMuZmluZFZpc2libGVFbGVtZW50cyh0aGlzLmNvbXBvbmVudFNlbGVjdG9yKVxuICAgIGNvbnN0IGlkID0gY29tcG9uZW50RWxlbWVudHMubGVuZ3RoID4gMCA/IGF3YWl0IGNvbXBvbmVudEVsZW1lbnRzWzBdLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIikgOiBudWxsXG5cbiAgICB0aGlzLl9vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBpZCA/IGBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbnMtY29udGFpbmVyJ11bZGF0YS1pZD1cIiR7Y3NzQXR0cmlidXRlVmFsdWUoaWQpfVwiXWAgOiB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvckZhbGxiYWNrXG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAqL1xuICBhc3luYyBvcHRpb25UZXh0cygpIHtcbiAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXWApXG5cbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwob3B0aW9ucy5tYXAoYXN5bmMgKG9wdGlvbikgPT4gKGF3YWl0IG9wdGlvbi5nZXRUZXh0KCkpLnRyaW0oKSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7aW5kZXg/OiBudW1iZXIsIHRleHQ/OiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nfG51bWJlcn19IGNyaXRlcmlhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2VsZWN0T3B0aW9uKHtpbmRleCwgdGV4dCwgdmFsdWUsIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGNyaXRlcmlhIGZvciBzZWxlY3RPcHRpb24sIGdvdDogdW5kZWZpbmVkXCIpXG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzZWxlY3RPcHRpb24gY3JpdGVyaWE6ICR7ZXh0cmFLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogNTAwMH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID0gYXdhaXQgdGhpcy5vcHRpb25zQ29udGFpbmVyU2VsZWN0b3IoKVxuICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5maW5kRWxlbWVudHMoYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBbZGF0YS10ZXN0aWQ9J2hheWEtc2VsZWN0L29wdGlvbiddW2RhdGEtdmFsdWU9XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKX1cIl1gKVxuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zWzBdXG5cbiAgICAgICAgaWYgKCFvcHRpb24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBmb3IgdmFsdWU6ICR7dmFsdWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbmRleCA9PSBcIm51bWJlclwiKSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiA1MDAwfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBhd2FpdCB0aGlzLm9wdGlvbnNDb250YWluZXJTZWxlY3RvcigpXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmZpbmRFbGVtZW50cyhgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IFtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gKVxuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zW2luZGV4XVxuXG4gICAgICAgIGlmICghb3B0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiBhdCBpbmRleDogJHtpbmRleH1gKVxuXG4gICAgICAgIGF3YWl0IG9wdGlvbi5jbGljaygpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IDUwMDB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IGF3YWl0IHRoaXMub3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yKClcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZmluZEVsZW1lbnRzKGAke29wdGlvbnNDb250YWluZXJTZWxlY3Rvcn0gW2RhdGEtdGVzdGlkPSdoYXlhLXNlbGVjdC9vcHRpb24nXWApXG5cbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IG9wdGlvblRleHQgPSAoYXdhaXQgb3B0aW9uLmdldFRleHQoKSkudHJpbSgpXG5cbiAgICAgICAgICBpZiAob3B0aW9uVGV4dCA9PT0gdGV4dCkge1xuICAgICAgICAgICAgYXdhaXQgb3B0aW9uLmNsaWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb3B0aW9uIGZvdW5kIHdpdGggdGV4dDogJHt0ZXh0fWApXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFsdWUsIHRleHQsIG9yIGluZGV4IHdoZW4gc2VsZWN0aW5nIGFuIG9wdGlvblwiKVxuICB9XG59XG5cbi8qKlxuICogQ2xpY2tzIGEgdmlzaWJsZSBIYXlhU2VsZWN0IG9wdGlvbiBieSBiYWNrZW5kIHZhbHVlLlxuICogQHBhcmFtIHtvYmplY3R9IHN5c3RlbVRlc3QgQnJvd3NlciBzZXNzaW9uIHVzZWQgYnkgdGhlIHJ1bm5pbmcgc3BlYy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBvcHRpb25WYWx1ZSBCYWNrZW5kIHZhbHVlIHN0b3JlZCBpbiBgZGF0YS12YWx1ZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBNYXhpbXVtIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3JdIE9wdGlvbnMgY29udGFpbmVyIHNlbGVjdG9yIHRvIHNjb3BlIHRoZSBsb29rdXAuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQ29tcGxldGVzIGFmdGVyIHRoZSBtYXRjaGluZyB2aXNpYmxlIG9wdGlvbiBpcyBjbGlja2VkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGlja1Zpc2libGVTZWxlY3RPcHRpb25CeVZhbHVlKHN5c3RlbVRlc3QsIG9wdGlvblZhbHVlLCB0aW1lb3V0LCBvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPSBcIlwiKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yID8gYCR7b3B0aW9uc0NvbnRhaW5lclNlbGVjdG9yfSBgIDogXCJcIn1bZGF0YS10ZXN0aWQ9XCJoYXlhLXNlbGVjdC9vcHRpb25cIl1bZGF0YS12YWx1ZT1cIiR7Y3NzQXR0cmlidXRlVmFsdWUob3B0aW9uVmFsdWUpfVwiXWBcbiAgY29uc3QgZWxlbWVudCA9IGF3YWl0IGZpbmRWaXNpYmxlRWxlbWVudChzeXN0ZW1UZXN0LCBzZWxlY3RvciwgdGltZW91dClcbiAgYXdhaXQgZWxlbWVudC5jbGljaygpXG59XG5cbi8qKlxuICogQ2xpY2tzIGEgdmlzaWJsZSBIYXlhU2VsZWN0IG9wdGlvbiBieSBkaXNwbGF5ZWQgdGV4dC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFZpc2libGUgZnJhZ21lbnQgcmVuZGVyZWQgYnkgdGhlIG9wdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IE1heGltdW0gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnNDb250YWluZXJTZWxlY3Rvcl0gT3B0aW9ucyBjb250YWluZXIgc2VsZWN0b3IgdG8gc2NvcGUgdGhlIGxvb2t1cC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBDb21wbGV0ZXMgYWZ0ZXIgdGhlIG1hdGNoaW5nIHZpc2libGUgb3B0aW9uIGlzIGNsaWNrZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrVmlzaWJsZVNlbGVjdE9wdGlvbkJ5VGV4dChzeXN0ZW1UZXN0LCBleHBlY3RlZFRleHQsIHRpbWVvdXQsIG9wdGlvbnNDb250YWluZXJTZWxlY3RvciA9IFwiXCIpIHtcbiAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7V2ViRWxlbWVudH0gKi8gKFxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0RHJpdmVyKCkud2FpdChcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3IgPyBgJHtvcHRpb25zQ29udGFpbmVyU2VsZWN0b3J9IGAgOiBcIlwifVtkYXRhLXRlc3RpZD0naGF5YS1zZWxlY3Qvb3B0aW9uJ11gXG4gICAgICAgIGNvbnN0IG9wdGlvbkVsZW1lbnRzID0gYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcblxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbkVsZW1lbnQgb2Ygb3B0aW9uRWxlbWVudHMpIHtcbiAgICAgICAgICBpZiAoIShhd2FpdCBvcHRpb25FbGVtZW50LmlzRGlzcGxheWVkKCkpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBvcHRpb25FbGVtZW50LmdldFRleHQoKVxuICAgICAgICAgIGlmIChhY3R1YWxUZXh0LmluY2x1ZGVzKGV4cGVjdGVkVGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25FbGVtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9LFxuICAgICAgdGltZW91dCxcbiAgICAgIGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdmlzaWJsZSBzZWxlY3Qgb3B0aW9uIHRleHQgJHtleHBlY3RlZFRleHR9YFxuICAgIClcbiAgKVxuXG4gIGF3YWl0IGVsZW1lbnQuY2xpY2soKVxufVxuXG4vKipcbiAqIEZpbmRzIGEgdmlzaWJsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7b2JqZWN0fSBzeXN0ZW1UZXN0IEJyb3dzZXIgc2Vzc2lvbiB1c2VkIGJ5IHRoZSBydW5uaW5nIHNwZWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgQ1NTIHF1ZXJ5IHRoYXQgY2FuIG1hdGNoIG9uZSBvciBtb3JlIG5vZGVzLlxuICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgTWF4aW11bSB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFdlYkVsZW1lbnQ+fSBGaXJzdCBkaXNwbGF5ZWQgbWF0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRWaXNpYmxlRWxlbWVudChzeXN0ZW1UZXN0LCBzZWxlY3RvciwgdGltZW91dCkge1xuICBjb25zdCBlbGVtZW50ID0gYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS53YWl0KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgc3lzdGVtVGVzdC5nZXREcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKHNlbGVjdG9yKSlcblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKCkpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgdGltZW91dCxcbiAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHZpc2libGUgc2VsZWN0b3IgJHtzZWxlY3Rvcn1gXG4gIClcblxuICByZXR1cm4gLyoqIEB0eXBlIHtXZWJFbGVtZW50fSAqLyAoZWxlbWVudClcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkYXRhLXRlc3RpZCBDU1Mgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFJhdyB2YWx1ZSBmcm9tIHRoZSBjb21wb25lbnQncyBgdGVzdElEYCBwcm9wLlxuICogQHJldHVybnMge3N0cmluZ30gQXR0cmlidXRlIHNlbGVjdG9yIGZvciB0aGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHRlc3RJZFNlbGVjdG9yKHRlc3RJZCkge1xuICByZXR1cm4gYFtkYXRhLXRlc3RpZD1cIiR7Y3NzQXR0cmlidXRlVmFsdWUodGVzdElkKX1cIl1gXG59XG5cbi8qKlxuICogRXNjYXBlcyBhIHZhbHVlIGZvciB1c2UgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIFJhdyBhdHRyaWJ1dGUgdmFsdWUgdG8gaW50ZXJwb2xhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmcgc2FmZSBmb3IgYSBkb3VibGUtcXVvdGVkIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gY3NzQXR0cmlidXRlVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZUFsbChcIlxcXFxcIiwgXCJcXFxcXFxcXFwiKS5yZXBsYWNlQWxsKCdcIicsICdcXFxcXCInKVxufVxuIl19
|