appium-android-driver 4.48.1 → 4.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/android-helpers.js +52 -38
- package/build/lib/commands/app-management.js +15 -1
- package/build/lib/commands/execute.js +4 -2
- package/build/lib/commands/general.js +21 -33
- package/build/lib/commands/intent.js +5 -1
- package/build/lib/desired-caps.js +8 -1
- package/build/lib/unlock-helpers.js +85 -104
- package/build/lib/webview-helpers.js +8 -4
- package/lib/android-helpers.js +53 -34
- package/lib/commands/app-management.js +19 -0
- package/lib/commands/execute.js +4 -0
- package/lib/commands/general.js +34 -21
- package/lib/commands/intent.js +9 -0
- package/lib/desired-caps.js +7 -0
- package/lib/unlock-helpers.js +99 -96
- package/lib/webview-helpers.js +9 -6
- package/package.json +2 -2
|
@@ -29,103 +29,77 @@ const FINGERPRINT_UNLOCK = 'fingerprint';
|
|
|
29
29
|
exports.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;
|
|
30
30
|
const UNLOCK_TYPES = [PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK];
|
|
31
31
|
const KEYCODE_NUMPAD_ENTER = 66;
|
|
32
|
-
const KEYCODE_POWER = 26;
|
|
33
|
-
const KEYCODE_WAKEUP = 224;
|
|
34
32
|
const UNLOCK_WAIT_TIME = 100;
|
|
35
|
-
const HIDE_KEYBOARD_WAIT_TIME = 100;
|
|
36
33
|
const INPUT_KEYS_WAIT_TIME = 100;
|
|
37
34
|
const NUMBER_ZERO_KEYCODE = 7;
|
|
38
|
-
|
|
35
|
+
const helpers = {};
|
|
39
36
|
exports.helpers = helpers;
|
|
40
37
|
|
|
41
|
-
helpers.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (_lodash.default.isUndefined(key)) {
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
38
|
+
helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps = {}) {
|
|
39
|
+
const {
|
|
40
|
+
unlockKey,
|
|
41
|
+
unlockType
|
|
42
|
+
} = caps;
|
|
49
43
|
|
|
50
|
-
if (
|
|
51
|
-
|
|
44
|
+
if (_lodash.default.isNil(unlockKey) || unlockKey === '') {
|
|
45
|
+
throw new Error('A non-empty unlock key value must be provided');
|
|
52
46
|
}
|
|
53
47
|
|
|
54
|
-
if (
|
|
55
|
-
if (!/^[
|
|
56
|
-
|
|
48
|
+
if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {
|
|
49
|
+
if (!/^[0-9]+$/.test(_lodash.default.trim(unlockKey))) {
|
|
50
|
+
throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);
|
|
51
|
+
}
|
|
52
|
+
} else if (unlockType === PATTERN_UNLOCK) {
|
|
53
|
+
if (!/^[1-9]{2,9}$/.test(_lodash.default.trim(unlockKey))) {
|
|
54
|
+
throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);
|
|
57
55
|
}
|
|
58
56
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
|
|
57
|
+
if (/([1-9]).*?\1/.test(_lodash.default.trim(unlockKey))) {
|
|
58
|
+
throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);
|
|
59
|
+
}
|
|
60
|
+
} else if (unlockType === PASSWORD_UNLOCK) {
|
|
61
|
+
if (!/.{4,}/g.test(unlockKey)) {
|
|
62
|
+
throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
throw new Error(`Invalid unlock type '${unlockType}'. ` + `Only the following unlock types are supported: ${UNLOCK_TYPES}`);
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
|
|
68
|
+
return caps;
|
|
67
69
|
};
|
|
68
70
|
|
|
69
|
-
helpers.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
let isKeyboardShown = await driver.isKeyboardShown();
|
|
75
|
-
|
|
76
|
-
if (isKeyboardShown) {
|
|
77
|
-
await driver.hideKeyboard();
|
|
78
|
-
await (0, _asyncbox.sleep)(HIDE_KEYBOARD_WAIT_TIME);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
_logger.default.info('Dismiss notifications from unlock view');
|
|
71
|
+
helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
|
|
72
|
+
const {
|
|
73
|
+
credential,
|
|
74
|
+
credentialType
|
|
75
|
+
} = opts;
|
|
82
76
|
|
|
83
|
-
|
|
84
|
-
await adb.back();
|
|
77
|
+
_logger.default.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);
|
|
85
78
|
|
|
86
|
-
|
|
87
|
-
_logger.default.info('Trying to dismiss keyguard');
|
|
79
|
+
const wasLockEnabled = await adb.isLockEnabled();
|
|
88
80
|
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
if (wasLockEnabled) {
|
|
82
|
+
await adb.clearLockCredential(credential);
|
|
83
|
+
await adb.cycleWakeUp();
|
|
84
|
+
} else {
|
|
85
|
+
_logger.default.info('No active lock has been detected. Proceeding to the keyguard dismissal');
|
|
91
86
|
}
|
|
92
87
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
helpers.swipeUp = async function swipeUp(driver) {
|
|
99
|
-
let windowSize = await driver.getWindowSize();
|
|
100
|
-
let x0 = parseInt(windowSize.x / 2, 10);
|
|
101
|
-
let y0 = windowSize.y - 10;
|
|
102
|
-
let yP = 100;
|
|
103
|
-
let actions = [{
|
|
104
|
-
action: 'press',
|
|
105
|
-
options: {
|
|
106
|
-
element: null,
|
|
107
|
-
x: x0,
|
|
108
|
-
y: y0
|
|
109
|
-
}
|
|
110
|
-
}, {
|
|
111
|
-
action: 'moveTo',
|
|
112
|
-
options: {
|
|
113
|
-
element: null,
|
|
114
|
-
x: x0,
|
|
115
|
-
y: yP
|
|
88
|
+
try {
|
|
89
|
+
await adb.dismissKeyguard();
|
|
90
|
+
} finally {
|
|
91
|
+
if (wasLockEnabled) {
|
|
92
|
+
await adb.setLockCredential(credentialType, credential);
|
|
116
93
|
}
|
|
117
|
-
}
|
|
118
|
-
action: 'release'
|
|
119
|
-
}];
|
|
120
|
-
await driver.performTouch(actions);
|
|
94
|
+
}
|
|
121
95
|
};
|
|
122
96
|
|
|
123
97
|
helpers.encodePassword = function encodePassword(key) {
|
|
124
|
-
return key
|
|
98
|
+
return `${key}`.replace(/\s/ig, '%s');
|
|
125
99
|
};
|
|
126
100
|
|
|
127
101
|
helpers.stringKeyToArr = function stringKeyToArr(key) {
|
|
128
|
-
return key
|
|
102
|
+
return `${key}`.trim().replace(/\s+/g, '').split(/\s*/);
|
|
129
103
|
};
|
|
130
104
|
|
|
131
105
|
helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabilities) {
|
|
@@ -140,30 +114,30 @@ helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabi
|
|
|
140
114
|
helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
|
|
141
115
|
_logger.default.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);
|
|
142
116
|
|
|
143
|
-
await
|
|
144
|
-
|
|
117
|
+
await adb.dismissKeyguard();
|
|
118
|
+
const keys = helpers.stringKeyToArr(capabilities.unlockKey);
|
|
145
119
|
|
|
146
120
|
if ((await adb.getApiLevel()) >= 21) {
|
|
147
|
-
|
|
121
|
+
const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);
|
|
148
122
|
|
|
149
123
|
if (_lodash.default.isEmpty(els)) {
|
|
150
124
|
return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
|
|
151
125
|
}
|
|
152
126
|
|
|
153
|
-
|
|
127
|
+
const pins = {};
|
|
154
128
|
|
|
155
|
-
for (
|
|
156
|
-
|
|
129
|
+
for (const el of els) {
|
|
130
|
+
const text = await driver.getAttribute('text', _appiumSupport.util.unwrapElement(el));
|
|
157
131
|
pins[text] = el;
|
|
158
132
|
}
|
|
159
133
|
|
|
160
|
-
for (
|
|
161
|
-
|
|
134
|
+
for (const pin of keys) {
|
|
135
|
+
const el = pins[pin];
|
|
162
136
|
await driver.click(_appiumSupport.util.unwrapElement(el));
|
|
163
137
|
}
|
|
164
138
|
} else {
|
|
165
|
-
for (
|
|
166
|
-
|
|
139
|
+
for (const pin of keys) {
|
|
140
|
+
const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);
|
|
167
141
|
|
|
168
142
|
if (el === null) {
|
|
169
143
|
return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
|
|
@@ -173,24 +147,24 @@ helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
|
|
|
173
147
|
}
|
|
174
148
|
}
|
|
175
149
|
|
|
176
|
-
await waitForUnlock(adb
|
|
150
|
+
await waitForUnlock(adb);
|
|
177
151
|
};
|
|
178
152
|
|
|
179
|
-
async function waitForUnlock(adb
|
|
153
|
+
async function waitForUnlock(adb) {
|
|
180
154
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
181
155
|
|
|
182
156
|
if (!(await adb.isScreenLocked())) {
|
|
183
157
|
return;
|
|
184
158
|
}
|
|
185
159
|
|
|
186
|
-
await
|
|
160
|
+
await adb.keyevent(KEYCODE_NUMPAD_ENTER);
|
|
187
161
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
188
162
|
}
|
|
189
163
|
|
|
190
164
|
helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver, capabilities) {
|
|
191
165
|
_logger.default.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);
|
|
192
166
|
|
|
193
|
-
await
|
|
167
|
+
await adb.dismissKeyguard();
|
|
194
168
|
const keys = helpers.stringKeyToArr(capabilities.unlockKey);
|
|
195
169
|
|
|
196
170
|
for (const pin of keys) {
|
|
@@ -201,11 +175,14 @@ helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver
|
|
|
201
175
|
};
|
|
202
176
|
|
|
203
177
|
helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities) {
|
|
204
|
-
|
|
178
|
+
const {
|
|
179
|
+
unlockKey
|
|
180
|
+
} = capabilities;
|
|
181
|
+
|
|
182
|
+
_logger.default.info(`Trying to unlock device using password ${unlockKey}`);
|
|
205
183
|
|
|
206
|
-
await
|
|
207
|
-
|
|
208
|
-
key = helpers.encodePassword(key);
|
|
184
|
+
await adb.dismissKeyguard();
|
|
185
|
+
const key = helpers.encodePassword(unlockKey);
|
|
209
186
|
await adb.shell(['input', 'text', key]);
|
|
210
187
|
await (0, _asyncbox.sleep)(INPUT_KEYS_WAIT_TIME);
|
|
211
188
|
await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);
|
|
@@ -227,11 +204,11 @@ helpers.getPatternKeyPosition = function getPatternKeyPosition(key, initPos, pie
|
|
|
227
204
|
};
|
|
228
205
|
|
|
229
206
|
helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
230
|
-
|
|
207
|
+
const actions = [];
|
|
231
208
|
let lastPos;
|
|
232
209
|
|
|
233
210
|
for (let key of keys) {
|
|
234
|
-
|
|
211
|
+
const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);
|
|
235
212
|
|
|
236
213
|
if (key === keys[0]) {
|
|
237
214
|
actions.push({
|
|
@@ -246,11 +223,11 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
|
246
223
|
continue;
|
|
247
224
|
}
|
|
248
225
|
|
|
249
|
-
|
|
226
|
+
const moveTo = {
|
|
250
227
|
x: 0,
|
|
251
228
|
y: 0
|
|
252
229
|
};
|
|
253
|
-
|
|
230
|
+
const diffX = keyPos.x - lastPos.x;
|
|
254
231
|
|
|
255
232
|
if (diffX > 0) {
|
|
256
233
|
moveTo.x = piece;
|
|
@@ -266,7 +243,7 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
|
266
243
|
}
|
|
267
244
|
}
|
|
268
245
|
|
|
269
|
-
|
|
246
|
+
const diffY = keyPos.y - lastPos.y;
|
|
270
247
|
|
|
271
248
|
if (diffY > 0) {
|
|
272
249
|
moveTo.y = piece;
|
|
@@ -300,15 +277,19 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
|
300
277
|
};
|
|
301
278
|
|
|
302
279
|
helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
280
|
+
const {
|
|
281
|
+
unlockKey
|
|
282
|
+
} = capabilities;
|
|
283
|
+
|
|
284
|
+
_logger.default.info(`Trying to unlock device using pattern ${unlockKey}`);
|
|
285
|
+
|
|
286
|
+
await adb.dismissKeyguard();
|
|
287
|
+
const keys = helpers.stringKeyToArr(unlockKey);
|
|
288
|
+
const apiLevel = await adb.getApiLevel();
|
|
289
|
+
const el = await driver.findElOrEls('id', `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`, false);
|
|
290
|
+
const initPos = await driver.getLocation(_appiumSupport.util.unwrapElement(el));
|
|
291
|
+
const size = await driver.getSize(_appiumSupport.util.unwrapElement(el));
|
|
292
|
+
const actions = helpers.getPatternActions(keys, initPos, size.width / 3);
|
|
312
293
|
await driver.performTouch(actions);
|
|
313
294
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
314
295
|
};
|
|
@@ -322,4 +303,4 @@ var _default = helpers;
|
|
|
322
303
|
exports.default = _default;require('source-map-support').install();
|
|
323
304
|
|
|
324
305
|
|
|
325
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91bmxvY2staGVscGVycy5qcyJdLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiS0VZQ09ERV9QT1dFUiIsIktFWUNPREVfV0FLRVVQIiwiVU5MT0NLX1dBSVRfVElNRSIsIkhJREVfS0VZQk9BUkRfV0FJVF9USU1FIiwiSU5QVVRfS0VZU19XQUlUX1RJTUUiLCJOVU1CRVJfWkVST19LRVlDT0RFIiwiaGVscGVycyIsImlzVmFsaWRVbmxvY2tUeXBlIiwidHlwZSIsImluY2x1ZGVzIiwiaXNWYWxpZEtleSIsImtleSIsIl8iLCJpc1VuZGVmaW5lZCIsInRlc3QiLCJ0cmltIiwiRXJyb3IiLCJkaXNtaXNzS2V5Z3VhcmQiLCJkcml2ZXIiLCJhZGIiLCJsb2dnZXIiLCJpbmZvIiwicHJlc3NLZXlDb2RlIiwiaXNLZXlib2FyZFNob3duIiwiaGlkZUtleWJvYXJkIiwic2hlbGwiLCJiYWNrIiwiZ2V0QXBpTGV2ZWwiLCJzd2lwZVVwIiwid2luZG93U2l6ZSIsImdldFdpbmRvd1NpemUiLCJ4MCIsInBhcnNlSW50IiwieCIsInkwIiwieSIsInlQIiwiYWN0aW9ucyIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwicGVyZm9ybVRvdWNoIiwiZW5jb2RlUGFzc3dvcmQiLCJyZXBsYWNlIiwic3RyaW5nS2V5VG9BcnIiLCJzcGxpdCIsImZpbmdlcnByaW50VW5sb2NrIiwiY2FwYWJpbGl0aWVzIiwiZmluZ2VycHJpbnQiLCJ1bmxvY2tLZXkiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwiTWF0aCIsInJvdW5kIiwieVBvcyIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsaUJBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxVQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsU0FBdkI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsYUFBM0I7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLENBQUNMLFVBQUQsRUFBYUMsb0JBQWIsRUFBbUNDLGVBQW5DLEVBQW9EQyxjQUFwRCxFQUFvRUMsa0JBQXBFLENBQXJCO0FBQ0EsTUFBTUUsb0JBQW9CLEdBQUcsRUFBN0I7QUFDQSxNQUFNQyxhQUFhLEdBQUcsRUFBdEI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsR0FBdkI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxHQUF6QjtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEdBQWhDO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsR0FBN0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUE1QjtBQUVBLElBQUlDLE9BQU8sR0FBRyxFQUFkOzs7QUFDQUEsT0FBTyxDQUFDQyxpQkFBUixHQUE0QixTQUFTQSxpQkFBVCxDQUE0QkMsSUFBNUIsRUFBa0M7QUFDNUQsU0FBT1YsWUFBWSxDQUFDVyxR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b2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS107XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgS0VZQ09ERV9QT1dFUiA9IDI2O1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7IC8vIENhbiB3b3JrIG92ZXIgQVBJIExldmVsIDIwXG5jb25zdCBVTkxPQ0tfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgSElERV9LRVlCT0FSRF9XQUlUX1RJTUUgPSAxMDA7XG5jb25zdCBJTlBVVF9LRVlTX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IE5VTUJFUl9aRVJPX0tFWUNPREUgPSA3O1xuXG5sZXQgaGVscGVycyA9IHt9O1xuaGVscGVycy5pc1ZhbGlkVW5sb2NrVHlwZSA9IGZ1bmN0aW9uIGlzVmFsaWRVbmxvY2tUeXBlICh0eXBlKSB7XG4gIHJldHVybiBVTkxPQ0tfVFlQRVMuaW5jbHVkZXModHlwZSk7XG59O1xuXG5oZWxwZXJzLmlzVmFsaWRLZXkgPSBmdW5jdGlvbiBpc1ZhbGlkS2V5ICh0eXBlLCBrZXkpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQoa2V5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoW1BJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBGSU5HRVJQUklOVF9VTkxPQ0tdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgcmV0dXJuIC9eWzAtOV0rJC8udGVzdChrZXkudHJpbSgpKTtcbiAgfVxuICBpZiAodHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3Qoa2V5LnRyaW0oKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEoLyhbMS05XSkuKj9cXDEvLnRlc3Qoa2V5LnRyaW0oKSkpO1xuICB9XG4gIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgLy8gwq9cXF8o44OEKV8vwq9cbiAgaWYgKHR5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIHJldHVybiAvLns0LH0vZy50ZXN0KGtleSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVubG9jayB0eXBlICR7dHlwZX1gKTtcbn07XG5cbmhlbHBlcnMuZGlzbWlzc0tleWd1YXJkID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0tleWd1YXJkIChkcml2ZXIsIGFkYikge1xuICBsb2dnZXIuaW5mbygnV2FraW5nIHVwIHRoZSBkZXZpY2UgdG8gdW5sb2NrIGl0Jyk7XG4gIC8vIFNjcmVlbiBvZmYgb25jZSB0byBmb3JjZSBwcmUtaW5wdXR0ZWQgdGV4dCBmaWVsZCBjbGVhbiBhZnRlciB3YWtlLXVwXG4gIC8vIEp1c3Qgc2NyZWVuIG9uIGlmIHRoZSBzY3JlZW4gZGVmYXVsdHMgb2ZmXG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9QT1dFUik7XG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9XQUtFVVApO1xuICBsZXQgaXNLZXlib2FyZFNob3duID0gYXdhaXQgZHJpdmVyLmlzS2V5Ym9hcmRTaG93bigpO1xuICBpZiAoaXNLZXlib2FyZFNob3duKSB7XG4gICAgYXdhaXQgZHJpdmVyLmhpZGVLZXlib2FyZCgpO1xuICAgIC8vIFdhaXRzIGEgYml0IGZvciB0aGUga2V5Ym9hcmQgdG8gaGlkZVxuICAgIGF3YWl0IHNsZWVwKEhJREVfS0VZQk9BUkRfV0FJVF9USU1FKTtcbiAgfVxuICAvLyBkaXNtaXNzIG5vdGlmaWNhdGlvbnNcbiAgbG9nZ2VyLmluZm8oJ0Rpc21pc3Mgbm90aWZpY2F0aW9ucyBmcm9tIHVubG9jayB2aWV3Jyk7XG4gIGF3YWl0IGFkYi5zaGVsbChbJ3NlcnZpY2UnLCAnY2FsbCcsICdub3RpZmljYXRpb24nLCAnMSddKTtcbiAgYXdhaXQgYWRiLmJhY2soKTtcbiAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpID4gMjEpIHtcbiAgICBsb2dnZXIuaW5mbygnVHJ5aW5nIHRvIGRpc21pc3Mga2V5Z3VhcmQnKTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWyd3bScsICdkaXNtaXNzLWtleWd1YXJkJ10pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2dnZXIuaW5mbygnU3dpcGluZyB1cCB0byBkaXNtaXNzIGtleWd1YXJkJyk7XG4gIGF3YWl0IGhlbHBlcnMuc3dpcGVVcChkcml2ZXIpO1xufTtcblxuaGVscGVycy5zd2lwZVVwID0gYXN5bmMgZnVuY3Rpb24gc3dpcGVVcCAoZHJpdmVyKSB7XG4gIGxldCB3aW5kb3dTaXplID0gYXdhaXQgZHJpdmVyLmdldFdpbmRvd1NpemUoKTtcbiAgbGV0IHgwID0gcGFyc2VJbnQod2luZG93U2l6ZS54IC8gMiwgMTApO1xuICBsZXQgeTAgPSB3aW5kb3dTaXplLnkgLSAxMDtcbiAgbGV0IHlQID0gMTAwO1xuICBsZXQgYWN0aW9ucyA9IFtcbiAgICB7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogeDAsIHk6IHkwfX0sXG4gICAge2FjdGlvbjogJ21vdmVUbycsIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiB4MCwgeTogeVB9fSxcbiAgICB7YWN0aW9uOiAncmVsZWFzZSd9XG4gIF07XG4gIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goYWN0aW9ucyk7XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1xccy9pZywgJyVzJyk7XG59O1xuXG5oZWxwZXJzLnN0cmluZ0tleVRvQXJyID0gZnVuY3Rpb24gc3RyaW5nS2V5VG9BcnIgKGtleSkge1xuICByZXR1cm4ga2V5LnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcnKS5zcGxpdCgvXFxzKi8pO1xufTtcblxuaGVscGVycy5maW5nZXJwcmludFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGZpbmdlcnByaW50VW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaW5nZXJwcmludCB1bmxvY2sgb25seSB3b3JrcyBmb3IgQW5kcm9pZCA2KyBlbXVsYXRvcnMnKTtcbiAgfVxuICBhd2FpdCBhZGIuZmluZ2VycHJpbnQoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5waW5VbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGhlbHBlcnMuZGlzbWlzc0tleWd1YXJkKGRyaXZlciwgYWRiKTtcbiAgbGV0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBsZXQgZWxzID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5zeXN0ZW11aTppZC9kaWdpdF90ZXh0JywgdHJ1ZSk7XG4gICAgaWYgKF8uaXNFbXB0eShlbHMpKSB7XG4gICAgICAvLyBmYWxsYmFjayB0byBwaW4gd2l0aCBrZXkgZXZlbnRcbiAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gICAgbGV0IHBpbnMgPSB7fTtcbiAgICBmb3IgKGxldCBlbCBvZiBlbHMpIHtcbiAgICAgIGxldCB0ZXh0ID0gYXdhaXQgZHJpdmVyLmdldEF0dHJpYnV0ZSgndGV4dCcsIHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgICAgcGluc1t0ZXh0XSA9IGVsO1xuICAgIH1cbiAgICBmb3IgKGxldCBwaW4gb2Yga2V5cykge1xuICAgICAgbGV0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBwaW4gb2Yga2V5cykge1xuICAgICAgbGV0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsIGBjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXkke3Bpbn1gLCBmYWxzZSk7XG4gICAgICBpZiAoZWwgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gcGluIHdpdGgga2V5IGV2ZW50XG4gICAgICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRyaXZlci5jbGljayh1dGlsLnVud3JhcEVsZW1lbnQoZWwpKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgd2FpdEZvclVubG9jayhhZGIsIGRyaXZlcik7XG59O1xuXG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKiBAcGFyYW0ge0FuZHJvaWREcml2ZXJ9IGRyaXZlciBUaGUgaW5zdGFuY2Ugb2YgQW5kcm9pZERyaXZlclxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yVW5sb2NrIChhZGIsIGRyaXZlcikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGRyaXZlci5wcmVzc0tleUNvZGUoS0VZQ09ERV9OVU1QQURfRU5URVIpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn1cblxuaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQgPSBhc3luYyBmdW5jdGlvbiBwaW5VbmxvY2tXaXRoS2V5RXZlbnQgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBpbiB3aXRoIGtleWNvZGUgJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBoZWxwZXJzLmRpc21pc3NLZXlndWFyZChkcml2ZXIsIGFkYik7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuXG4gIC8vIFNvbWUgZGV2aWNlIGRvZXMgbm90IGhhdmUgc3lzdGVtIGtleSBpZHMgbGlrZSAnY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5J1xuICAvLyBUaGVuLCBzZW5kaW5nIGtleWV2ZW50cyBhcmUgbW9yZSByZWxpYWJsZSB0byB1bmxvY2sgdGhlIHNjcmVlbi5cbiAgZm9yIChjb25zdCBwaW4gb2Yga2V5cykge1xuICAgIC8vICdwaW4nIGlzIG51bWJlciAoMC05KSBpbiBzdHJpbmcuXG4gICAgLy8gTnVtYmVyICcwJyBpcyBrZXljb2RlICc3Jy4gbnVtYmVyICc5JyBpcyBrZXljb2RlICcxNicuXG4gICAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBwYXJzZUludChwaW4sIDEwKSArIE5VTUJFUl9aRVJPX0tFWUNPREVdKTtcbiAgfVxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMucGFzc3dvcmRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBwYXNzd29yZFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGFzc3dvcmQgJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBoZWxwZXJzLmRpc21pc3NLZXlndWFyZChkcml2ZXIsIGFkYik7XG4gIGxldCBrZXkgPSBjYXBhYmlsaXRpZXMudW5sb2NrS2V5O1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQoa2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge3g6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSwgeTogeVBvcyhrZXksIGluaXRQb3MueSwgcGllY2UpfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgbGV0IGFjdGlvbnMgPSBbXTtcbiAgbGV0IGxhc3RQb3M7XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgbGV0IGtleVBvcyA9IGhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uKGtleSwgaW5pdFBvcywgcGllY2UpO1xuICAgIGlmIChrZXkgPT09IGtleXNbMF0pIHtcbiAgICAgIGFjdGlvbnMucHVzaCh7YWN0aW9uOiAncHJlc3MnLCBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDoga2V5UG9zLngsIHk6IGtleVBvcy55fX0pO1xuICAgICAgbGFzdFBvcyA9IGtleVBvcztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGxldCBkaWZmWCA9IGtleVBvcy54IC0gbGFzdFBvcy54O1xuICAgIGlmIChkaWZmWCA+IDApIHtcbiAgICAgIG1vdmVUby54ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnggKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWCA8IDApIHtcbiAgICAgIG1vdmVUby54ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRpZmZZID0ga2V5UG9zLnkgLSBsYXN0UG9zLnk7XG4gICAgaWYgKGRpZmZZID4gMCkge1xuICAgICAgbW92ZVRvLnkgPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZZIDwgMCkge1xuICAgICAgbW92ZVRvLnkgPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZZKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby55IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ21vdmVUbycsIG9wdGlvbnM6IHtlbGVtZW50OiBudWxsLCB4OiBtb3ZlVG8ueCArIGxhc3RQb3MueCwgeTogbW92ZVRvLnkgKyBsYXN0UG9zLnl9fSk7XG4gICAgbGFzdFBvcyA9IGtleVBvcztcbiAgfVxuICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3JlbGVhc2UnfSk7XG4gIHJldHVybiBhY3Rpb25zO1xufTtcblxuaGVscGVycy5wYXR0ZXJuVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGF0dGVyblVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGF0dGVybiAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGhlbHBlcnMuZGlzbWlzc0tleWd1YXJkKGRyaXZlciwgYWRiKTtcbiAgbGV0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICAvKiBXZSBzZXQgdGhlIGRldmljZSBwYXR0ZXJuIGJ1dHRvbnMgYXMgbnVtYmVyIG9mIGEgcmVndWxhciBwaG9uZVxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDEgMiAzIHxcbiAgICogIHwg4oCiIOKAoiDigKIgfCAtLT4gfCA0IDUgNiB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgICAgIHwgNyA4IDkgfFxuXG4gIFRoZSBwYXR0ZXJuIHZpZXcgYnV0dG9ucyBhcmUgbm90IHNlZWluZyBieSB0aGUgdWlhdXRvbWF0b3Igc2luY2UgdGhleSBhcmVcbiAgaW5jbHVkZWQgaW5zaWRlIGEgRnJhbWVMYXlvdXQsIHNvIHdlIGFyZSBnb2luZyB0byB0cnkgY2xpY2tpbmcgb24gdGhlIGJ1dHRvbnNcbiAgdXNpbmcgdGhlIHBhcmVudCB2aWV3IGJvdW5kcyBhbmQgbWF0aC5cbiAgKi9cbiAgbGV0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGxldCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLFxuICAgIGBjb20uYW5kcm9pZC4ke2FwaUxldmVsID49IDIxID8gJ3N5c3RlbXVpJyA6ICdrZXlndWFyZCd9OmlkL2xvY2tQYXR0ZXJuVmlld2AsXG4gICAgZmFsc2VcbiAgKTtcbiAgbGV0IGluaXRQb3MgPSBhd2FpdCBkcml2ZXIuZ2V0TG9jYXRpb24odXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIGxldCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgbGV0IGFjdGlvbnMgPSBoZWxwZXJzLmdldFBhdHRlcm5BY3Rpb25zKGtleXMsIGluaXRQb3MsIHNpemUud2lkdGggLyAzKTtcbiAgLy8gUGVyZm9ybSBnZXN0dXJlXG4gIGF3YWl0IGRyaXZlci5wZXJmb3JtVG91Y2goYWN0aW9ucyk7XG4gIC8vIFdhaXRzIGEgYml0IGZvciB0aGUgZGV2aWNlIHRvIGJlIHVubG9ja2VkXG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufTtcblxuaGVscGVycy5QSU5fVU5MT0NLID0gUElOX1VOTE9DSztcbmhlbHBlcnMuUElOX1VOTE9DS19LRVlfRVZFTlQgPSBQSU5fVU5MT0NLX0tFWV9FVkVOVDtcbmhlbHBlcnMuUEFTU1dPUkRfVU5MT0NLID0gUEFTU1dPUkRfVU5MT0NLO1xuaGVscGVycy5QQVRURVJOX1VOTE9DSyA9IFBBVFRFUk5fVU5MT0NLO1xuaGVscGVycy5GSU5HRVJQUklOVF9VTkxPQ0sgPSBGSU5HRVJQUklOVF9VTkxPQ0s7XG5cbmV4cG9ydCB7IFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0ssIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwiZmlsZSI6ImxpYi91bmxvY2staGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|
|
306
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91bmxvY2staGVscGVycy5qcyJdLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50IiwicGluVW5sb2NrIiwia2V5cyIsImVscyIsImZpbmRFbE9yRWxzIiwiaXNFbXB0eSIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBpbnMiLCJlbCIsInRleHQiLCJnZXRBdHRyaWJ1dGUiLCJ1dGlsIiwidW53cmFwRWxlbWVudCIsInBpbiIsImNsaWNrIiwid2FpdEZvclVubG9jayIsImlzU2NyZWVuTG9ja2VkIiwia2V5ZXZlbnQiLCJzaGVsbCIsInBhcnNlSW50IiwicGFzc3dvcmRVbmxvY2siLCJnZXRQYXR0ZXJuS2V5UG9zaXRpb24iLCJpbml0UG9zIiwicGllY2UiLCJjb2xzIiwieFBvcyIsIngiLCJNYXRoIiwicm91bmQiLCJ5UG9zIiwieSIsImNlaWwiLCJnZXRQYXR0ZXJuQWN0aW9ucyIsImFjdGlvbnMiLCJsYXN0UG9zIiwia2V5UG9zIiwicHVzaCIsImFjdGlvbiIsIm9wdGlvbnMiLCJlbGVtZW50IiwibW92ZVRvIiwiZGlmZlgiLCJhYnMiLCJkaWZmWSIsInBhdHRlcm5VbmxvY2siLCJhcGlMZXZlbCIsImdldExvY2F0aW9uIiwic2l6ZSIsImdldFNpemUiLCJ3aWR0aCIsInBlcmZvcm1Ub3VjaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsaUJBQTdCOztBQUNBLE1BQU1DLGVBQWUsR0FBRyxVQUF4Qjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsU0FBdkI7O0FBQ0EsTUFBTUMsa0JBQWtCLEdBQUcsYUFBM0I7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLENBQ25CTCxVQURtQixFQUNQQyxvQkFETyxFQUNlQyxlQURmLEVBRW5CQyxjQUZtQixFQUVIQyxrQkFGRyxDQUFyQjtBQUlBLE1BQU1FLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBekI7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxHQUE3QjtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQTVCO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOzs7QUFFQUEsT0FBTyxDQUFDQywwQkFBUixHQUFxQyxTQUFTQSwwQkFBVCxDQUFxQ0MsSUFBSSxHQUFHLEVBQTVDLEVBQWdEO0FBQ25GLFFBQU07QUFDSkMsSUFBQUEsU0FESTtBQUVKQyxJQUFBQTtBQUZJLE1BR0ZGLElBSEo7O0FBSUEsTUFBSUcsZ0JBQUVDLEtBQUYsQ0FBUUgsU0FBUixLQUFzQkEsU0FBUyxLQUFLLEVBQXhDLEVBQTRDO0FBQzFDLFVBQU0sSUFBSUksS0FBSixDQUFVLCtDQUFWLENBQU47QUFDRDs7QUFFRCxNQUFJLENBQUNqQixVQUFELEVBQWFDLG9CQUFiLEVBQW1DRyxrQkFBbkMsRUFBdURjLFFBQXZELENBQWdFSixVQUFoRSxDQUFKLEVBQWlGO0FBQy9FLFFBQUksQ0FBQyxXQUFXSyxJQUFYLENBQWdCSixnQkFBRUssSUFBRixDQUFPUCxTQUFQLENBQWhCLENBQUwsRUFBeUM7QUFDdkMsWUFBTSxJQUFJSSxLQUFKLENBQVcscUJBQW9CSixTQUFVLCtCQUF6QyxDQUFOO0FBQ0Q7QUFDRixHQUpELE1BSU8sSUFBSUMsVUFBVSxLQUFLWCxjQUFuQixFQUFtQztBQUN4QyxRQUFJLENBQUMsZUFBZWdCLElBQWYsQ0FBb0JKLGdCQUFFSyxJQUFGLENBQU9QLFNBQVAsQ0FBcEIsQ0FBTCxFQUE2QztBQUMzQyxZQUFNLElBQUlJLEtBQUosQ0FBVyxxQkFBb0JKLFNBQVUsMkRBQXpDLENBQU47QUFDRDs7QUFDRCxRQUFJLGVBQWVNLElBQWYsQ0FBb0JKLGdCQUFFSyxJQUFGLENBQU9QLFNBQVAsQ0FBcEIsQ0FBSixFQUE0QztBQUMxQyxZQUFNLElBQUlJLEtBQUosQ0FBVyxxQkFBb0JKLFNBQVUsNkRBQXpDLENBQU47QUFDRDtBQUNGLEdBUE0sTUFPQSxJQUFJQyxVQUFVLEtBQUtaLGVBQW5CLEVBQW9DO0FBR3pDLFFBQUksQ0FBQyxTQUFTaUIsSUFBVCxDQUFjTixTQUFkLENBQUwsRUFBK0I7QUFDN0IsWUFBTSxJQUFJSSxLQUFKLENBQVcsbURBQWtESixTQUFVLG1CQUF2RSxDQUFOO0FBQ0Q7QUFDRixHQU5NLE1BTUE7QUFDTCxVQUFNLElBQUlJLEtBQUosQ0FBVyx3QkFBdUJILFVBQVcsS0FBbkMsR0FDYixrREFBaURULFlBQWEsRUFEM0QsQ0FBTjtBQUVEOztBQUNELFNBQU9PLElBQVA7QUFDRCxDQS9CRDs7QUFpQ0FGLE9BQU8sQ0FBQ1csVUFBUixHQUFxQixlQUFlQSxVQUFmLENBQTJCQyxHQUEzQixFQUFnQ0MsSUFBSSxHQUFHLEVBQXZDLEVBQTJDO0FBQzlELFFBQU07QUFDSkMsSUFBQUEsVUFESTtBQUVKQyxJQUFBQTtBQUZJLE1BR0ZGLElBSEo7O0FBSUFHLGtCQUFPQyxJQUFQLENBQWEsc0NBQXFDRixjQUFlLGdCQUFlRCxVQUFXLEdBQTNGOztBQUNBLFFBQU1JLGNBQWMsR0FBRyxNQUFNTixHQUFHLENBQUNPLGFBQUosRUFBN0I7O0FBQ0EsTUFBSUQsY0FBSixFQUFvQjtBQUNsQixVQUFNTixHQUFHLENBQUNRLG1CQUFKLENBQXdCTixVQUF4QixDQUFOO0FBR0EsVUFBTUYsR0FBRyxDQUFDUyxXQUFKLEVBQU47QUFDRCxHQUxELE1BS087QUFDTEwsb0JBQU9DLElBQVAsQ0FBWSx3RUFBWjtBQUNEOztBQUNELE1BQUk7QUFDRixVQUFNTCxHQUFHLENBQUNVLGVBQUosRUFBTjtBQUNELEdBRkQsU0FFVTtBQUNSLFFBQUlKLGNBQUosRUFBb0I7QUFDbEIsWUFBTU4sR0FBRyxDQUFDVyxpQkFBSixDQUFzQlIsY0FBdEIsRUFBc0NELFVBQXRDLENBQU47QUFDRDtBQUNGO0FBQ0YsQ0F0QkQ7O0FBd0JBZCxPQUFPLENBQUN3QixjQUFSLEdBQXlCLFNBQVNBLGNBQVQsQ0FBeUJDLEdBQXpCLEVBQThCO0FBQ3JELFNBQVEsR0FBRUEsR0FBSSxFQUFQLENBQVNDLE9BQVQsQ0FBaUIsTUFBakIsRUFBeUIsSUFBekIsQ0FBUDtBQUNELENBRkQ7O0FBSUExQixPQUFPLENBQUMyQixjQUFSLEdBQXlCLFNBQVNBLGNBQVQsQ0FBeUJGLEdBQXpCLEVBQThCO0FBQ3JELFNBQVEsR0FBRUEsR0FBSSxFQUFQLENBQVNmLElBQVQsR0FBZ0JnQixPQUFoQixDQUF3QixNQUF4QixFQUFnQyxFQUFoQyxFQUFvQ0UsS0FBcEMsQ0FBMEMsS0FBMUMsQ0FBUDtBQUNELENBRkQ7O0FBSUE1QixPQUFPLENBQUM2QixpQkFBUixHQUE0QixlQUFlQSxpQkFBZixDQUFrQ2pCLEdBQWxDLEVBQXVDa0IsTUFBdkMsRUFBK0NDLFlBQS9DLEVBQTZEO0FBQ3ZGLE1BQUksT0FBTW5CLEdBQUcsQ0FBQ29CLFdBQUosRUFBTixJQUEwQixFQUE5QixFQUFrQztBQUNoQyxVQUFNLElBQUl6QixLQUFKLENBQVUsd0RBQVYsQ0FBTjtBQUNEOztBQUNELFFBQU1LLEdBQUcsQ0FBQ3FCLFdBQUosQ0FBZ0JGLFlBQVksQ0FBQzVCLFNBQTdCLENBQU47QUFDQSxRQUFNLHFCQUFNTixnQkFBTixDQUFOO0FBQ0QsQ0FORDs7QUFRQUcsT0FBTyxDQUFDa0MsU0FBUixHQUFvQixlQUFlQSxTQUFmLENBQTBCdEIsR0FBMUIsRUFBK0JrQixNQUEvQixFQUF1Q0MsWUFBdkMsRUFBcUQ7QUFDdkVmLGtCQUFPQyxJQUFQLENBQWEscUNBQW9DYyxZQUFZLENBQUM1QixTQUFVLEVBQXhFOztBQUNBLFFBQU1TLEdBQUcsQ0FBQ1UsZUFBSixFQUFOO0FBQ0EsUUFBTWEsSUFBSSxHQUFHbkMsT0FBTyxDQUFDMkIsY0FBUixDQUF1QkksWUFBWSxDQUFDNUIsU0FBcEMsQ0FBYjs7QUFDQSxNQUFJLE9BQU1TLEdBQUcsQ0FBQ29CLFdBQUosRUFBTixLQUEyQixFQUEvQixFQUFtQztBQUNqQyxVQUFNSSxHQUFHLEdBQUcsTUFBTU4sTUFBTSxDQUFDTyxXQUFQLENBQW1CLElBQW5CLEVBQXlCLG9DQUF6QixFQUErRCxJQUEvRCxDQUFsQjs7QUFDQSxRQUFJaEMsZ0JBQUVpQyxPQUFGLENBQVVGLEdBQVYsQ0FBSixFQUFvQjtBQUVsQixhQUFPLE1BQU1wQyxPQUFPLENBQUN1QyxxQkFBUixDQUE4QjNCLEdBQTlCLEVBQW1Da0IsTUFBbkMsRUFBMkNDLFlBQTNDLENBQWI7QUFDRDs7QUFDRCxVQUFNUyxJQUFJLEdBQUcsRUFBYjs7QUFDQSxTQUFLLE1BQU1DLEVBQVgsSUFBaUJMLEdBQWpCLEVBQXNCO0FBQ3BCLFlBQU1NLElBQUksR0FBRyxNQUFNWixNQUFNLENBQUNhLFlBQVAsQ0FBb0IsTUFBcEIsRUFBNEJDLG9CQUFLQyxhQUFMLENBQW1CSixFQUFuQixDQUE1QixDQUFuQjtBQUNBRCxNQUFBQSxJQUFJLENBQUNFLElBQUQsQ0FBSixHQUFhRCxFQUFiO0FBQ0Q7O0FBQ0QsU0FBSyxNQUFNSyxHQUFYLElBQWtCWCxJQUFsQixFQUF3QjtBQUN0QixZQUFNTSxFQUFFLEdBQUdELElBQUksQ0FBQ00sR0FBRCxDQUFmO0FBQ0EsWUFBTWhCLE1BQU0sQ0FBQ2lCLEtBQVAsQ0FBYUgsb0JBQUtDLGFBQUwsQ0FBbUJKLEVBQW5CLENBQWIsQ0FBTjtBQUNEO0FBQ0YsR0FmRCxNQWVPO0FBQ0wsU0FBSyxNQUFNSyxHQUFYLElBQWtCWCxJQUFsQixFQUF3QjtBQUN0QixZQUFNTSxFQUFFLEdBQUcsTUFBTVgsTUFBTSxDQUFDTyxXQUFQLENBQW1CLElBQW5CLEVBQTBCLDhCQUE2QlMsR0FBSSxFQUEzRCxFQUE4RCxLQUE5RCxDQUFqQjs7QUFDQSxVQUFJTCxFQUFFLEtBQUssSUFBWCxFQUFpQjtBQUVmLGVBQU8sTUFBTXpDLE9BQU8sQ0FBQ3VDLHFCQUFSLENBQThCM0IsR0FBOUIsRUFBbUNrQixNQUFuQyxFQUEyQ0MsWUFBM0MsQ0FBYjtBQUNEOztBQUNELFlBQU1ELE1BQU0sQ0FBQ2lCLEtBQVAsQ0FBYUgsb0JBQUtDLGFBQUwsQ0FBbUJKLEVBQW5CLENBQWIsQ0FBTjtBQUNEO0FBQ0Y7O0FBQ0QsUUFBTU8sYUFBYSxDQUFDcEMsR0FBRCxDQUFuQjtBQUNELENBOUJEOztBQTBDQSxlQUFlb0MsYUFBZixDQUE4QnBDLEdBQTlCLEVBQW1DO0FBQ2pDLFFBQU0scUJBQU1mLGdCQUFOLENBQU47O0FBQ0EsTUFBSSxFQUFDLE1BQU1lLEdBQUcsQ0FBQ3FDLGNBQUosRUFBUCxDQUFKLEVBQWlDO0FBQy9CO0FBQ0Q7O0FBRUQsUUFBTXJDLEdBQUcsQ0FBQ3NDLFFBQUosQ0FBYXRELG9CQUFiLENBQU47QUFDQSxRQUFNLHFCQUFNQyxnQkFBTixDQUFOO0FBQ0Q7O0FBRURHLE9BQU8sQ0FBQ3VDLHFCQUFSLEdBQWdDLGVBQWVBLHFCQUFmLENBQXNDM0IsR0FBdEMsRUFBMkNrQixNQUEzQyxFQUFtREMsWUFBbkQsRUFBaUU7QUFDL0ZmLGtCQUFPQyxJQUFQLENBQWEsa0RBQWlEYyxZQUFZLENBQUM1QixTQUFVLEVBQXJGOztBQUNBLFFBQU1TLEdBQUcsQ0FBQ1UsZUFBSixFQUFOO0FBQ0EsUUFBTWEsSUFBSSxHQUFHbkMsT0FBTyxDQUFDMkIsY0FBUixDQUF1QkksWUFBWSxDQUFDNUIsU0FBcEMsQ0FBYjs7QUFJQSxPQUFLLE1BQU0yQyxHQUFYLElBQWtCWCxJQUFsQixFQUF3QjtBQUd0QixVQUFNdkIsR0FBRyxDQUFDdUMsS0FBSixDQUFVLENBQUMsT0FBRCxFQUFVLFVBQVYsRUFBc0JDLFFBQVEsQ0FBQ04sR0FBRCxFQUFNLEVBQU4sQ0FBUixHQUFvQi9DLG1CQUExQyxDQUFWLENBQU47QUFDRDs7QUFDRCxRQUFNaUQsYUFBYSxDQUFDcEMsR0FBRCxFQUFNa0IsTUFBTixDQUFuQjtBQUNELENBYkQ7O0FBZUE5QixPQUFPLENBQUNxRCxjQUFSLEdBQXlCLGVBQWVBLGNBQWYsQ0FBK0J6QyxHQUEvQixFQUFvQ2tCLE1BQXBDLEVBQTRDQyxZQUE1QyxFQUEwRDtBQUNqRixRQUFNO0FBQUU1QixJQUFBQTtBQUFGLE1BQWdCNEIsWUFBdEI7O0FBQ0FmLGtCQUFPQyxJQUFQLENBQWEsMENBQXlDZCxTQUFVLEVBQWhFOztBQUNBLFFBQU1TLEdBQUcsQ0FBQ1UsZUFBSixFQUFOO0FBRUEsUUFBTUcsR0FBRyxHQUFHekIsT0FBTyxDQUFDd0IsY0FBUixDQUF1QnJCLFNBQXZCLENBQVo7QUFFQSxRQUFNUyxHQUFHLENBQUN1QyxLQUFKLENBQVUsQ0FBQyxPQUFELEVBQVUsTUFBVixFQUFrQjFCLEdBQWxCLENBQVYsQ0FBTjtBQUVBLFFBQU0scUJBQU0zQixvQkFBTixDQUFOO0FBQ0EsUUFBTWMsR0FBRyxDQUFDdUMsS0FBSixDQUFVLENBQUMsT0FBRCxFQUFVLFVBQVYsRUFBc0J2RCxvQkFBdEIsQ0FBVixDQUFOO0FBRUEsUUFBTW9ELGFBQWEsQ0FBQ3BDLEdBQUQsRUFBTWtCLE1BQU4sQ0FBbkI7QUFDRCxDQWJEOztBQWVBOUIsT0FBTyxDQUFDc0QscUJBQVIsR0FBZ0MsU0FBU0EscUJBQVQsQ0FBZ0M3QixHQUFoQyxFQUFxQzhCLE9BQXJDLEVBQThDQyxLQUE5QyxFQUFxRDtBQU9uRixRQUFNQyxJQUFJLEdBQUcsQ0FBYjtBQUNBLFFBQU1qQixJQUFJLEdBQUcsQ0FBYjs7QUFDQSxRQUFNa0IsSUFBSSxHQUFHLENBQUNqQyxHQUFELEVBQU1rQyxDQUFOLEVBQVNILEtBQVQsS0FBbUJJLElBQUksQ0FBQ0MsS0FBTCxDQUFXRixDQUFDLEdBQUcsQ0FBRWxDLEdBQUcsR0FBR2dDLElBQVAsSUFBZ0JBLElBQWpCLElBQXlCRCxLQUE3QixHQUFxQ0EsS0FBSyxHQUFHLENBQXhELENBQWhDOztBQUNBLFFBQU1NLElBQUksR0FBRyxDQUFDckMsR0FBRCxFQUFNc0MsQ0FBTixFQUFTUCxLQUFULEtBQW1CSSxJQUFJLENBQUNDLEtBQUwsQ0FBV0UsQ0FBQyxJQUFJSCxJQUFJLENBQUNJLElBQUwsQ0FBVSxDQUFFdkMsR0FBRyxHQUFHZSxJQUFQLElBQWdCQSxJQUFqQixJQUF5QmlCLElBQW5DLElBQTJDRCxLQUEzQyxHQUFtREEsS0FBSyxHQUFHLENBQS9ELENBQVosQ0FBaEM7O0FBQ0EsU0FBTztBQUNMRyxJQUFBQSxDQUFDLEVBQUVELElBQUksQ0FBQ2pDLEdBQUQsRUFBTThCLE9BQU8sQ0FBQ0ksQ0FBZCxFQUFpQkgsS0FBakIsQ0FERjtBQUVMTyxJQUFBQSxDQUFDLEVBQUVELElBQUksQ0FBQ3JDLEdBQUQsRUFBTThCLE9BQU8sQ0FBQ1EsQ0FBZCxFQUFpQlAsS0FBakI7QUFGRixHQUFQO0FBSUQsQ0FmRDs7QUFpQkF4RCxPQUFPLENBQUNpRSxpQkFBUixHQUE0QixTQUFTQSxpQkFBVCxDQUE0QjlCLElBQTVCLEVBQWtDb0IsT0FBbEMsRUFBMkNDLEtBQTNDLEVBQWtEO0FBQzVFLFFBQU1VLE9BQU8sR0FBRyxFQUFoQjtBQUNBLE1BQUlDLE9BQUo7O0FBQ0EsT0FBSyxJQUFJMUMsR0FBVCxJQUFnQlUsSUFBaEIsRUFBc0I7QUFDcEIsVUFBTWlDLE1BQU0sR0FBR3BFLE9BQU8sQ0FBQ3NELHFCQUFSLENBQThCN0IsR0FBOUIsRUFBbUM4QixPQUFuQyxFQUE0Q0MsS0FBNUMsQ0FBZjs7QUFDQSxRQUFJL0IsR0FBRyxLQUFLVSxJQUFJLENBQUMsQ0FBRCxDQUFoQixFQUFxQjtBQUNuQitCLE1BQUFBLE9BQU8sQ0FBQ0csSUFBUixDQUFhO0FBQUNDLFFBQUFBLE1BQU0sRUFBRSxPQUFUO0FBQWtCQyxRQUFBQSxPQUFPLEVBQUU7QUFBQ0MsVUFBQUEsT0FBTyxFQUFFLElBQVY7QUFBZ0JiLFVBQUFBLENBQUMsRUFBRVMsTUFBTSxDQUFDVCxDQUExQjtBQUE2QkksVUFBQUEsQ0FBQyxFQUFFSyxNQUFNLENBQUNMO0FBQXZDO0FBQTNCLE9BQWI7QUFDQUksTUFBQUEsT0FBTyxHQUFHQyxNQUFWO0FBQ0E7QUFDRDs7QUFDRCxVQUFNSyxNQUFNLEdBQUc7QUFBQ2QsTUFBQUEsQ0FBQyxFQUFFLENBQUo7QUFBT0ksTUFBQUEsQ0FBQyxFQUFFO0FBQVYsS0FBZjtBQUNBLFVBQU1XLEtBQUssR0FBR04sTUFBTSxDQUFDVCxDQUFQLEdBQVdRLE9BQU8sQ0FBQ1IsQ0FBakM7O0FBQ0EsUUFBSWUsS0FBSyxHQUFHLENBQVosRUFBZTtBQUNiRCxNQUFBQSxNQUFNLENBQUNkLENBQVAsR0FBV0gsS0FBWDs7QUFDQSxVQUFJSSxJQUFJLENBQUNlLEdBQUwsQ0FBU0QsS0FBVCxJQUFrQmxCLEtBQXRCLEVBQTZCO0FBQzNCaUIsUUFBQUEsTUFBTSxDQUFDZCxDQUFQLElBQVlILEtBQVo7QUFDRDtBQUNGLEtBTEQsTUFLTyxJQUFJa0IsS0FBSyxHQUFHLENBQVosRUFBZTtBQUNwQkQsTUFBQUEsTUFBTSxDQUFDZCxDQUFQLEdBQVcsQ0FBQyxDQUFELEdBQUtILEtBQWhCOztBQUNBLFVBQUlJLElBQUksQ0FBQ2UsR0FBTCxDQUFTRCxLQUFULElBQWtCbEIsS0FBdEIsRUFBNkI7QUFDM0JpQixRQUFBQSxNQUFNLENBQUNkLENBQVAsSUFBWUgsS0FBWjtBQUNEO0FBQ0Y7O0FBQ0QsVUFBTW9CLEtBQUssR0FBR1IsTUFBTSxDQUFDTCxDQUFQLEdBQVdJLE9BQU8sQ0FBQ0osQ0FBakM7O0FBQ0EsUUFBSWEsS0FBSyxHQUFHLENBQVosRUFBZTtBQUNiSCxNQUFBQSxNQUFNLENBQUNWLENBQVAsR0FBV1AsS0FBWDs7QUFDQSxVQUFJSSxJQUFJLENBQUNlLEdBQUwsQ0FBU0MsS0FBVCxJQUFrQnBCLEtBQXRCLEVBQTZCO0FBQzNCaUIsUUFBQUEsTUFBTSxDQUFDVixDQUFQLElBQVlQLEtBQVo7QUFDRDtBQUNGLEtBTEQsTUFLTyxJQUFJb0IsS0FBSyxHQUFHLENBQVosRUFBZTtBQUNwQkgsTUFBQUEsTUFBTSxDQUFDVixDQUFQLEdBQVcsQ0FBQyxDQUFELEdBQUtQLEtBQWhCOztBQUNBLFVBQUlJLElBQUksQ0FBQ2UsR0FBTCxDQUFTQyxLQUFULElBQWtCcEIsS0FBdEIsRUFBNkI7QUFDM0JpQixRQUFBQSxNQUFNLENBQUNWLENBQVAsSUFBWVAsS0FBWjtBQUNEO0FBQ0Y7O0FBQ0RVLElBQUFBLE9BQU8sQ0FBQ0csSUFBUixDQUFhO0FBQ1hDLE1BQUFBLE1BQU0sRUFBRSxRQURHO0FBRVhDLE1BQUFBLE9BQU8sRUFBRTtBQUFDQyxRQUFBQSxPQUFPLEVBQUUsSUFBVjtBQUFnQmIsUUFBQUEsQ0FBQyxFQUFFYyxNQUFNLENBQUNkLENBQVAsR0FBV1EsT0FBTyxDQUFDUixDQUF0QztBQUF5Q0ksUUFBQUEsQ0FBQyxFQUFFVSxNQUFNLENBQUNWLENBQVAsR0FBV0ksT0FBTyxDQUFDSjtBQUEvRDtBQUZFLEtBQWI7QUFJQUksSUFBQUEsT0FBTyxHQUFHQyxNQUFWO0FBQ0Q7O0FBQ0RGLEVBQUFBLE9BQU8sQ0FBQ0csSUFBUixDQUFhO0FBQUNDLElBQUFBLE1BQU0sRUFBRTtBQUFULEdBQWI7QUFDQSxTQUFPSixPQUFQO0FBQ0QsQ0EzQ0Q7O0FBNkNBbEUsT0FBTyxDQUFDNkUsYUFBUixHQUF3QixlQUFlQSxhQUFmLENBQThCakUsR0FBOUIsRUFBbUNrQixNQUFuQyxFQUEyQ0MsWUFBM0MsRUFBeUQ7QUFDL0UsUUFBTTtBQUFFNUIsSUFBQUE7QUFBRixNQUFnQjRCLFlBQXRCOztBQUNBZixrQkFBT0MsSUFBUCxDQUFhLHlDQUF3Q2QsU0FBVSxFQUEvRDs7QUFDQSxRQUFNUyxHQUFHLENBQUNVLGVBQUosRUFBTjtBQUNBLFFBQU1hLElBQUksR0FBR25DLE9BQU8sQ0FBQzJCLGNBQVIsQ0FBdUJ4QixTQUF2QixDQUFiO0FBVUEsUUFBTTJFLFFBQVEsR0FBRyxNQUFNbEUsR0FBRyxDQUFDb0IsV0FBSixFQUF2QjtBQUNBLFFBQU1TLEVBQUUsR0FBRyxNQUFNWCxNQUFNLENBQUNPLFdBQVAsQ0FBbUIsSUFBbkIsRUFDZCxlQUFjeUMsUUFBUSxJQUFJLEVBQVosR0FBaUIsVUFBakIsR0FBOEIsVUFBVyxxQkFEekMsRUFFZixLQUZlLENBQWpCO0FBSUEsUUFBTXZCLE9BQU8sR0FBRyxNQUFNekIsTUFBTSxDQUFDaUQsV0FBUCxDQUFtQm5DLG9CQUFLQyxhQUFMLENBQW1CSixFQUFuQixDQUFuQixDQUF0QjtBQUNBLFFBQU11QyxJQUFJLEdBQUcsTUFBTWxELE1BQU0sQ0FBQ21ELE9BQVAsQ0FBZXJDLG9CQUFLQyxhQUFMLENBQW1CSixFQUFuQixDQUFmLENBQW5CO0FBRUEsUUFBTXlCLE9BQU8sR0FBR2xFLE9BQU8sQ0FBQ2lFLGlCQUFSLENBQTBCOUIsSUFBMUIsRUFBZ0NvQixPQUFoQyxFQUF5Q3lCLElBQUksQ0FBQ0UsS0FBTCxHQUFhLENBQXRELENBQWhCO0FBRUEsUUFBTXBELE1BQU0sQ0FBQ3FELFlBQVAsQ0FBb0JqQixPQUFwQixDQUFOO0FBRUEsUUFBTSxxQkFBTXJFLGdCQUFOLENBQU47QUFDRCxDQTNCRDs7QUE2QkFHLE9BQU8sQ0FBQ1YsVUFBUixHQUFxQkEsVUFBckI7QUFDQVUsT0FBTyxDQUFDVCxvQkFBUixHQUErQkEsb0JBQS9CO0FBQ0FTLE9BQU8sQ0FBQ1IsZUFBUixHQUEwQkEsZUFBMUI7QUFDQVEsT0FBTyxDQUFDUCxjQUFSLEdBQXlCQSxjQUF6QjtBQUNBTyxPQUFPLENBQUNOLGtCQUFSLEdBQTZCQSxrQkFBN0I7ZUFNZU0sTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwiZmlsZSI6ImxpYi91bmxvY2staGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
|