appium-android-driver 5.0.0 → 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/build/lib/commands/app-management.js +2 -2
- package/build/lib/commands/general.js +1 -63
- package/build/lib/commands/index.js +4 -2
- package/build/lib/commands/system-bars.js +144 -0
- package/lib/commands/app-management.js +2 -0
- package/lib/commands/general.js +0 -82
- package/lib/commands/index.js +2 -0
- package/lib/commands/system-bars.js +131 -0
- package/package.json +5 -7
- package/bootstrap/README.md +0 -19
- package/lib/.DS_Store +0 -0
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
[](https://npmjs.org/package/appium-android-driver)
|
|
2
2
|
[](https://npmjs.org/package/appium-android-driver)
|
|
3
|
-
[](https://david-dm.org/appium/appium-android-driver)
|
|
4
|
-
[](https://david-dm.org/appium/appium-android-driver#info=devDependencies)
|
|
5
3
|
|
|
6
4
|
[](https://travis-ci.org/appium/appium-android-driver)
|
|
7
5
|
|
|
@@ -163,3 +161,4 @@ Some tests need particular emulators. Currently they are twofold:
|
|
|
163
161
|
Some tests also also need a specific version of Chromedriver (specifically, `2.20`),
|
|
164
162
|
which is available in the `test/assets` folder, or can be specified with the
|
|
165
163
|
`CHROME_2_20_EXECUTABLE` environment variable.
|
|
164
|
+
|
|
@@ -48,7 +48,7 @@ commands.queryAppState = async function queryAppState(appId) {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
commands.activateApp = async function activateApp(appId) {
|
|
51
|
-
const cmd = ['monkey', '-p', appId, '-c', 'android.intent.category.LAUNCHER', '1'];
|
|
51
|
+
const cmd = ['monkey', '--pct-syskeys', '0', '-p', appId, '-c', 'android.intent.category.LAUNCHER', '1'];
|
|
52
52
|
let output = '';
|
|
53
53
|
|
|
54
54
|
try {
|
|
@@ -117,4 +117,4 @@ var _default = commands;
|
|
|
117
117
|
exports.default = _default;require('source-map-support').install();
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyJdLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsImNvbW1hbmRzIiwiaXNBcHBJbnN0YWxsZWQiLCJhcHBJZCIsImFkYiIsInF1ZXJ5QXBwU3RhdGUiLCJsb2ciLCJpbmZvIiwiQVBQX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsInByb2Nlc3NFeGlzdHMiLCJOT1RfUlVOTklORyIsImxpbmUiLCJkdW1wV2luZG93cyIsInNwbGl0IiwiaW5jbHVkZXMiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJhY3RpdmF0ZUFwcCIsImNtZCIsIm91dHB1dCIsImRlYnVnIiwiam9pbiIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlQXBwIiwib3B0aW9ucyIsInVuaW5zdGFsbEFwayIsInRlcm1pbmF0ZUFwcCIsImZvcmNlU3RvcCIsInRpbWVvdXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJpc05hTiIsInBhcnNlSW50Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVDbGVhckFwcCIsIm9wdHMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImNsZWFyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBRyxDQUFDLE1BQUQsRUFBUyxPQUFULENBQXZCO0FBRUEsSUFBSUMsUUFBUSxHQUFHLEVBQWY7OztBQVFBQSxRQUFRLENBQUNDLGNBQVQsR0FBMEIsZUFBZUEsY0FBZixDQUErQkMsS0FBL0IsRUFBc0M7QUFDOUQsU0FBTyxNQUFNLEtBQUtDLEdBQUwsQ0FBU0YsY0FBVCxDQUF3QkMsS0FBeEIsQ0FBYjtBQUNELENB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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcblxuY29uc3QgQVBQX0VYVEVOU0lPTlMgPSBbJy5hcGsnLCAnLmFwa3MnXTtcblxubGV0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWRcbiAqL1xuY29tbWFuZHMuaXNBcHBJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBpc0FwcEluc3RhbGxlZCAoYXBwSWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge251bWJlcn0gVGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQsIHdoaWNoIGRlc2NyaWJlc1xuICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gc3RhdGU6XG4gKiAwIC0gaXMgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkXG4gKiAxIC0gaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWQsIGJ1dCBpcyBub3QgcnVubmluZ1xuICogMyAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZFxuICogNCAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZFxuICovXG5jb21tYW5kcy5xdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gcXVlcnlBcHBTdGF0ZSAoYXBwSWQpIHtcbiAgbG9nLmluZm8oYFF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiAnJHthcHBJZH0nYCk7XG4gIGlmICghYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpKSB7XG4gICAgcmV0dXJuIEFQUF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG4gIGlmICghYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9SVU5OSU5HO1xuICB9XG4gIGZvciAoY29uc3QgbGluZSBvZiAoYXdhaXQgdGhpcy5hZGIuZHVtcFdpbmRvd3MoKSkuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoYXBwSWQpICYmIChsaW5lLmluY2x1ZGVzKCdtQ3VycmVudEZvY3VzJykgfHwgbGluZS5pbmNsdWRlcygnbUZvY3VzZWRBcHAnKSkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORDtcbn07XG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBvciBsYXVuY2hlcyBpdCBpZiBuZWNlc3NhcnkuXG4gKiBUaGUgYWN0aW9uIGlzIGRvbmUgd2l0aCBtb25rZXkgdG9vbCBhbmQgbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICovXG5jb21tYW5kcy5hY3RpdmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQXBwIChhcHBJZCkge1xuICBjb25zdCBjbWQgPSBbJ21vbmtleScsXG4gICAgJy1wJywgYXBwSWQsXG4gICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAnMSddO1xuICBsZXQgb3V0cHV0ID0gJyc7XG4gIHRyeSB7XG4gICAgbG9nLmRlYnVnKGBBY3RpdmF0aW5nICcke2FwcElkfScgd2l0aCAnYWRiIHNoZWxsICR7Y21kLmpvaW4oJyAnKX0nIGNvbW1hbmRgKTtcbiAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgIGxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7b3V0cHV0fWApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgaWYgKG91dHB1dC5pbmNsdWRlcygnbW9ua2V5IGFib3J0ZWQnKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gQXJlIHlvdSBzdXJlIGl0IGlzIGluc3RhbGxlZD9gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB1bmluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ga2VlcERhdGEgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGtlZXAgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkYXRhIGFuZCBjYWNoZSBmb2xkZXJzIGFmdGVyIHVuaW5zdGFsbC5cbiAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpZiBpcyBpbnN0YWxsZWQuXG4gKiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1VuaW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIHJlbW92YWwgb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2Ugd2FzIGZvdW5kIG9uIHRoZSBkZXZpY2UgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5jb21tYW5kcy5yZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRlcm1pbmF0ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gdGltZW91dCBbNTAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB0ZXJtaW5hdGVkLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcGFyYW0gez9UZXJtaW5hdGVPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBhcHBsaWNhdGlvbiB0ZXJtaW5hdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXBwIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy50ZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgbG9nLmluZm8oYFRlcm1pbmF0aW5nICcke2FwcElkfSdgKTtcbiAgaWYgKCEoYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBhcHAgJyR7YXBwSWR9JyBpcyBub3QgcnVubmluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoYXBwSWQpO1xuICBjb25zdCB0aW1lb3V0ID0gdXRpbC5oYXNWYWx1ZShvcHRpb25zLnRpbWVvdXQpICYmICFpc05hTihvcHRpb25zLnRpbWVvdXQpID8gcGFyc2VJbnQob3B0aW9ucy50aW1lb3V0LCAxMCkgOiA1MDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpIDw9IEFQUF9TVEFURS5OT1RfUlVOTklORyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHt3YWl0TXM6IHRpbWVvdXQsIGludGVydmFsTXM6IDEwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYCcke2FwcElkfScgaXMgc3RpbGwgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXMgdGltZW91dGApO1xuICB9XG4gIGxvZy5pbmZvKGAnJHthcHBJZH0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkYCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgbG9jYWwgYXBrIHBhdGggb3IgYSByZW1vdGUgdXJsXG4gKiBAcGFyYW0gez9JbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgaW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZ2l2ZW4gYXBrIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFjaGFibGVcbiAqL1xuY29tbWFuZHMuaW5zdGFsbEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcHAgKGFwcFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBsb2NhbFBhdGggPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcFBhdGgsIEFQUF9FWFRFTlNJT05TKTtcbiAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbChsb2NhbFBhdGgsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGVhckFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gYXBwSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gYmUgY2xlYXJlZFxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7Q2xlYXJBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xlYW5pbmcgb2YgdGhlIGFwcCBkYXRhIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsZWFyQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xlYXJBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YXBwSWR9ID0gb3B0cztcbiAgaWYgKCFhcHBJZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnYXBwSWQnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuY2xlYXIoYXBwSWQpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvYXBwLW1hbmFnZW1lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
120
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyJdLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsImNvbW1hbmRzIiwiaXNBcHBJbnN0YWxsZWQiLCJhcHBJZCIsImFkYiIsInF1ZXJ5QXBwU3RhdGUiLCJsb2ciLCJpbmZvIiwiQVBQX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsInByb2Nlc3NFeGlzdHMiLCJOT1RfUlVOTklORyIsImxpbmUiLCJkdW1wV2luZG93cyIsInNwbGl0IiwiaW5jbHVkZXMiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJhY3RpdmF0ZUFwcCIsImNtZCIsIm91dHB1dCIsImRlYnVnIiwiam9pbiIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlQXBwIiwib3B0aW9ucyIsInVuaW5zdGFsbEFwayIsInRlcm1pbmF0ZUFwcCIsImZvcmNlU3RvcCIsInRpbWVvdXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJpc05hTiIsInBhcnNlSW50Iiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVDbGVhckFwcCIsIm9wdHMiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImNsZWFyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBRyxDQUFDLE1BQUQsRUFBUyxPQUFULENBQXZCO0FBRUEsSUFBSUMsUUFBUSxHQUFHLEVBQWY7OztBQVFBQSxRQUFRLENBQUNDLGNBQVQsR0FBMEIsZUFBZUEsY0FBZixDQUErQkMsS0FBL0IsRUFBc0M7QUFDOUQsU0FBTyxNQUFNLEtBQUtDLEdBQUwsQ0FBU0YsY0FBVCxDQUF3QkMsS0FBeEIsQ0FBYjtBQUNELENBRkQ7O0FBZUFGLFFBQVEsQ0FBQ0ksYUFBVCxHQUF5QixlQUFlQSxhQUFmLENBQThCRixLQUE5QixFQUFxQztBQUM1REcsa0JBQUlDLElBQUosQ0FBVSwwQkFBeUJKLEtBQU0sR0FBekM7O0FBQ0EsTUFBSSxFQUFDLE1BQU0sS0FBS0MsR0FBTCxDQUFTRixjQUFULENBQXdCQyxLQUF4QixDQUFQLENBQUosRUFBMkM7QUFDekMsV0FBT0ssMEJBQVVDLGFBQWpCO0FBQ0Q7O0FBQ0QsTUFBSSxFQUFDLE1BQU0sS0FBS0wsR0FBTCxDQUFTTSxhQUFULENBQXVCUCxLQUF2QixDQUFQLENBQUosRUFBMEM7QUFDeEMsV0FBT0ssMEJBQVVHLFdBQWpCO0FBQ0Q7O0FBQ0QsT0FBSyxNQUFNQyxJQUFYLElBQW1CLENBQUMsTUFBTSxLQUFLUixHQUFMLENBQVNTLFdBQVQsRUFBUCxFQUErQkMsS0FBL0IsQ0FBcUMsSUFBckMsQ0FBbkIsRUFBK0Q7QUFDN0QsUUFBSUYsSUFBSSxDQUFDRyxRQUFMLENBQWNaLEtBQWQsTUFBeUJTLElBQUksQ0FBQ0csUUFBTCxDQUFjLGVBQWQsS0FBa0NILElBQUksQ0FBQ0csUUFBTCxDQUFjLGFBQWQsQ0FBM0QsQ0FBSixFQUE4RjtBQUM1RixhQUFPUCwwQkFBVVEscUJBQWpCO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPUiwwQkFBVVMscUJBQWpCO0FBQ0QsQ0FkRDs7QUF1QkFoQixRQUFRLENBQUNpQixXQUFULEdBQXVCLGVBQWVBLFdBQWYsQ0FBNEJmLEtBQTVCLEVBQW1DO0FBQ3hELFFBQU1nQixHQUFHLEdBQUcsQ0FBQyxRQUFELEVBRVYsZUFGVSxFQUVPLEdBRlAsRUFHVixJQUhVLEVBR0poQixLQUhJLEVBSVYsSUFKVSxFQUlKLGtDQUpJLEVBS1YsR0FMVSxDQUFaO0FBTUEsTUFBSWlCLE1BQU0sR0FBRyxFQUFiOztBQUNBLE1BQUk7QUFDRmQsb0JBQUllLEtBQUosQ0FBVyxlQUFjbEIsS0FBTSxxQkFBb0JnQixHQUFHLENBQUNHLElBQUosQ0FBUyxHQUFULENBQWMsV0FBakU7O0FBQ0FGLElBQUFBLE1BQU0sR0FBRyxNQUFNLEtBQUtoQixHQUFMLENBQVNtQixLQUFULENBQWVKLEdBQWYsQ0FBZjs7QUFDQWIsb0JBQUllLEtBQUosQ0FBVyxtQkFBa0JELE1BQU8sRUFBcEM7QUFDRCxHQUpELENBSUUsT0FBT0ksQ0FBUCxFQUFVO0FBQ1ZsQixvQkFBSW1CLGFBQUosQ0FBbUIsb0JBQW1CdEIsS0FBTSxzQkFBcUJxQixDQUFDLENBQUNFLE9BQVEsRUFBM0U7QUFDRDs7QUFDRCxNQUFJTixNQUFNLENBQUNMLFFBQVAsQ0FBZ0IsZ0JBQWhCLENBQUosRUFBdUM7QUFDckNULG9CQUFJbUIsYUFBSixDQUFtQixvQkFBbUJ0QixLQUFNLGtDQUE1QztBQUNEO0FBQ0YsQ0FsQkQ7O0FBcUNBRixRQUFRLENBQUMwQixTQUFULEdBQXFCLGVBQWVBLFNBQWYsQ0FBMEJ4QixLQUExQixFQUFpQ3lCLE9BQU8sR0FBRyxFQUEzQyxFQUErQztBQUNsRSxTQUFPLE1BQU0sS0FBS3hCLEdBQUwsQ0FBU3lCLFlBQVQsQ0FBc0IxQixLQUF0QixFQUE2QnlCLE9BQTdCLENBQWI7QUFDRCxDQUZEOztBQWtCQTNCLFFBQVEsQ0FBQzZCLFlBQVQsR0FBd0IsZUFBZUEsWUFBZixDQUE2QjNCLEtBQTdCLEVBQW9DeUIsT0FBTyxHQUFHLEVBQTlDLEVBQWtEO0FBQ3hFdEIsa0JBQUlDLElBQUosQ0FBVSxnQkFBZUosS0FBTSxHQUEvQjs7QUFDQSxNQUFJLEVBQUUsTUFBTSxLQUFLQyxHQUFMLENBQVNNLGFBQVQsQ0FBdUJQLEtBQXZCLENBQVIsQ0FBSixFQUE0QztBQUMxQ0csb0JBQUlDLElBQUosQ0FBVSxZQUFXSixLQUFNLGtCQUEzQjs7QUFDQSxXQUFPLEtBQVA7QUFDRDs7QUFDRCxRQUFNLEtBQUtDLEdBQUwsQ0FBUzJCLFNBQVQsQ0FBbUI1QixLQUFuQixDQUFOO0FBQ0EsUUFBTTZCLE9BQU8sR0FBR0MsY0FBS0MsUUFBTCxDQUFjTixPQUFPLENBQUNJLE9BQXRCLEtBQWtDLENBQUNHLEtBQUssQ0FBQ1AsT0FBTyxDQUFDSSxPQUFULENBQXhDLEdBQTRESSxRQUFRLENBQUNSLE9BQU8sQ0FBQ0ksT0FBVCxFQUFrQixFQUFsQixDQUFwRSxHQUE0RixHQUE1Rzs7QUFDQSxNQUFJO0FBQ0YsVUFBTSxnQ0FBaUIsWUFBWSxPQUFNLEtBQUszQixhQUFMLENBQW1CRixLQUFuQixDQUFOLEtBQW1DSywwQkFBVUcsV0FBMUUsRUFDaUI7QUFBQzBCLE1BQUFBLE1BQU0sRUFBRUwsT0FBVDtBQUFrQk0sTUFBQUEsVUFBVSxFQUFFO0FBQTlCLEtBRGpCLENBQU47QUFFRCxHQUhELENBR0UsT0FBT2QsQ0FBUCxFQUFVO0FBQ1ZsQixvQkFBSW1CLGFBQUosQ0FBbUIsSUFBR3RCLEtBQU0sNEJBQTJCNkIsT0FBUSxZQUEvRDtBQUNEOztBQUNEMUIsa0JBQUlDLElBQUosQ0FBVSxJQUFHSixLQUFNLG9DQUFuQjs7QUFDQSxTQUFPLElBQVA7QUFDRCxDQWhCRDs7QUEwQ0FGLFFBQVEsQ0FBQ3NDLFVBQVQsR0FBc0IsZUFBZUEsVUFBZixDQUEyQkMsT0FBM0IsRUFBb0NaLE9BQU8sR0FBRyxFQUE5QyxFQUFrRDtBQUN0RSxRQUFNYSxTQUFTLEdBQUcsTUFBTSxLQUFLQyxPQUFMLENBQWFDLFlBQWIsQ0FBMEJILE9BQTFCLEVBQW1DeEMsY0FBbkMsQ0FBeEI7QUFDQSxRQUFNLEtBQUtJLEdBQUwsQ0FBU3dDLE9BQVQsQ0FBaUJILFNBQWpCLEVBQTRCYixPQUE1QixDQUFOO0FBQ0QsQ0FIRDs7QUFnQkEzQixRQUFRLENBQUM0QyxjQUFULEdBQTBCLGVBQWVBLGNBQWYsQ0FBK0JDLElBQUksR0FBRyxFQUF0QyxFQUEwQztBQUNsRSxRQUFNO0FBQUMzQyxJQUFBQTtBQUFELE1BQVUyQyxJQUFoQjs7QUFDQSxNQUFJLENBQUMzQyxLQUFMLEVBQVk7QUFDVixVQUFNLElBQUk0QyxtQkFBT0Msb0JBQVgsQ0FBaUMsa0NBQWpDLENBQU47QUFDRDs7QUFDRCxRQUFNLEtBQUs1QyxHQUFMLENBQVM2QyxLQUFULENBQWU5QyxLQUFmLENBQU47QUFDRCxDQU5EOztlQVNlRixRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgQVBQX1NUQVRFIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ0BhcHBpdW0vYmFzZS1kcml2ZXInO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OUyA9IFsnLmFwaycsICcuYXBrcyddO1xuXG5sZXQgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb3Igbm90XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZFxuICovXG5jb21tYW5kcy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChhcHBJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY29ycmVzcG9uZGluZyBjb25zdGFudCwgd2hpY2ggZGVzY3JpYmVzXG4gKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBzdGF0ZTpcbiAqIDAgLSBpcyB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWRcbiAqIDEgLSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZCwgYnV0IGlzIG5vdCBydW5uaW5nXG4gKiAzIC0gaWYgdGhlIGFwcCBpcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kXG4gKiA0IC0gaWYgdGhlIGFwcCBpcyBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kXG4gKi9cbmNvbW1hbmRzLnF1ZXJ5QXBwU3RhdGUgPSBhc3luYyBmdW5jdGlvbiBxdWVyeUFwcFN0YXRlIChhcHBJZCkge1xuICBsb2cuaW5mbyhgUXVlcnlpbmcgdGhlIHN0YXRlIG9mICcke2FwcElkfSdgKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX1JVTk5JTkc7XG4gIH1cbiAgZm9yIChjb25zdCBsaW5lIG9mIChhd2FpdCB0aGlzLmFkYi5kdW1wV2luZG93cygpKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAobGluZS5pbmNsdWRlcyhhcHBJZCkgJiYgKGxpbmUuaW5jbHVkZXMoJ21DdXJyZW50Rm9jdXMnKSB8fCBsaW5lLmluY2x1ZGVzKCdtRm9jdXNlZEFwcCcpKSkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5SVU5OSU5HX0lOX0ZPUkVHUk9VTkQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9CQUNLR1JPVU5EO1xufTtcblxuLyoqXG4gKiBBY3RpdmF0ZXMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIG9yIGxhdW5jaGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIFRoZSBhY3Rpb24gaXMgZG9uZSB3aXRoIG1vbmtleSB0b29sIGFuZCBsaXRlcmFsbHkgc2ltdWxhdGVzXG4gKiBjbGlja2luZyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpY29uIG9uIHRoZSBkYXNoYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKi9cbmNvbW1hbmRzLmFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVBcHAgKGFwcElkKSB7XG4gIGNvbnN0IGNtZCA9IFsnbW9ua2V5JyxcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NDg2MDQ3NS9ob3ctdG8tdXNlLXRoZS1tb25rZXktY29tbWFuZC13aXRoLWFuLWFuZHJvaWQtc3lzdGVtLXRoYXQtZG9lc250LWhhdmUtcGh5c2ljYWxcbiAgICAnLS1wY3Qtc3lza2V5cycsICcwJyxcbiAgICAnLXAnLCBhcHBJZCxcbiAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICcxJ107XG4gIGxldCBvdXRwdXQgPSAnJztcbiAgdHJ5IHtcbiAgICBsb2cuZGVidWcoYEFjdGl2YXRpbmcgJyR7YXBwSWR9JyB3aXRoICdhZGIgc2hlbGwgJHtjbWQuam9pbignICcpfScgY29tbWFuZGApO1xuICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgbG9nLmRlYnVnKGBDb21tYW5kIHN0ZG91dDogJHtvdXRwdXR9YCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBpZiAob3V0cHV0LmluY2x1ZGVzKCdtb25rZXkgYWJvcnRlZCcpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBBcmUgeW91IHN1cmUgaXQgaXMgaW5zdGFsbGVkP2ApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVuaW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFsyMDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHVuaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBrZWVwRGF0YSBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8ga2VlcCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRhdGEgYW5kIGNhY2hlIGZvbGRlcnMgYWZ0ZXIgdW5pbnN0YWxsLlxuICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGlmIGlzIGluc3RhbGxlZC5cbiAqIFRoZSBjYWxsIGlzIGlnbm9yZWQgaWYgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgcmVtb3ZhbCBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFja2FnZSB3YXMgZm91bmQgb24gdGhlIGRldmljZSBhbmRcbiAqICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQuXG4gKi9cbmNvbW1hbmRzLnJlbW92ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGVybWluYXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSB0aW1lb3V0IFs1MDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHRlcm1pbmF0ZWQuXG4gKi9cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBhcHAgaWYgaXQgaXMgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1Rlcm1pbmF0ZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGFwcGxpY2F0aW9uIHRlcm1pbmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcHAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFwcCBoYXMgbm90IGJlZW4gdGVybWluYXRlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbmNvbW1hbmRzLnRlcm1pbmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICBsb2cuaW5mbyhgVGVybWluYXRpbmcgJyR7YXBwSWR9J2ApO1xuICBpZiAoIShhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGFwcCAnJHthcHBJZH0nIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcChhcHBJZCk7XG4gIGNvbnN0IHRpbWVvdXQgPSB1dGlsLmhhc1ZhbHVlKG9wdGlvbnMudGltZW91dCkgJiYgIWlzTmFOKG9wdGlvbnMudGltZW91dCkgPyBwYXJzZUludChvcHRpb25zLnRpbWVvdXQsIDEwKSA6IDUwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShhcHBJZCkgPD0gQVBQX1NUQVRFLk5PVF9SVU5OSU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAge3dhaXRNczogdGltZW91dCwgaW50ZXJ2YWxNczogMTAwfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgJyR7YXBwSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgbG9nLmluZm8oYCcke2FwcElkfScgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWRgKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBsb2NhbCBhcGsgcGF0aCBvciBhIHJlbW90ZSB1cmxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBpbnN0YWxsYXRpb24gb3B0aW9uc1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBnaXZlbiBhcGsgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWNoYWJsZVxuICovXG5jb21tYW5kcy5pbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwcCAoYXBwUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwUGF0aCwgQVBQX0VYVEVOU0lPTlMpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGxvY2FsUGF0aCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENsZWFyQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfSBhcHBJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBiZSBjbGVhcmVkXG4gKi9cblxuLyoqXG4gKiBEZWxldGVzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtDbGVhckFwcE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjbGVhbmluZyBvZiB0aGUgYXBwIGRhdGEgZmFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2xlYXJBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDbGVhckFwcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthcHBJZH0gPSBvcHRzO1xuICBpZiAoIWFwcElkKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdhcHBJZCcgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5jbGVhcihhcHBJZCk7XG59O1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.helpers = exports.default = exports.commands = void 0;
|
|
9
|
-
exports.parseSurfaceLine = parseSurfaceLine;
|
|
10
|
-
exports.parseWindows = parseWindows;
|
|
11
9
|
|
|
12
10
|
require("source-map-support/register");
|
|
13
11
|
|
|
@@ -315,66 +313,6 @@ commands.getDisplayDensity = async function getDisplayDensity() {
|
|
|
315
313
|
_logger.default.errorAndThrow('Failed to get display density property.');
|
|
316
314
|
};
|
|
317
315
|
|
|
318
|
-
function parseSurfaceLine(line) {
|
|
319
|
-
let bounds = line.split('rect=')[1].replace(/[(), x]+/g, ' ').trim().split(' ');
|
|
320
|
-
return {
|
|
321
|
-
visible: line.indexOf('shown=true') !== -1,
|
|
322
|
-
x: parseFloat(bounds[0]),
|
|
323
|
-
y: parseFloat(bounds[1]),
|
|
324
|
-
width: parseFloat(bounds[2]),
|
|
325
|
-
height: parseFloat(bounds[3])
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
function parseWindows(lines) {
|
|
330
|
-
let atStatusBar = false;
|
|
331
|
-
let atNavBar = false;
|
|
332
|
-
let statusBar;
|
|
333
|
-
let navigationBar;
|
|
334
|
-
lines.split('\n').forEach(line => {
|
|
335
|
-
if (line.indexOf(' Window #') !== -1) {
|
|
336
|
-
atStatusBar = line.indexOf('StatusBar') !== -1;
|
|
337
|
-
atNavBar = line.indexOf('NavigationBar') !== -1;
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
if (line.indexOf(' Surface:') === -1) {
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
if (atStatusBar) {
|
|
346
|
-
statusBar = parseSurfaceLine(line);
|
|
347
|
-
atStatusBar = false;
|
|
348
|
-
} else if (atNavBar) {
|
|
349
|
-
navigationBar = parseSurfaceLine(line);
|
|
350
|
-
atNavBar = false;
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
if (!statusBar) {
|
|
355
|
-
_logger.default.errorAndThrow('Failed to parse status bar information.');
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (!navigationBar) {
|
|
359
|
-
_logger.default.errorAndThrow('Failed to parse navigation bar information.');
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
return {
|
|
363
|
-
statusBar,
|
|
364
|
-
navigationBar
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
commands.getSystemBars = async function getSystemBars() {
|
|
369
|
-
let out = await this.adb.shell(['dumpsys', 'window', 'windows']);
|
|
370
|
-
|
|
371
|
-
if (!out) {
|
|
372
|
-
_logger.default.errorAndThrow('Did not get window manager output.');
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
return parseWindows(out);
|
|
376
|
-
};
|
|
377
|
-
|
|
378
316
|
commands.mobilePerformEditorAction = async function mobilePerformEditorAction(opts = {}) {
|
|
379
317
|
const {
|
|
380
318
|
action
|
|
@@ -493,4 +431,4 @@ var _default = extensions;
|
|
|
493
431
|
exports.default = _default;require('source-map-support').install();
|
|
494
432
|
|
|
495
433
|
|
|
496
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbIk1PTUVOVF9GT1JNQVRfSVNPODYwMSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJpc0tleWJvYXJkU2hvd24iLCJpc1NvZnRLZXlib2FyZFByZXNlbnQiLCJoaWRlS2V5Ym9hcmQiLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJwYXJzZVN1cmZhY2VMaW5lIiwibGluZSIsImJvdW5kcyIsInZpc2libGUiLCJpbmRleE9mIiwicGFyc2VGbG9hdCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwiYXRTdGF0dXNCYXIiLCJhdE5hdkJhciIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJmb3JFYWNoIiwiZ2V0U3lzdGVtQmFycyIsIm1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24iLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwiUEVSTUlTU0lPTl9BQ1RJT04iLCJHUkFOVCIsIlJFVk9LRSIsIm1vYmlsZUNoYW5nZVBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhY3Rpb25GdW5jIiwidG9Mb3dlciIsInBlcm1pc3Npb24iLCJncmFudFBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwidmFsdWVzIiwiUEVSTUlTU0lPTlNfVFlQRSIsIkRFTklFRCIsIkdSQU5URUQiLCJSRVFVRVNURUQiLCJtb2JpbGVHZXRQZXJtaXNzaW9ucyIsInR5cGUiLCJnZXRSZXFQZXJtaXNzaW9ucyIsImdldEdyYW50ZWRQZXJtaXNzaW9ucyIsImdldERlbmllZFBlcm1pc3Npb25zIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInN0cmF0ZWd5IiwidGltZW91dE1zIiwidW5sb2NrIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxxQkFBcUIsR0FBRyxzQkFBOUI7QUFFQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjtBQUFBLElBQW1CQyxPQUFPLEdBQUcsRUFBN0I7QUFBQSxJQUFpQ0MsVUFBVSxHQUFHLEVBQTlDOzs7O0FBRUFGLFFBQVEsQ0FBQ0csSUFBVCxHQUFnQixlQUFlQSxJQUFmLENBQXFCQSxJQUFyQixFQUEyQjtBQUV6Q0EsRUFBQUEsSUFBSSxHQUFHQyxnQkFBRUMsT0FBRixDQUFVRixJQUFW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U3NKLGdCQUFULEVBQWI7QUFDRCxDQUZEOztBQWlCQTFLLFFBQVEsQ0FBQzJLLGFBQVQsR0FBeUIsZUFBZUEsYUFBZixDQUE4QmpLLElBQUksR0FBRyxFQUFyQyxFQUF5QztBQUNoRSxTQUFPLE1BQU0sS0FBS1UsR0FBTCxDQUFTd0osVUFBVCxDQUFvQmxLLElBQXBCLENBQWI7QUFDRCxDQUZEOztBQXlCQVYsUUFBUSxDQUFDNkssWUFBVCxHQUF3QixlQUFlQSxZQUFmLENBQTZCbkssSUFBSSxHQUFHLEVBQXBDLEVBQXdDO0FBQzlELFFBQU07QUFBRTRGLElBQUFBLEdBQUY7QUFBTytELElBQUFBLElBQVA7QUFBYVMsSUFBQUEsUUFBYjtBQUF1QkMsSUFBQUE7QUFBdkIsTUFBcUNySyxJQUEzQztBQUNBLFFBQU1pRyx3QkFBZXFFLE1BQWYsQ0FBc0IsSUFBdEIsRUFBNEIsS0FBSzVKLEdBQWpDLEVBQXNDO0FBQzFDNkosSUFBQUEsU0FBUyxFQUFFM0UsR0FEK0I7QUFFMUM0RSxJQUFBQSxVQUFVLEVBQUViLElBRjhCO0FBRzFDYyxJQUFBQSxjQUFjLEVBQUVMLFFBSDBCO0FBSTFDTSxJQUFBQSxvQkFBb0IsRUFBRUw7QUFKb0IsR0FBdEMsQ0FBTjtBQU1ELENBUkQ7O0FBVUExRCxNQUFNLENBQUNDLE1BQVAsQ0FBY3BILFVBQWQsRUFBMEJGLFFBQTFCLEVBQW9DQyxPQUFwQztlQUVlQyxVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IE1PTUVOVF9GT1JNQVRfSVNPODYwMSA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMua2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGtleXMgKGtleXMpIHtcbiAgLy8gUHJvdG9jb2wgc2VuZHMgYW4gYXJyYXk7IHJldGhpbmsgYXBwcm9hY2hcbiAga2V5cyA9IF8uaXNBcnJheShrZXlzKSA/IGtleXMuam9pbignJykgOiBrZXlzO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIHRleHQ6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2VcbiAgfTtcbiAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQpIHtcbiAgICBwYXJhbXMudW5pY29kZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBhd2FpdCB0aGlzLmRvU2VuZEtleXMocGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiBkb1NlbmRLZXlzIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3NldFRleHQnLCBwYXJhbXMpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgdGltZXN0YW1wLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgc2V0IG9mIGZvcm1hdCBzcGVjaWZpZXJzLiBSZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tb21lbnRqcy5jb20vZG9jcy8gdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUgZm9ybWF0IHNwZWNpZmllcnMuIFRoZSBkZWZhdWx0IGZvcm1hdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAsIHdoaWNoIGNvbXBsaWVzIHRvIElTTy04NjAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLmdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VUaW1lIChmb3JtYXQgPSBNT01FTlRfRk9STUFUX0lTTzg2MDEpIHtcbiAgbG9nLmRlYnVnKCdBdHRlbXB0aW5nIHRvIGNhcHR1cmUgYW5kcm9pZCBkZXZpY2UgZGF0ZSBhbmQgdGltZS4gJyArXG4gICAgYFRoZSBmb3JtYXQgc3BlY2lmaWVyIGlzICcke2Zvcm1hdH0nYCk7XG4gIGNvbnN0IGRldmljZVRpbWVzdGFtcCA9IChhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2RhdGUnLCAnKyVZLSVtLSVkVCVUJXonXSkpLnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIGxvZy53YXJuKCdDYW5ub3QgcGFyc2UgdGhlIHJldHVybmVkIHRpbWVzdGFtcC4gUmV0dXJuaW5nIGFzIGlzJyk7XG4gICAgcmV0dXJuIGRldmljZVRpbWVzdGFtcDtcbiAgfVxuICByZXR1cm4gcGFyc2VkVGltZXN0YW1wLnV0Y09mZnNldChwYXJzZWRUaW1lc3RhbXAuX3R6bSB8fCAwKS5mb3JtYXQoZm9ybWF0KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlVGltZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgW1lZWVktTU0tRERUSEg6bW06c3NaXSAtIFNlZSBnZXREZXZpY2VUaW1lI2Zvcm1hdFxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRldmljZSB0aW1lXG4gKlxuICogQHBhcmFtIHtEZXZpY2VUaW1lT3B0aW9uc30gb3B0c1xuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlVGltZSAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVRpbWUob3B0cy5mb3JtYXQpO1xufTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VTb3VyY2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc291cmNlJyk7XG59O1xuXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0JhY2snKTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIGNvbnN0IHtpc0tleWJvYXJkU2hvd259ID0gYXdhaXQgdGhpcy5hZGIuaXNTb2Z0S2V5Ym9hcmRQcmVzZW50KCk7XG4gIHJldHVybiBpc0tleWJvYXJkU2hvd247XG59O1xuXG5jb21tYW5kcy5oaWRlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBoaWRlS2V5Ym9hcmQgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaGlkZUtleWJvYXJkKCk7XG59O1xuXG5jb21tYW5kcy5vcGVuU2V0dGluZ3NBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc0FjdGl2aXR5IChzZXR0aW5nKSB7XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2FtJywgJ3N0YXJ0JywgJy1hJywgYGFuZHJvaWQuc2V0dGluZ3MuJHtzZXR0aW5nfWBdKTtcbiAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2dldERldmljZVNpemUnKTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dSZWN0ICgpIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50QWN0aXZpdHkgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwQWN0aXZpdHk7XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50UGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRQYWNrYWdlICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcFBhY2thZ2U7XG59O1xuXG5jb21tYW5kcy5iYWNrZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gYmFja2dyb3VuZCAoc2Vjb25kcykge1xuICBpZiAoc2Vjb25kcyA8IDApIHtcbiAgICAvLyBpZiB1c2VyIHBhc3NlcyBpbiBhIG5lZ2F0aXZlIHNlY29uZHMgdmFsdWUsIGludGVycHJldCB0aGF0IGFzIHRoZSBpbnN0cnVjdGlvblxuICAgIC8vIHRvIG5vdCBicmluZyB0aGUgYXBwIGJhY2sgYXQgYWxsXG4gICAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcblxuICAvLyBwZW9wbGUgY2FuIHdhaXQgZm9yIGEgbG9uZyB0aW1lLCBzbyB0byBiZSBzYWZlIGxldCdzIHVzZSB0aGUgbG9uZ1NsZWVwIGZ1bmN0aW9uIGFuZCBsb2dcbiAgLy8gcHJvZ3Jlc3MgcGVyaW9kaWNhbGx5LlxuICBjb25zdCBzbGVlcE1zID0gc2Vjb25kcyAqIDEwMDA7XG4gIGNvbnN0IHRocmVzaG9sZE1zID0gMzAgKiAxMDAwOyAvLyB1c2UgdGhlIHNwaW4td2FpdCBmb3IgYW55dGhpbmcgb3ZlciB0aGlzIHRocmVzaG9sZFxuICAvLyBmb3Igb3VyIHNwaW4gaW50ZXJ2YWwsIHVzZSAxJSBvZiB0aGUgdG90YWwgd2FpdCB0aW1lLCBidXQgbm90aGluZyBiaWdnZXIgdGhhbiAzMHNcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IF8ubWluKFszMCAqIDEwMDAsIHBhcnNlSW50KHNsZWVwTXMgLyAxMDAsIDEwKV0pO1xuICBjb25zdCBwcm9ncmVzc0NiID0gKHtlbGFwc2VkTXMsIHByb2dyZXNzfSkgPT4ge1xuICAgIGNvbnN0IHdhaXRTZWNzID0gKGVsYXBzZWRNcyAvIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NQY3QgPSAocHJvZ3Jlc3MgKiAxMDApLnRvRml4ZWQoMik7XG4gICAgbG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQWN0aXZhdGluZyBhcHAgJyR7YXBwUGFja2FnZX0nIGluIG9yZGVyIHRvIHJlc3RvcmUgaXRgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwUGFja2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgYXJncyA9ICgoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkgPT09IHRoaXMub3B0cy5hcHBBY3Rpdml0eSkgfHxcbiAgICAgICAgICAgIChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UgJiYgKHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHkgfHwgJycpLnNwbGl0KCcsJykuaW5jbHVkZXMoYXBwQWN0aXZpdHkpKSlcbiAgICAgID8gey8vIHRoZSBhY3Rpdml0eSBpcyB0aGUgb3JpZ2luYWwgc2Vzc2lvbiBhY3Rpdml0eSwgc28gdXNlIHRoZSBvcmlnaW5hbCBhcmdzXG4gICAgICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICAgICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICAgICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgICAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgICAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGV9XG4gICAgICA6IHsvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgc29tZSBvdGhlciB3YXksIHNvIHVzZSBkZWZhdWx0c1xuICAgICAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgd2FpdFBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICAgICAgc3RvcEFwcDogZmFsc2V9O1xuICB9XG4gIGFyZ3MgPSBhd2FpdCB1dGlsLmZpbHRlck9iamVjdChhcmdzKTtcbiAgbG9nLmRlYnVnKGBCcmluZ2luZyBhcHBsaWNhdGlvbiBiYWNrIHRvIGZvcmVncm91bmQgd2l0aCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBnZXRTdHJpbmdzIChsYW5ndWFnZSkge1xuICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmFkYi5nZXREZXZpY2VMYW5ndWFnZSgpO1xuICAgIGxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIGxvZy5kZWJ1ZyhgU3RhcnRpbmcgcGFja2FnZSAnJHthcHBQYWNrYWdlfScgYW5kIGFjdGl2aXR5ICcke2FwcEFjdGl2aXR5fSdgKTtcblxuICAvLyBkb250U3RvcEFwcE9uUmVzZXQgaXMgYm90aCBhbiBhcmd1bWVudCBoZXJlLCBhbmQgYSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAgLy8gaWYgdGhlIGFyZ3VtZW50IGlzIHNldCwgdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBjYXBcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGRvbnRTdG9wQXBwT25SZXNldCkpIHtcbiAgICBkb250U3RvcEFwcE9uUmVzZXQgPSAhIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQ7XG4gIH1cblxuICBsZXQgYXJncyA9IHtcbiAgICBwa2c6IGFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgIHdhaXRQa2c6IGFwcFdhaXRQYWNrYWdlIHx8IGFwcFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiBhcHBXYWl0QWN0aXZpdHkgfHwgYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiBpbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IGludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiBpbnRlbnRGbGFncyxcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhZG9udFN0b3BBcHBPblJlc2V0XG4gIH07XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyA9IHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyB8fCB7fTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FyZ3Mud2FpdFBrZ30vJHthcmdzLndhaXRBY3Rpdml0eX1gXSA9IGFyZ3M7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMucmVzZXQgPSBhc3luYyBmdW5jdGlvbiByZXNldCAoKSB7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnJlc2V0QXBwKHRoaXMuYWRiLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIHtmYXN0UmVzZXQ6IHRydWV9KSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaXNDaHJvbWVTZXNzaW9uID8gdGhpcy5zdGFydENocm9tZVNlc3Npb24oKSA6IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QVVUID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBVVQgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcCh7XG4gICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogdGhpcy5vcHRzLmludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgd2FpdFBrZzogdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICB3YWl0RHVyYXRpb246IHRoaXMub3B0cy5hcHBXYWl0RHVyYXRpb24sXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICBzdG9wQXBwOiAhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldCxcbiAgICB1c2VyOiB0aGlzLm9wdHMudXNlclByb2ZpbGUsXG4gIH0pO1xufTtcblxuLy8gd2Ugb3ZlcnJpZGUgc2V0VXJsIHRvIHRha2UgYW4gYW5kcm9pZCBVUkkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZXAtbGlua2luZ1xuLy8gaW5zaWRlIGFuIGFwcCwgc2ltaWxhciB0byBzdGFydGluZyBhbiBpbnRlbnRcbmNvbW1hbmRzLnNldFVybCA9IGFzeW5jIGZ1bmN0aW9uIHNldFVybCAodXJpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0VXJpKHVyaSwgdGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xufTtcblxuLy8gY2xvc2luZyBhcHAgdXNpbmcgZm9yY2Ugc3RvcFxuY29tbWFuZHMuY2xvc2VBcHAgPSBhc3luYyBmdW5jdGlvbiBjbG9zZUFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcCh0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG4gIC8vIHJlc2V0IGNvbnRleHQgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb24gY29udGV4dCB3ZSB3aWxsIGVuZCB1cCBhZnRlciBhcHAgbGF1bmNoLlxuICBhd2FpdCB0aGlzLnNldENvbnRleHQoKTtcbn07XG5cbmNvbW1hbmRzLmdldERpc3BsYXlEZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcGxheURlbnNpdHkgKCkge1xuICAvLyBmaXJzdCB0cnkgdGhlIHByb3BlcnR5IGZvciBkZXZpY2VzXG4gIGxldCBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncm8uc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIE5hTiwgdHJ5IGdldHRpbmcgdGhlIGVtdWxhdG9yIHByb3BlcnR5XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBmYWxsYmFjayB0byB0cnlpbmcgcHJvcGVydHkgZm9yIGVtdWxhdG9yc1xuICBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncWVtdS5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIGxvZy5lcnJvckFuZFRocm93KCdGYWlsZWQgdG8gZ2V0IGRpc3BsYXkgZGVuc2l0eSBwcm9wZXJ0eS4nKTtcbn07XG5cbi8qKlxuICogUGFyc2VzIHRoZSBnaXZlbiB3aW5kb3cgbWFuYWdlciBTdXJmYWNlIHN0cmluZyB0byBnZXQgaW5mby5cbiAqIEBwYXJhbSBsaW5lOiBUbyBwYXJzZS4gVGhpcyBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkLlxuICogQHJldHVybjogVmlzaWJpbGl0eSBhbmQgYm91bmRzIG9mIHRoZSBTdXJmYWNlLlxuICovXG5mdW5jdGlvbiBwYXJzZVN1cmZhY2VMaW5lIChsaW5lKSB7XG4gIC8vIHRoZSBzdXJmYWNlIGJvdW5kcyBhcmUgaW4gdGhlIGZvcm1hdDpcbiAgLy8gXCJyZWN0PSgwLjAsMTE4NC4wKSA3NjguMCB4IDk2LjBcIlxuICAvLyAgICAgICBeIGxvY2F0aW9uICAgXiBzaXplXG4gIC8vIGN1dCBvdXQgdGhlIHN0dWZmIGJlZm9yZSB0aGUgJ3JlY3QnIGFuZCB0aGVuIHNwbGl0IHRoZSBudW1iZXJzIGFwYXJ0XG4gIGxldCBib3VuZHMgPSBsaW5lLnNwbGl0KCdyZWN0PScpWzFdXG4gIC5yZXBsYWNlKC9bKCksIHhdKy9nLCAnICcpXG4gIC50cmltKClcbiAgLnNwbGl0KCcgJyk7XG5cbiAgcmV0dXJuIHtcbiAgICB2aXNpYmxlOiAobGluZS5pbmRleE9mKCdzaG93bj10cnVlJykgIT09IC0xKSxcbiAgICB4OiBwYXJzZUZsb2F0KGJvdW5kc1swXSksXG4gICAgeTogcGFyc2VGbG9hdChib3VuZHNbMV0pLFxuICAgIHdpZHRoOiBwYXJzZUZsb2F0KGJvdW5kc1syXSksXG4gICAgaGVpZ2h0OiBwYXJzZUZsb2F0KGJvdW5kc1szXSlcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dC5cbiAqIEBwYXJhbSBsaW5lczogT3V0cHV0IGZyb20gZHVtcHN5cyBjb21tYW5kXG4gKiBAcmV0dXJuOiBWaXNpYmlsaXR5IGFuZCBib3VuZHMgaW5mbyBvZiBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyXG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2luZG93cyAobGluZXMpIHtcbiAgbGV0IGF0U3RhdHVzQmFyID0gZmFsc2U7XG4gIGxldCBhdE5hdkJhciA9IGZhbHNlO1xuICBsZXQgc3RhdHVzQmFyO1xuICBsZXQgbmF2aWdhdGlvbkJhcjtcbiAgLy8gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dCBsb29rcyBsaWtlOlxuICAvLyBXaW5kb3cgIzEgLi4uIFdpbmRvd0lEXG4gIC8vICAgQSBidW5jaCBvZiBwcm9wZXJ0aWVzXG4gIC8vIFdpbmRvdyAjMiAuLi4gV2luZG93SURcbiAgLy8gICBBIGJ1bmNoIG9mIHByb3BlcnRpZXNcbiAgbGluZXMuc3BsaXQoJ1xcbicpLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICAvLyB0aGUgc3RhcnQgb2YgYSBuZXcgd2luZG93IHNlY3Rpb25cbiAgICBpZiAobGluZS5pbmRleE9mKCcgIFdpbmRvdyAjJykgIT09IC0xKSB7XG4gICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggc2VjdGlvbiB3ZSdyZSBpblxuICAgICAgLy8gb25seSBvbmUgd2lsbCBiZSB0cnVlXG4gICAgICBhdFN0YXR1c0JhciA9IChsaW5lLmluZGV4T2YoJ1N0YXR1c0JhcicpICE9PSAtMSk7XG4gICAgICBhdE5hdkJhciA9IChsaW5lLmluZGV4T2YoJ05hdmlnYXRpb25CYXInKSAhPT0gLTEpO1xuICAgICAgLy8gZG9uJ3QgbmVlZCBhbnl0aGluZyBlbHNlLiBtb3ZlIHRvIG5leHQgbGluZVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBvbmNlIHdlJ3JlIGluIGEgd2luZG93IHNlY3Rpb24sIGxvb2sgZm9yIHRoZSBzdXJmYWNlIGRhdGEgbGluZVxuICAgIGlmIChsaW5lLmluZGV4T2YoJyAgICAgIFN1cmZhY2U6JykgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhdFN0YXR1c0Jhcikge1xuICAgICAgc3RhdHVzQmFyID0gcGFyc2VTdXJmYWNlTGluZShsaW5lKTtcbiAgICAgIGF0U3RhdHVzQmFyID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChhdE5hdkJhcikge1xuICAgICAgbmF2aWdhdGlvbkJhciA9IHBhcnNlU3VyZmFjZUxpbmUobGluZSk7XG4gICAgICBhdE5hdkJhciA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCFzdGF0dXNCYXIpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdygnRmFpbGVkIHRvIHBhcnNlIHN0YXR1cyBiYXIgaW5mb3JtYXRpb24uJyk7XG4gIH1cbiAgaWYgKCFuYXZpZ2F0aW9uQmFyKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBwYXJzZSBuYXZpZ2F0aW9uIGJhciBpbmZvcm1hdGlvbi4nKTtcbiAgfVxuXG4gIHJldHVybiB7c3RhdHVzQmFyLCBuYXZpZ2F0aW9uQmFyfTtcbn1cblxuY29tbWFuZHMuZ2V0U3lzdGVtQmFycyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN5c3RlbUJhcnMgKCkge1xuICBsZXQgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdycsICd3aW5kb3dzJ10pO1xuICBpZiAoIW91dCkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCdEaWQgbm90IGdldCB3aW5kb3cgbWFuYWdlciBvdXRwdXQuJyk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlV2luZG93cyhvdXQpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYCdhY3Rpb24nIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmFkYi5wZXJmb3JtRWRpdG9yQWN0aW9uKGFjdGlvbik7XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OX0FDVElPTiA9IHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIE1hbmRhdG9yeSBhcmd1bWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnRdIC0gT25lIG9mIGBQRVJNSVNTSU9OX0FDVElPTmAgdmFsdWVzXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsXG4gIH0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUocGVybWlzc2lvbnMpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGxldCBhY3Rpb25GdW5jO1xuICBzd2l0Y2ggKF8udG9Mb3dlcihhY3Rpb24pKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSwgcGVybWlzc2lvbikgPT4gdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9uKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OX0FDVElPTi5SRVZPS0U6XG4gICAgICBhY3Rpb25GdW5jID0gKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgcGVybWlzc2lvbik7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiAoXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXSkpIHtcbiAgICBhd2FpdCBhY3Rpb25GdW5jKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pO1xuICB9XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0ge1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuREVOSUVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVW5rbm93biBwZXJtaXNzaW9ucyB0eXBlICcke3R5cGV9Jy4gYCArXG4gICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTlNfVFlQRSkpfSB0eXBlcyBhcmUgc3VwcG9ydGVkYCk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IFRoZSB1bmxvY2sga2V5LiBUaGUgdmFsdWUgb2YgdGhpcyBrZXkgZGVwZW5kc1xuICogb24gdGhlIGFjdHVhbCB1bmxvY2sgdHlwZSBhbmQgY291bGQgYmUgYSBwaW4vcGFzc3dvcmQvcGF0dGVybiB2YWx1ZSBvclxuICogYSBiaW9tZXRyaWMgZmluZ2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHVubG9jayB0eXBlLiBUaGUgZm9sbG93aW5nIHVubG9jayB0eXBlc1xuICogYXJlIHN1cHBvcnRlZDogYHBpbmAsIGBwaW5XaXRoS2V5RXZlbnRgLCBgcGFzc3dvcmRgLCBgcGF0dGVybmAgYW5kIGBmaW5nZXJwcmludGAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0cmF0ZWd5IEVpdGhlciAnbG9ja3NldHRpbmdzJyAoZGVmYXVsdCkgb3IgJ3VpYXV0b21hdG9yJy5cbiAqIFNldHRpbmcgaXQgdG8gJ3VpYXV0b21hdG9yJyB3aWxsIGVuZm9yY2UgdGhlIGRyaXZlciB0byBhdm9pZCB1c2luZyBzcGVjaWFsXG4gKiBBREIgc2hvcnRjdXRzIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSB1bmxvY2sgcHJvY2VkdXJlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDBdIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBzY3JlZW4gZ2V0cyB1bmxvY2tlZFxuICovXG5cbi8qKlxuICogVW5sb2NrcyB0aGUgZGV2aWNlIGlmIGl0IGlzIGxvY2tlZC4gTm9vcCBpZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGlzIG5vdCBsb2NrZWQuXG4gKlxuICogQHBhcmFtIHs/VW5sb2NrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHVubG9jayBvcGVyYXRpb24gZmFpbHMgb3IgdGhlIHByb3ZpZGVkXG4gKiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVbmxvY2sgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGtleSwgdHlwZSwgc3RyYXRlZ3ksIHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB7XG4gICAgdW5sb2NrS2V5OiBrZXksXG4gICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICB1bmxvY2tTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHRpbWVvdXRNcyxcbiAgfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuLy8gZm9yIHVuaXQgdGVzdHNcbmV4cG9ydCB7IHBhcnNlV2luZG93cywgcGFyc2VTdXJmYWNlTGluZSB9O1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
434
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbIk1PTUVOVF9GT1JNQVRfSVNPODYwMSIsImNvbW1hbmRzIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJpc0tleWJvYXJkU2hvd24iLCJpc1NvZnRLZXlib2FyZFByZXNlbnQiLCJoaWRlS2V5Ym9hcmQiLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWN0aW9uRnVuYyIsInRvTG93ZXIiLCJwZXJtaXNzaW9uIiwiZ3JhbnRQZXJtaXNzaW9uIiwicmV2b2tlUGVybWlzc2lvbiIsInZhbHVlcyIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJnZXREZW5pZWRQZXJtaXNzaW9ucyIsIm1vYmlsZUdldE5vdGlmaWNhdGlvbnMiLCJnZXROb3RpZmljYXRpb25zIiwibW9iaWxlTGlzdFNtcyIsImdldFNtc0xpc3QiLCJtb2JpbGVVbmxvY2siLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHFCQUFxQixHQUFHLHNCQUE5QjtBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmO0FBQUEsSUFBbUJDLE9BQU8sR0FBRyxFQUE3QjtBQUFBLElBQWlDQyxVQUFVLEdBQUcsRUFBOUM7Ozs7QUFFQUYsUUFBUSxDQUFDRyxJQUFULEdBQWdCLGVBQWVBLElBQWYsQ0FBcUJBLElBQXJCLEVBQTJCO0FBRXpDQSxFQUFBQSxJQUFJLEdBQUdDLGdCQUFFQyxPQUFGLENBQVVGLElBQVYsSUFBa0JBLElBQUksQ0FBQ0csSUFBTCxDQUFVLEVBQVYsQ0FBbEIsR0FBa0NILElBQXpDO0FBQ0EsTUFBSUksTUFBTSxHQUFHO0FBQ1hDLElBQUFBLElBQUksRUFBRUwsSUFESztBQUVYTSxJQUFBQSxPQUFPLEVBQUU7QUFGRSxHQUFiOztBQUlBLE1BQUksS0FBS0MsSUFBTCxDQUFVQyxlQUFkLEVBQStC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QVQsRUFBYjtBQUNELENBRkQ7O0FBaUJBNUosUUFBUSxDQUFDNkosYUFBVCxHQUF5QixlQUFlQSxhQUFmLENBQThCbkosSUFBSSxHQUFHLEVBQXJDLEVBQXlDO0FBQ2hFLFNBQU8sTUFBTSxLQUFLVSxHQUFMLENBQVMwSSxVQUFULENBQW9CcEosSUFBcEIsQ0FBYjtBQUNELENBRkQ7O0FBeUJBVixRQUFRLENBQUMrSixZQUFULEdBQXdCLGVBQWVBLFlBQWYsQ0FBNkJySixJQUFJLEdBQUcsRUFBcEMsRUFBd0M7QUFDOUQsUUFBTTtBQUFFNEYsSUFBQUEsR0FBRjtBQUFPaUQsSUFBQUEsSUFBUDtBQUFhUyxJQUFBQSxRQUFiO0FBQXVCQyxJQUFBQTtBQUF2QixNQUFxQ3ZKLElBQTNDO0FBQ0EsUUFBTWlHLHdCQUFldUQsTUFBZixDQUFzQixJQUF0QixFQUE0QixLQUFLOUksR0FBakMsRUFBc0M7QUFDMUMrSSxJQUFBQSxTQUFTLEVBQUU3RCxHQUQrQjtBQUUxQzhELElBQUFBLFVBQVUsRUFBRWIsSUFGOEI7QUFHMUNjLElBQUFBLGNBQWMsRUFBRUwsUUFIMEI7QUFJMUNNLElBQUFBLG9CQUFvQixFQUFFTDtBQUpvQixHQUF0QyxDQUFOO0FBTUQsQ0FSRDs7QUFVQTVDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjcEgsVUFBZCxFQUEwQkYsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVDLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFuZHJvaWRIZWxwZXJzIGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGxvbmdTbGVlcCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICBsb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gY2FwdHVyZSBhbmRyb2lkIGRldmljZSBkYXRlIGFuZCB0aW1lLiAnICtcbiAgICBgVGhlIGZvcm1hdCBzcGVjaWZpZXIgaXMgJyR7Zm9ybWF0fSdgKTtcbiAgY29uc3QgZGV2aWNlVGltZXN0YW1wID0gKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZGF0ZScsICcrJVktJW0tJWRUJVQleiddKSkudHJpbSgpO1xuICBsb2cuZGVidWcoYEdvdCBkZXZpY2UgdGltZXN0YW1wOiAke2RldmljZVRpbWVzdGFtcH1gKTtcbiAgY29uc3QgcGFyc2VkVGltZXN0YW1wID0gbW9tZW50LnV0YyhkZXZpY2VUaW1lc3RhbXAsICdZWVlZLU1NLUREVEhIOm1tOnNzWlonKTtcbiAgaWYgKCFwYXJzZWRUaW1lc3RhbXAuaXNWYWxpZCgpKSB7XG4gICAgbG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMuaXNLZXlib2FyZFNob3duID0gYXN5bmMgZnVuY3Rpb24gaXNLZXlib2FyZFNob3duICgpIHtcbiAgY29uc3Qge2lzS2V5Ym9hcmRTaG93bn0gPSBhd2FpdCB0aGlzLmFkYi5pc1NvZnRLZXlib2FyZFByZXNlbnQoKTtcbiAgcmV0dXJuIGlzS2V5Ym9hcmRTaG93bjtcbn07XG5cbmNvbW1hbmRzLmhpZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGhpZGVLZXlib2FyZCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5oaWRlS2V5Ym9hcmQoKTtcbn07XG5cbmNvbW1hbmRzLm9wZW5TZXR0aW5nc0FjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzQWN0aXZpdHkgKHNldHRpbmcpIHtcbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnYW0nLCAnc3RhcnQnLCAnLWEnLCBgYW5kcm9pZC5zZXR0aW5ncy4ke3NldHRpbmd9YF0pO1xuICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xufTtcblxuY29tbWFuZHMuZ2V0V2luZG93U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1NpemUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZ2V0RGV2aWNlU2l6ZScpO1xufTtcblxuLy8gRm9yIFczQ1xuY29tbWFuZHMuZ2V0V2luZG93UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFdpbmRvd1JlY3QgKCkge1xuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRBY3Rpdml0eSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBBY3Rpdml0eTtcbn07XG5cbmNvbW1hbmRzLmdldEN1cnJlbnRQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudFBhY2thZ2UgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwUGFja2FnZTtcbn07XG5cbmNvbW1hbmRzLmJhY2tncm91bmQgPSBhc3luYyBmdW5jdGlvbiBiYWNrZ3JvdW5kIChzZWNvbmRzKSB7XG4gIGlmIChzZWNvbmRzIDwgMCkge1xuICAgIC8vIGlmIHVzZXIgcGFzc2VzIGluIGEgbmVnYXRpdmUgc2Vjb25kcyB2YWx1ZSwgaW50ZXJwcmV0IHRoYXQgYXMgdGhlIGluc3RydWN0aW9uXG4gICAgLy8gdG8gbm90IGJyaW5nIHRoZSBhcHAgYmFjayBhdCBhbGxcbiAgICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5nb1RvSG9tZSgpO1xuXG4gIC8vIHBlb3BsZSBjYW4gd2FpdCBmb3IgYSBsb25nIHRpbWUsIHNvIHRvIGJlIHNhZmUgbGV0J3MgdXNlIHRoZSBsb25nU2xlZXAgZnVuY3Rpb24gYW5kIGxvZ1xuICAvLyBwcm9ncmVzcyBwZXJpb2RpY2FsbHkuXG4gIGNvbnN0IHNsZWVwTXMgPSBzZWNvbmRzICogMTAwMDtcbiAgY29uc3QgdGhyZXNob2xkTXMgPSAzMCAqIDEwMDA7IC8vIHVzZSB0aGUgc3Bpbi13YWl0IGZvciBhbnl0aGluZyBvdmVyIHRoaXMgdGhyZXNob2xkXG4gIC8vIGZvciBvdXIgc3BpbiBpbnRlcnZhbCwgdXNlIDElIG9mIHRoZSB0b3RhbCB3YWl0IHRpbWUsIGJ1dCBub3RoaW5nIGJpZ2dlciB0aGFuIDMwc1xuICBjb25zdCBpbnRlcnZhbE1zID0gXy5taW4oWzMwICogMTAwMCwgcGFyc2VJbnQoc2xlZXBNcyAvIDEwMCwgMTApXSk7XG4gIGNvbnN0IHByb2dyZXNzQ2IgPSAoe2VsYXBzZWRNcywgcHJvZ3Jlc3N9KSA9PiB7XG4gICAgY29uc3Qgd2FpdFNlY3MgPSAoZWxhcHNlZE1zIC8gMTAwMCkudG9GaXhlZCgwKTtcbiAgICBjb25zdCBwcm9ncmVzc1BjdCA9IChwcm9ncmVzcyAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICBsb2cuZGVidWcoYFdhaXRlZCAke3dhaXRTZWNzfXMgc28gZmFyICgke3Byb2dyZXNzUGN0fSUpYCk7XG4gIH07XG4gIGF3YWl0IGxvbmdTbGVlcChzbGVlcE1zLCB7dGhyZXNob2xkTXMsIGludGVydmFsTXMsIHByb2dyZXNzQ2J9KTtcblxuICBsZXQgYXJncztcbiAgaWYgKHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyAmJiB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXSkge1xuICAgIC8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCB3aXRoIGBzdGFydEFjdGl2aXR5YCwgc28gdXNlIHRob3NlIGFyZ3MgdG8gcmVzdGFydFxuICAgIGFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICBsb2cuZGVidWcoYEJyaW5naW5nIGFwcGxpY2F0aW9uIGJhY2sgdG8gZm9yZWdyb3VuZCB3aXRoIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKGFyZ3MpO1xufTtcblxuY29tbWFuZHMuZ2V0U3RyaW5ncyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN0cmluZ3MgKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gKG1hcHBpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhsYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgbXV0YXRpbmcgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGJ1dCBpdCdzIGhvdyBhcHBpdW0gY3VycmVudGx5IHdvcmtzXG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigndXBkYXRlU3RyaW5ncycpO1xuICB9XG5cbiAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xufTtcblxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG4gIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFjdGl2aXR5IChhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSxcbiAgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSwgaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgbG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGZhbGxiYWNrIHRvIHRyeWluZyBwcm9wZXJ0eSBmb3IgZW11bGF0b3JzXG4gIG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdxZW11LnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gY291bGRuJ3QgZ2V0IGFueXRoaW5nLCBzbyBlcnJvciBvdXRcbiAgbG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYCdhY3Rpb24nIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cblxuICBhd2FpdCB0aGlzLmFkYi5wZXJmb3JtRWRpdG9yQWN0aW9uKGFjdGlvbik7XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OX0FDVElPTiA9IHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENoYW5nZVBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfEFycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBjaGFuZ2VkXG4gKiBvciBhIGxpc3Qgb2YgcGVybWlzc2lvbnMuIE1hbmRhdG9yeSBhcmd1bWVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYWNrYWdlIFt0aGlzLm9wdHMuYXBwUGFja2FnZV0gLSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnRdIC0gT25lIG9mIGBQRVJNSVNTSU9OX0FDVElPTmAgdmFsdWVzXG4gKi9cblxuLyoqXG4gKiBDaGFuZ2VzIHBhY2thZ2UgcGVybWlzc2lvbnMgaW4gcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gez9DaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnNcbiAqL1xuY29tbWFuZHMubW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBwZXJtaXNzaW9ucyxcbiAgICBhcHBQYWNrYWdlID0gdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aW9uID0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQsXG4gIH0gPSBvcHRzO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUocGVybWlzc2lvbnMpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYCdwZXJtaXNzaW9ucycgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGxldCBhY3Rpb25GdW5jO1xuICBzd2l0Y2ggKF8udG9Mb3dlcihhY3Rpb24pKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSwgcGVybWlzc2lvbikgPT4gdGhpcy5hZGIuZ3JhbnRQZXJtaXNzaW9uKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OX0FDVElPTi5SRVZPS0U6XG4gICAgICBhY3Rpb25GdW5jID0gKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgcGVybWlzc2lvbik7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OX0FDVElPTikpfSBhY3Rpb25zIGFyZSBzdXBwb3J0ZWRgKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiAoXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXSkpIHtcbiAgICBhd2FpdCBhY3Rpb25GdW5jKGFwcFBhY2thZ2UsIHBlcm1pc3Npb24pO1xuICB9XG59O1xuXG5jb25zdCBQRVJNSVNTSU9OU19UWVBFID0ge1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5HUkFOVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuREVOSUVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChhcHBQYWNrYWdlKSA9PiB0aGlzLmFkYi5nZXREZW5pZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVW5rbm93biBwZXJtaXNzaW9ucyB0eXBlICcke3R5cGV9Jy4gYCArXG4gICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTlNfVFlQRSkpfSB0eXBlcyBhcmUgc3VwcG9ydGVkYCk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5IFRoZSB1bmxvY2sga2V5LiBUaGUgdmFsdWUgb2YgdGhpcyBrZXkgZGVwZW5kc1xuICogb24gdGhlIGFjdHVhbCB1bmxvY2sgdHlwZSBhbmQgY291bGQgYmUgYSBwaW4vcGFzc3dvcmQvcGF0dGVybiB2YWx1ZSBvclxuICogYSBiaW9tZXRyaWMgZmluZ2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIHVubG9jayB0eXBlLiBUaGUgZm9sbG93aW5nIHVubG9jayB0eXBlc1xuICogYXJlIHN1cHBvcnRlZDogYHBpbmAsIGBwaW5XaXRoS2V5RXZlbnRgLCBgcGFzc3dvcmRgLCBgcGF0dGVybmAgYW5kIGBmaW5nZXJwcmludGAuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHN0cmF0ZWd5IEVpdGhlciAnbG9ja3NldHRpbmdzJyAoZGVmYXVsdCkgb3IgJ3VpYXV0b21hdG9yJy5cbiAqIFNldHRpbmcgaXQgdG8gJ3VpYXV0b21hdG9yJyB3aWxsIGVuZm9yY2UgdGhlIGRyaXZlciB0byBhdm9pZCB1c2luZyBzcGVjaWFsXG4gKiBBREIgc2hvcnRjdXRzIGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSB1bmxvY2sgcHJvY2VkdXJlLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDBdIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiB0byB3YWl0IHVudGlsIHRoZSBzY3JlZW4gZ2V0cyB1bmxvY2tlZFxuICovXG5cbi8qKlxuICogVW5sb2NrcyB0aGUgZGV2aWNlIGlmIGl0IGlzIGxvY2tlZC4gTm9vcCBpZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuIGlzIG5vdCBsb2NrZWQuXG4gKlxuICogQHBhcmFtIHs/VW5sb2NrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHVubG9jayBvcGVyYXRpb24gZmFpbHMgb3IgdGhlIHByb3ZpZGVkXG4gKiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVVbmxvY2sgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGtleSwgdHlwZSwgc3RyYXRlZ3ksIHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMudW5sb2NrKHRoaXMsIHRoaXMuYWRiLCB7XG4gICAgdW5sb2NrS2V5OiBrZXksXG4gICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICB1bmxvY2tTdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHRpbWVvdXRNcyxcbiAgfSk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -47,13 +47,15 @@ var _appManagement = _interopRequireDefault(require("./app-management"));
|
|
|
47
47
|
|
|
48
48
|
var _intent = _interopRequireDefault(require("./intent"));
|
|
49
49
|
|
|
50
|
+
var _systemBars = _interopRequireDefault(require("./system-bars"));
|
|
51
|
+
|
|
50
52
|
var _log = _interopRequireDefault(require("./log"));
|
|
51
53
|
|
|
52
54
|
let commands = {};
|
|
53
55
|
exports.commands = commands;
|
|
54
|
-
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _appManagement.default, _fileActions.default, _log.default);
|
|
56
|
+
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _systemBars.default, _appManagement.default, _fileActions.default, _log.default);
|
|
55
57
|
var _default = commands;
|
|
56
58
|
exports.default = _default;require('source-map-support').install();
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9pbmRleC5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImZpbmRDbWRzIiwiZ2VuZXJhbENtZHMiLCJhbGVydENtZHMiLCJlbGVtZW50Q21kcyIsImNvbnRleHRDbWRzIiwiYWN0aW9uQ21kcyIsInRvdWNoQ21kcyIsImltZUNtZHMiLCJuZXR3b3JrQ21kcyIsImNvdmVyYWdlQ21kcyIsInJlY29yZHNjcmVlbkNtZHMiLCJpbnRlbnRDbWRzIiwic2NyZWVuU3RyZWFtQ21kcyIsInBlcmZvcm1hbmNlQ21kcyIsImV4ZWN1dGVDbWRzIiwic2hlbGxDbWRzIiwiZW11Q29uc29sZUNtZHMiLCJzeXN0ZW1CYXJzQ21kcyIsImFwcE1hbmFnZW1lbnRDbWRzIiwiZmlsZUFjdGlvbnNDbWRzIiwibG9nQ21kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxJQUFJQSxRQUFRLEdBQUcsRUFBZjs7QUFDQUMsTUFBTSxDQUFDQyxNQUFQLENBQ0VGLFFBREYsRUFFRUcsYUFGRixFQUdFQyxnQkFIRixFQUlFQyxjQUpGLEVBS0VDLGdCQUxGLEVBTUVDLGdCQU5GLEVBT0VDLGdCQVBGLEVBUUVDLGNBUkYsRUFTRUMsWUFURixFQVVFQyxnQkFWRixFQVdFQyxpQkFYRixFQVlFQyxxQkFaRixFQWFFQyxlQWJGLEVBY0VDLHFCQWRGLEVBZUVDLG9CQWZGLEVBZ0JFQyxnQkFoQkYsRUFpQkVDLGNBakJGLEVBa0JFQyxtQkFsQkYsRUFtQkVDLG1CQW5CRixFQW9CRUMsc0JBcEJGLEVBcUJFQyxvQkFyQkYsRUFzQkVDLFlBdEJGO2VBMkJldkIsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaW5kQ21kcyBmcm9tICcuL2ZpbmQnO1xuaW1wb3J0IGdlbmVyYWxDbWRzIGZyb20gJy4vZ2VuZXJhbCc7XG5pbXBvcnQgYWxlcnRDbWRzIGZyb20gJy4vYWxlcnQnO1xuaW1wb3J0IGVsZW1lbnRDbWRzIGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgY29udGV4dENtZHMgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBhY3Rpb25DbWRzIGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgdG91Y2hDbWRzIGZyb20gJy4vdG91Y2gnO1xuaW1wb3J0IGltZUNtZHMgZnJvbSAnLi9pbWUnO1xuaW1wb3J0IG5ldHdvcmtDbWRzIGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgY292ZXJhZ2VDbWRzIGZyb20gJy4vY292ZXJhZ2UnO1xuaW1wb3J0IHJlY29yZHNjcmVlbkNtZHMgZnJvbSAnLi9yZWNvcmRzY3JlZW4nO1xuaW1wb3J0IHNjcmVlblN0cmVhbUNtZHMgZnJvbSAnLi9zdHJlYW1zY3JlZW4nO1xuaW1wb3J0IHBlcmZvcm1hbmNlQ21kcyBmcm9tICcuL3BlcmZvcm1hbmNlJztcbmltcG9ydCBleGVjdXRlQ21kcyBmcm9tICcuL2V4ZWN1dGUnO1xuaW1wb3J0IHNoZWxsQ21kcyBmcm9tICcuL3NoZWxsJztcbmltcG9ydCBlbXVDb25zb2xlQ21kcyBmcm9tICcuL2VtdS1jb25zb2xlJztcbmltcG9ydCBmaWxlQWN0aW9uc0NtZHMgZnJvbSAnLi9maWxlLWFjdGlvbnMnO1xuaW1wb3J0IGFwcE1hbmFnZW1lbnRDbWRzIGZyb20gJy4vYXBwLW1hbmFnZW1lbnQnO1xuaW1wb3J0IGludGVudENtZHMgZnJvbSAnLi9pbnRlbnQnO1xuaW1wb3J0IHN5c3RlbUJhcnNDbWRzIGZyb20gJy4vc3lzdGVtLWJhcnMnO1xuaW1wb3J0IGxvZ0NtZHMgZnJvbSAnLi9sb2cnO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9O1xuT2JqZWN0LmFzc2lnbihcbiAgY29tbWFuZHMsXG4gIGZpbmRDbWRzLFxuICBnZW5lcmFsQ21kcyxcbiAgYWxlcnRDbWRzLFxuICBlbGVtZW50Q21kcyxcbiAgY29udGV4dENtZHMsXG4gIGFjdGlvbkNtZHMsXG4gIHRvdWNoQ21kcyxcbiAgaW1lQ21kcyxcbiAgbmV0d29ya0NtZHMsXG4gIGNvdmVyYWdlQ21kcyxcbiAgcmVjb3Jkc2NyZWVuQ21kcyxcbiAgaW50ZW50Q21kcyxcbiAgc2NyZWVuU3RyZWFtQ21kcyxcbiAgcGVyZm9ybWFuY2VDbWRzLFxuICBleGVjdXRlQ21kcyxcbiAgc2hlbGxDbWRzLFxuICBlbXVDb25zb2xlQ21kcyxcbiAgc3lzdGVtQmFyc0NtZHMsXG4gIGFwcE1hbmFnZW1lbnRDbWRzLFxuICBmaWxlQWN0aW9uc0NtZHMsXG4gIGxvZ0NtZHMsXG4gIC8vIGFkZCBvdGhlciBjb21tYW5kIHR5cGVzIGhlcmVcbik7XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL2luZGV4LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
exports.parseWindowProperties = parseWindowProperties;
|
|
10
|
+
exports.parseWindows = parseWindows;
|
|
11
|
+
|
|
12
|
+
require("source-map-support/register");
|
|
13
|
+
|
|
14
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
+
|
|
16
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
17
|
+
|
|
18
|
+
const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
|
|
19
|
+
const FRAME_PATTERN = /^\s+mFrame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/m;
|
|
20
|
+
const SURFACE_PATTERN = /^\s+Surface:\sshown=(true|false)/m;
|
|
21
|
+
const STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';
|
|
22
|
+
const NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';
|
|
23
|
+
const DEFAULT_WINDOW_PROPERTIES = {
|
|
24
|
+
visible: false,
|
|
25
|
+
x: 0,
|
|
26
|
+
y: 0,
|
|
27
|
+
width: 0,
|
|
28
|
+
height: 0
|
|
29
|
+
};
|
|
30
|
+
const commands = {};
|
|
31
|
+
|
|
32
|
+
function parseWindowProperties(name, props) {
|
|
33
|
+
const result = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
34
|
+
|
|
35
|
+
const propLines = props.join('\n');
|
|
36
|
+
const frameMatch = FRAME_PATTERN.exec(propLines);
|
|
37
|
+
|
|
38
|
+
if (!frameMatch) {
|
|
39
|
+
_logger.default.debug(propLines);
|
|
40
|
+
|
|
41
|
+
throw new Error(`Cannot parse the frame size from '${name}' window properties`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
result.x = parseFloat(frameMatch[1]);
|
|
45
|
+
result.y = parseFloat(frameMatch[2]);
|
|
46
|
+
const left = parseFloat(frameMatch[3]);
|
|
47
|
+
const top = parseFloat(frameMatch[4]);
|
|
48
|
+
result.width = left - result.x;
|
|
49
|
+
result.height = top - result.y;
|
|
50
|
+
const visibilityMatch = SURFACE_PATTERN.exec(propLines);
|
|
51
|
+
|
|
52
|
+
if (!visibilityMatch) {
|
|
53
|
+
_logger.default.debug(propLines);
|
|
54
|
+
|
|
55
|
+
throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
result.visible = visibilityMatch[1] === 'true';
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function parseWindows(lines) {
|
|
63
|
+
const windows = {};
|
|
64
|
+
let currentWindowName = null;
|
|
65
|
+
let windowNameRowIndent = null;
|
|
66
|
+
|
|
67
|
+
for (const line of lines.split('\n').map(_lodash.default.trimEnd)) {
|
|
68
|
+
const currentIndent = line.length - _lodash.default.trimStart(line).length;
|
|
69
|
+
|
|
70
|
+
if (_lodash.default.isNil(windowNameRowIndent) || currentIndent <= windowNameRowIndent) {
|
|
71
|
+
const match = WINDOW_TITLE_PATTERN.exec(line);
|
|
72
|
+
|
|
73
|
+
if (!match) {
|
|
74
|
+
currentWindowName = null;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
currentWindowName = match[1];
|
|
79
|
+
|
|
80
|
+
if (_lodash.default.isNil(windowNameRowIndent)) {
|
|
81
|
+
windowNameRowIndent = currentIndent;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (!currentWindowName || currentIndent <= windowNameRowIndent) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (!_lodash.default.isArray(windows[currentWindowName])) {
|
|
92
|
+
windows[currentWindowName] = [];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
windows[currentWindowName].push(line);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (_lodash.default.isEmpty(windows)) {
|
|
99
|
+
_logger.default.debug(lines.join('\n'));
|
|
100
|
+
|
|
101
|
+
throw new Error('Cannot parse any window information from the dumpsys output');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const result = {
|
|
105
|
+
statusBar: null,
|
|
106
|
+
navigationBar: null
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
for (const [name, props] of _lodash.default.toPairs(windows)) {
|
|
110
|
+
if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {
|
|
111
|
+
result.statusBar = parseWindowProperties(name, props);
|
|
112
|
+
} else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {
|
|
113
|
+
result.navigationBar = parseWindowProperties(name, props);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const unmatchedWindows = [['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX], ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]].filter(([name]) => _lodash.default.isNil(result[name]));
|
|
118
|
+
|
|
119
|
+
for (const [window, namePrefix] of unmatchedWindows) {
|
|
120
|
+
_logger.default.info(`No windows have been found whose title matches to ` + `'${namePrefix}'. Assuming it is invisible. ` + `Only the following windows are available: ${_lodash.default.keys(windows)}`);
|
|
121
|
+
|
|
122
|
+
result[window] = _lodash.default.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
commands.getSystemBars = async function getSystemBars() {
|
|
129
|
+
let stdout;
|
|
130
|
+
|
|
131
|
+
try {
|
|
132
|
+
stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);
|
|
133
|
+
} catch (e) {
|
|
134
|
+
throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return parseWindows(stdout);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
var _default = commands;
|
|
141
|
+
exports.default = _default;require('source-map-support').install();
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJTVVJGQUNFX1BBVFRFUk4iLCJTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIk5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCIsIkRFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMiLCJ2aXNpYmxlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImNvbW1hbmRzIiwicGFyc2VXaW5kb3dQcm9wZXJ0aWVzIiwibmFtZSIsInByb3BzIiwicmVzdWx0IiwiXyIsImNsb25lRGVlcCIsInByb3BMaW5lcyIsImpvaW4iLCJmcmFtZU1hdGNoIiwiZXhlYyIsImxvZyIsImRlYnVnIiwiRXJyb3IiLCJwYXJzZUZsb2F0IiwibGVmdCIsInRvcCIsInZpc2liaWxpdHlNYXRjaCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwid2luZG93TmFtZVJvd0luZGVudCIsImxpbmUiLCJzcGxpdCIsIm1hcCIsInRyaW1FbmQiLCJjdXJyZW50SW5kZW50IiwibGVuZ3RoIiwidHJpbVN0YXJ0IiwiaXNOaWwiLCJtYXRjaCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJ3aW5kb3ciLCJuYW1lUHJlZml4IiwiaW5mbyIsImtleXMiLCJnZXRTeXN0ZW1CYXJzIiwic3Rkb3V0IiwiYWRiIiwic2hlbGwiLCJlIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBLE1BQU1BLG9CQUFvQixHQUFHLHdEQUE3QjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxnRUFBdEI7QUFDQSxNQUFNQyxlQUFlLEdB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cm9tICcuLi9sb2dnZXInO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXlxccyttRnJhbWU9XFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdXFxbKFswLTkuLV0rKSwoWzAtOS4tXSspXFxdL207XG5jb25zdCBTVVJGQUNFX1BBVFRFUk4gPSAvXlxccytTdXJmYWNlOlxcc3Nob3duPSh0cnVlfGZhbHNlKS9tO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEByZXR1cm5zIHtXaW5kb3dQcm9wZXJ0aWVzfSBQYXJzZWQgcHJvcGVydGllcyBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gaXNzdWUgd2hpbGUgcGFyc2luZyB0aGUgcHJvcGVydGllcyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIChuYW1lLCBwcm9wcykge1xuICBjb25zdCByZXN1bHQgPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgY29uc3QgcHJvcExpbmVzID0gcHJvcHMuam9pbignXFxuJyk7XG4gIGNvbnN0IGZyYW1lTWF0Y2ggPSBGUkFNRV9QQVRURVJOLmV4ZWMocHJvcExpbmVzKTtcbiAgaWYgKCFmcmFtZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFszXSk7XG4gIGNvbnN0IHRvcCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFs0XSk7XG4gIHJlc3VsdC53aWR0aCA9IGxlZnQgLSByZXN1bHQueDtcbiAgcmVzdWx0LmhlaWdodCA9IHRvcCAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBTVVJGQUNFX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSB2aXNpYmlsaXR5IHZhbHVlIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnZpc2libGUgPSB2aXNpYmlsaXR5TWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpbmVzIE91dHB1dCBmcm9tIGR1bXBzeXMgY29tbWFuZC5cbiAqIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgdGVzdHMgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5wdXQgZm9ybWF0LlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3QgY29udGFpbmluZyB0d28gaXRlbXMgd2hlcmUga2V5cyBhcmUgc3RhdHVzQmFyIGFuZCBuYXZpZ2F0aW9uQmFyLFxuICogYW5kIHZhbHVlcyBhcmUgY29ycmVzcG9uZGluZyBXaW5kb3dQcm9wZXJ0aWVzIG9iamVjdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyB3aW5kb3cgcHJvcGVydGllcyBjb3VsZCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dzIChsaW5lcykge1xuICBjb25zdCB3aW5kb3dzID0ge307XG4gIGxldCBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gIGxldCB3aW5kb3dOYW1lUm93SW5kZW50ID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSB8fCBjdXJyZW50SW5kZW50IDw9IHdpbmRvd05hbWVSb3dJbmRlbnQpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICBpZiAoXy5pc05pbCh3aW5kb3dOYW1lUm93SW5kZW50KSkge1xuICAgICAgICB3aW5kb3dOYW1lUm93SW5kZW50ID0gY3VycmVudEluZGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnRXaW5kb3dOYW1lIHx8IGN1cnJlbnRJbmRlbnQgPD0gd2luZG93TmFtZVJvd0luZGVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgIH1cbiAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkod2luZG93cykpIHtcbiAgICBsb2cuZGVidWcobGluZXMuam9pbignXFxuJykpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGFueSB3aW5kb3cgaW5mb3JtYXRpb24gZnJvbSB0aGUgZHVtcHN5cyBvdXRwdXQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtzdGF0dXNCYXI6IG51bGwsIG5hdmlnYXRpb25CYXI6IG51bGx9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wc10gb2YgXy50b1BhaXJzKHdpbmRvd3MpKSB7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5zdGF0dXNCYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMpO1xuICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5uYXZpZ2F0aW9uQmFyID0gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzKG5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5tYXRjaGVkV2luZG93cyA9IFtcbiAgICBbJ3N0YXR1c0JhcicsIFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYXSxcbiAgICBbJ25hdmlnYXRpb25CYXInLCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdXG4gIF0uZmlsdGVyKChbbmFtZV0pID0+IF8uaXNOaWwocmVzdWx0W25hbWVdKSk7XG4gIGZvciAoY29uc3QgW3dpbmRvdywgbmFtZVByZWZpeF0gb2YgdW5tYXRjaGVkV2luZG93cykge1xuICAgIGxvZy5pbmZvKGBObyB3aW5kb3dzIGhhdmUgYmVlbiBmb3VuZCB3aG9zZSB0aXRsZSBtYXRjaGVzIHRvIGAgK1xuICAgICAgYCcke25hbWVQcmVmaXh9Jy4gQXNzdW1pbmcgaXQgaXMgaW52aXNpYmxlLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgd2luZG93cyBhcmUgYXZhaWxhYmxlOiAke18ua2V5cyh3aW5kb3dzKX1gKTtcbiAgICByZXN1bHRbd2luZG93XSA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbW1hbmRzLmdldFN5c3RlbUJhcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1CYXJzICgpIHtcbiAgbGV0IHN0ZG91dDtcbiAgdHJ5IHtcbiAgICBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnd2luZG93JywgJ3dpbmRvd3MnXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSBzeXN0ZW0gYmFycyBkZXRhaWxzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlV2luZG93cyhzdGRvdXQpO1xufTtcblxuLy8gZm9yIHVuaXQgdGVzdHNcbmV4cG9ydCB7IHBhcnNlV2luZG93cywgcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJmaWxlIjoibGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
@@ -54,6 +54,8 @@ commands.queryAppState = async function queryAppState (appId) {
|
|
|
54
54
|
*/
|
|
55
55
|
commands.activateApp = async function activateApp (appId) {
|
|
56
56
|
const cmd = ['monkey',
|
|
57
|
+
// https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical
|
|
58
|
+
'--pct-syskeys', '0',
|
|
57
59
|
'-p', appId,
|
|
58
60
|
'-c', 'android.intent.category.LAUNCHER',
|
|
59
61
|
'1'];
|
package/lib/commands/general.js
CHANGED
|
@@ -292,86 +292,6 @@ commands.getDisplayDensity = async function getDisplayDensity () {
|
|
|
292
292
|
log.errorAndThrow('Failed to get display density property.');
|
|
293
293
|
};
|
|
294
294
|
|
|
295
|
-
/**
|
|
296
|
-
* Parses the given window manager Surface string to get info.
|
|
297
|
-
* @param line: To parse. This is assumed to be valid.
|
|
298
|
-
* @return: Visibility and bounds of the Surface.
|
|
299
|
-
*/
|
|
300
|
-
function parseSurfaceLine (line) {
|
|
301
|
-
// the surface bounds are in the format:
|
|
302
|
-
// "rect=(0.0,1184.0) 768.0 x 96.0"
|
|
303
|
-
// ^ location ^ size
|
|
304
|
-
// cut out the stuff before the 'rect' and then split the numbers apart
|
|
305
|
-
let bounds = line.split('rect=')[1]
|
|
306
|
-
.replace(/[(), x]+/g, ' ')
|
|
307
|
-
.trim()
|
|
308
|
-
.split(' ');
|
|
309
|
-
|
|
310
|
-
return {
|
|
311
|
-
visible: (line.indexOf('shown=true') !== -1),
|
|
312
|
-
x: parseFloat(bounds[0]),
|
|
313
|
-
y: parseFloat(bounds[1]),
|
|
314
|
-
width: parseFloat(bounds[2]),
|
|
315
|
-
height: parseFloat(bounds[3])
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Extracts status and navigation bar information from the window manager output.
|
|
321
|
-
* @param lines: Output from dumpsys command
|
|
322
|
-
* @return: Visibility and bounds info of status and navigation bar
|
|
323
|
-
*/
|
|
324
|
-
function parseWindows (lines) {
|
|
325
|
-
let atStatusBar = false;
|
|
326
|
-
let atNavBar = false;
|
|
327
|
-
let statusBar;
|
|
328
|
-
let navigationBar;
|
|
329
|
-
// the window manager output looks like:
|
|
330
|
-
// Window #1 ... WindowID
|
|
331
|
-
// A bunch of properties
|
|
332
|
-
// Window #2 ... WindowID
|
|
333
|
-
// A bunch of properties
|
|
334
|
-
lines.split('\n').forEach((line) => {
|
|
335
|
-
// the start of a new window section
|
|
336
|
-
if (line.indexOf(' Window #') !== -1) {
|
|
337
|
-
// determine which section we're in
|
|
338
|
-
// only one will be true
|
|
339
|
-
atStatusBar = (line.indexOf('StatusBar') !== -1);
|
|
340
|
-
atNavBar = (line.indexOf('NavigationBar') !== -1);
|
|
341
|
-
// don't need anything else. move to next line
|
|
342
|
-
return;
|
|
343
|
-
}
|
|
344
|
-
// once we're in a window section, look for the surface data line
|
|
345
|
-
if (line.indexOf(' Surface:') === -1) {
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
if (atStatusBar) {
|
|
349
|
-
statusBar = parseSurfaceLine(line);
|
|
350
|
-
atStatusBar = false;
|
|
351
|
-
} else if (atNavBar) {
|
|
352
|
-
navigationBar = parseSurfaceLine(line);
|
|
353
|
-
atNavBar = false;
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
if (!statusBar) {
|
|
358
|
-
log.errorAndThrow('Failed to parse status bar information.');
|
|
359
|
-
}
|
|
360
|
-
if (!navigationBar) {
|
|
361
|
-
log.errorAndThrow('Failed to parse navigation bar information.');
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
return {statusBar, navigationBar};
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
commands.getSystemBars = async function getSystemBars () {
|
|
368
|
-
let out = await this.adb.shell(['dumpsys', 'window', 'windows']);
|
|
369
|
-
if (!out) {
|
|
370
|
-
log.errorAndThrow('Did not get window manager output.');
|
|
371
|
-
}
|
|
372
|
-
return parseWindows(out);
|
|
373
|
-
};
|
|
374
|
-
|
|
375
295
|
commands.mobilePerformEditorAction = async function mobilePerformEditorAction (opts = {}) {
|
|
376
296
|
const {action} = opts;
|
|
377
297
|
if (!util.hasValue(action)) {
|
|
@@ -537,5 +457,3 @@ commands.mobileUnlock = async function mobileUnlock (opts = {}) {
|
|
|
537
457
|
Object.assign(extensions, commands, helpers);
|
|
538
458
|
export { commands, helpers };
|
|
539
459
|
export default extensions;
|
|
540
|
-
// for unit tests
|
|
541
|
-
export { parseWindows, parseSurfaceLine };
|
package/lib/commands/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import emuConsoleCmds from './emu-console';
|
|
|
17
17
|
import fileActionsCmds from './file-actions';
|
|
18
18
|
import appManagementCmds from './app-management';
|
|
19
19
|
import intentCmds from './intent';
|
|
20
|
+
import systemBarsCmds from './system-bars';
|
|
20
21
|
import logCmds from './log';
|
|
21
22
|
|
|
22
23
|
|
|
@@ -40,6 +41,7 @@ Object.assign(
|
|
|
40
41
|
executeCmds,
|
|
41
42
|
shellCmds,
|
|
42
43
|
emuConsoleCmds,
|
|
44
|
+
systemBarsCmds,
|
|
43
45
|
appManagementCmds,
|
|
44
46
|
fileActionsCmds,
|
|
45
47
|
logCmds,
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import log from '../logger';
|
|
3
|
+
|
|
4
|
+
const WINDOW_TITLE_PATTERN = /^\s+Window\s#\d+\sWindow\{[0-9a-f]+\s\w+\s([\w-]+)\}:$/;
|
|
5
|
+
const FRAME_PATTERN = /^\s+mFrame=\[([0-9.-]+),([0-9.-]+)\]\[([0-9.-]+),([0-9.-]+)\]/m;
|
|
6
|
+
const SURFACE_PATTERN = /^\s+Surface:\sshown=(true|false)/m;
|
|
7
|
+
const STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';
|
|
8
|
+
const NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';
|
|
9
|
+
const DEFAULT_WINDOW_PROPERTIES = {
|
|
10
|
+
visible: false,
|
|
11
|
+
x: 0, y: 0, width: 0, height: 0,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const commands = {};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @typedef {Object} WindowProperties
|
|
18
|
+
* @property {boolean} visible Whether the window is visible
|
|
19
|
+
* @property {number} x Window x coordinate
|
|
20
|
+
* @property {number} y Window y coordinate
|
|
21
|
+
* @property {number} width Window width
|
|
22
|
+
* @property {number} height Window height
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Parses window properties from adb dumpsys output
|
|
27
|
+
*
|
|
28
|
+
* @param {string} name The name of the window whose properties are being parsed
|
|
29
|
+
* @param {Array<string>} props The list of particular window property lines.
|
|
30
|
+
* Check the corresponding unit tests for more details on the input format.
|
|
31
|
+
* @returns {WindowProperties} Parsed properties object
|
|
32
|
+
* @throws {Error} If there was an issue while parsing the properties string
|
|
33
|
+
*/
|
|
34
|
+
function parseWindowProperties (name, props) {
|
|
35
|
+
const result = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
36
|
+
const propLines = props.join('\n');
|
|
37
|
+
const frameMatch = FRAME_PATTERN.exec(propLines);
|
|
38
|
+
if (!frameMatch) {
|
|
39
|
+
log.debug(propLines);
|
|
40
|
+
throw new Error(`Cannot parse the frame size from '${name}' window properties`);
|
|
41
|
+
}
|
|
42
|
+
result.x = parseFloat(frameMatch[1]);
|
|
43
|
+
result.y = parseFloat(frameMatch[2]);
|
|
44
|
+
const left = parseFloat(frameMatch[3]);
|
|
45
|
+
const top = parseFloat(frameMatch[4]);
|
|
46
|
+
result.width = left - result.x;
|
|
47
|
+
result.height = top - result.y;
|
|
48
|
+
const visibilityMatch = SURFACE_PATTERN.exec(propLines);
|
|
49
|
+
if (!visibilityMatch) {
|
|
50
|
+
log.debug(propLines);
|
|
51
|
+
throw new Error(`Cannot parse the visibility value from '${name}' window properties`);
|
|
52
|
+
}
|
|
53
|
+
result.visible = visibilityMatch[1] === 'true';
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Extracts status and navigation bar information from the window manager output.
|
|
59
|
+
*
|
|
60
|
+
* @param {Array<string>} lines Output from dumpsys command.
|
|
61
|
+
* Check the corresponding unit tests for more details on the input format.
|
|
62
|
+
* @return {Object} An object containing two items where keys are statusBar and navigationBar,
|
|
63
|
+
* and values are corresponding WindowProperties objects
|
|
64
|
+
* @throws {Error} If no window properties could be parsed
|
|
65
|
+
*/
|
|
66
|
+
function parseWindows (lines) {
|
|
67
|
+
const windows = {};
|
|
68
|
+
let currentWindowName = null;
|
|
69
|
+
let windowNameRowIndent = null;
|
|
70
|
+
for (const line of lines.split('\n').map(_.trimEnd)) {
|
|
71
|
+
const currentIndent = line.length - _.trimStart(line).length;
|
|
72
|
+
if (_.isNil(windowNameRowIndent) || currentIndent <= windowNameRowIndent) {
|
|
73
|
+
const match = WINDOW_TITLE_PATTERN.exec(line);
|
|
74
|
+
if (!match) {
|
|
75
|
+
currentWindowName = null;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
currentWindowName = match[1];
|
|
79
|
+
if (_.isNil(windowNameRowIndent)) {
|
|
80
|
+
windowNameRowIndent = currentIndent;
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (!currentWindowName || currentIndent <= windowNameRowIndent) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (!_.isArray(windows[currentWindowName])) {
|
|
89
|
+
windows[currentWindowName] = [];
|
|
90
|
+
}
|
|
91
|
+
windows[currentWindowName].push(line);
|
|
92
|
+
}
|
|
93
|
+
if (_.isEmpty(windows)) {
|
|
94
|
+
log.debug(lines.join('\n'));
|
|
95
|
+
throw new Error('Cannot parse any window information from the dumpsys output');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const result = {statusBar: null, navigationBar: null};
|
|
99
|
+
for (const [name, props] of _.toPairs(windows)) {
|
|
100
|
+
if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {
|
|
101
|
+
result.statusBar = parseWindowProperties(name, props);
|
|
102
|
+
} else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {
|
|
103
|
+
result.navigationBar = parseWindowProperties(name, props);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const unmatchedWindows = [
|
|
107
|
+
['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX],
|
|
108
|
+
['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]
|
|
109
|
+
].filter(([name]) => _.isNil(result[name]));
|
|
110
|
+
for (const [window, namePrefix] of unmatchedWindows) {
|
|
111
|
+
log.info(`No windows have been found whose title matches to ` +
|
|
112
|
+
`'${namePrefix}'. Assuming it is invisible. ` +
|
|
113
|
+
`Only the following windows are available: ${_.keys(windows)}`);
|
|
114
|
+
result[window] = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
commands.getSystemBars = async function getSystemBars () {
|
|
120
|
+
let stdout;
|
|
121
|
+
try {
|
|
122
|
+
stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);
|
|
123
|
+
} catch (e) {
|
|
124
|
+
throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);
|
|
125
|
+
}
|
|
126
|
+
return parseWindows(stdout);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// for unit tests
|
|
130
|
+
export { parseWindows, parseWindowProperties };
|
|
131
|
+
export default commands;
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"mobile",
|
|
10
10
|
"mobile testing"
|
|
11
11
|
],
|
|
12
|
-
"version": "5.0.
|
|
12
|
+
"version": "5.0.4",
|
|
13
13
|
"author": "appium",
|
|
14
14
|
"license": "Apache-2.0",
|
|
15
15
|
"repository": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"io.appium.settings": "^4.0.0",
|
|
47
47
|
"jimp": "^0.x",
|
|
48
48
|
"lodash": "^4.17.4",
|
|
49
|
-
"lru-cache": "^
|
|
49
|
+
"lru-cache": "^7.3.0",
|
|
50
50
|
"moment": "^2.24.0",
|
|
51
51
|
"moment-timezone": "^0.5.26",
|
|
52
52
|
"portfinder": "^1.0.6",
|
|
@@ -82,19 +82,17 @@
|
|
|
82
82
|
"@appium/test-support": "^1.0.0",
|
|
83
83
|
"@babel/core": "^7.16.0",
|
|
84
84
|
"@babel/eslint-parser": "^7.16.3",
|
|
85
|
+
"@semantic-release/git": "^10.0.1",
|
|
85
86
|
"@xmldom/xmldom": "^0.x",
|
|
86
87
|
"android-apidemos": "^4.0.0",
|
|
87
88
|
"chai": "^4.1.2",
|
|
88
89
|
"chai-as-promised": "^7.1.1",
|
|
89
|
-
"eslint": "^7.32.0",
|
|
90
|
-
"eslint-plugin-import": "^2.25.3",
|
|
91
|
-
"eslint-plugin-mocha": "^9.0.0",
|
|
92
|
-
"eslint-plugin-promise": "^6.0.0",
|
|
93
90
|
"gulp": "^4.0.0",
|
|
94
91
|
"mocha": "^9.0.0",
|
|
95
92
|
"mock-fs": "^5.0.0",
|
|
96
93
|
"pre-commit": "^1.1.3",
|
|
97
|
-
"
|
|
94
|
+
"semantic-release": "^19.0.2",
|
|
95
|
+
"sinon": "^13.0.0",
|
|
98
96
|
"xpath": "^0.x"
|
|
99
97
|
}
|
|
100
98
|
}
|
package/bootstrap/README.md
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
Bootstrap Android
|
|
2
|
-
===
|
|
3
|
-
|
|
4
|
-
To install the Android Maven dependencies in your local environment, run the following:
|
|
5
|
-
|
|
6
|
-
* Clone https://github.com/mosabua/maven-android-sdk-deployer into your workstation
|
|
7
|
-
* Set the ANDROID_HOME environment to the location of the Android SDK, eg. `export ANDROID_HOME=/Developer/adt-bundle-mac-x86_64-20130219/sdk/`
|
|
8
|
-
* Run `mvn install -P 4.4` from the `maven-android-sdk-deployer` directory. The build will fail if API 19 and some extra packages are not installed.
|
|
9
|
-
* Please install all sdk and api versions of android for building `maven-android-sdk-deployer`.
|
|
10
|
-
|
|
11
|
-
You can then compile the bootstrap project by running
|
|
12
|
-
|
|
13
|
-
mvn package -P 4.4
|
|
14
|
-
|
|
15
|
-
If mvn package fails, try deleting your ANDROID_HOME folder and downloading everything again. If it still doesn't work try:
|
|
16
|
-
|
|
17
|
-
android-sdk/tools/android update sdk --no-ui --obsolete --force
|
|
18
|
-
|
|
19
|
-
and then run `mvn clean ; mvn install`
|
package/lib/.DS_Store
DELETED
|
Binary file
|