appium-adb 9.10.2 → 9.10.3
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 -1
- package/lib/helpers.js +26 -3
- package/lib/tools/apk-signing.js +3 -4
- package/package.json +39 -26
- package/build/index.js +0 -30
- package/build/lib/adb.js +0 -132
- package/build/lib/helpers.js +0 -957
- package/build/lib/logcat.js +0 -221
- package/build/lib/logger.js +0 -18
- package/build/lib/tools/aab-utils.js +0 -157
- package/build/lib/tools/adb-commands.js +0 -1150
- package/build/lib/tools/adb-emu-commands.js +0 -397
- package/build/lib/tools/android-manifest.js +0 -231
- package/build/lib/tools/apk-signing.js +0 -333
- package/build/lib/tools/apk-utils.js +0 -992
- package/build/lib/tools/apks-utils.js +0 -219
- package/build/lib/tools/index.js +0 -49
- package/build/lib/tools/keyboard-commands.js +0 -71
- package/build/lib/tools/lockmgmt.js +0 -224
- package/build/lib/tools/settings-client-commands.js +0 -362
- package/build/lib/tools/system-calls.js +0 -1064
package/build/lib/logcat.js
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
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
|
-
|
|
10
|
-
require("source-map-support/register");
|
|
11
|
-
|
|
12
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
|
-
var _support = require("@appium/support");
|
|
15
|
-
|
|
16
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
17
|
-
|
|
18
|
-
var _events = _interopRequireDefault(require("events"));
|
|
19
|
-
|
|
20
|
-
var _teen_process = require("teen_process");
|
|
21
|
-
|
|
22
|
-
const {
|
|
23
|
-
EventEmitter
|
|
24
|
-
} = _events.default;
|
|
25
|
-
|
|
26
|
-
const log = _support.logger.getLogger('Logcat');
|
|
27
|
-
|
|
28
|
-
const MAX_BUFFER_SIZE = 10000;
|
|
29
|
-
const LOGCAT_PROC_STARTUP_TIMEOUT = 10000;
|
|
30
|
-
const SUPPORTED_FORMATS = ['brief', 'process', 'tag', 'thread', 'raw', 'time', 'threadtime', 'long'];
|
|
31
|
-
const SUPPORTED_PRIORITIES = ['v', 'd', 'i', 'w', 'e', 'f', 's'];
|
|
32
|
-
const DEFAULT_PRIORITY = 'v';
|
|
33
|
-
const DEFAULT_TAG = '*';
|
|
34
|
-
const DEFAULT_FORMAT = 'threadtime';
|
|
35
|
-
|
|
36
|
-
function requireFormat(format) {
|
|
37
|
-
if (!SUPPORTED_FORMATS.includes(format)) {
|
|
38
|
-
log.info(`The format value '${format}' is unknown. Supported values are: ${SUPPORTED_FORMATS}`);
|
|
39
|
-
log.info(`Defaulting to '${DEFAULT_FORMAT}'`);
|
|
40
|
-
return DEFAULT_FORMAT;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return format;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function requireSpec(spec) {
|
|
47
|
-
const [tag, priority] = spec.split(':');
|
|
48
|
-
let resultTag = tag;
|
|
49
|
-
|
|
50
|
-
if (!resultTag) {
|
|
51
|
-
log.info(`The tag value in spec '${spec}' cannot be empty`);
|
|
52
|
-
log.info(`Defaulting to '${DEFAULT_TAG}'`);
|
|
53
|
-
resultTag = DEFAULT_TAG;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (!priority) {
|
|
57
|
-
log.info(`The priority value in spec '${spec}' is empty. Defaulting to Verbose (${DEFAULT_PRIORITY})`);
|
|
58
|
-
return `${resultTag}:${DEFAULT_PRIORITY}`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (!SUPPORTED_PRIORITIES.some(p => _lodash.default.toLower(priority) === _lodash.default.toLower(p))) {
|
|
62
|
-
log.info(`The priority value in spec '${spec}' is unknown. Supported values are: ${SUPPORTED_PRIORITIES}`);
|
|
63
|
-
log.info(`Defaulting to Verbose (${DEFAULT_PRIORITY})`);
|
|
64
|
-
return `${resultTag}:${DEFAULT_PRIORITY}`;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return spec;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function formatFilterSpecs(filterSpecs) {
|
|
71
|
-
if (!_lodash.default.isArray(filterSpecs)) {
|
|
72
|
-
filterSpecs = [filterSpecs];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return filterSpecs.filter(spec => spec && _lodash.default.isString(spec) && !spec.startsWith('-')).map(spec => spec.includes(':') ? requireSpec(spec) : spec);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
class Logcat extends EventEmitter {
|
|
79
|
-
constructor(opts = {}) {
|
|
80
|
-
super();
|
|
81
|
-
this.adb = opts.adb;
|
|
82
|
-
this.clearLogs = opts.clearDeviceLogsOnStart || false;
|
|
83
|
-
this.debug = opts.debug;
|
|
84
|
-
this.debugTrace = opts.debugTrace;
|
|
85
|
-
this.maxBufferSize = opts.maxBufferSize || MAX_BUFFER_SIZE;
|
|
86
|
-
this.logs = [];
|
|
87
|
-
this.logIdxSinceLastRequest = 0;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async startCapture(opts = {}) {
|
|
91
|
-
let started = false;
|
|
92
|
-
return await new _bluebird.default(async (_resolve, _reject) => {
|
|
93
|
-
const resolve = function (...args) {
|
|
94
|
-
started = true;
|
|
95
|
-
|
|
96
|
-
_resolve(...args);
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const reject = function (...args) {
|
|
100
|
-
started = true;
|
|
101
|
-
|
|
102
|
-
_reject(...args);
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
if (this.clearLogs) {
|
|
106
|
-
await this.clear();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const {
|
|
110
|
-
format = DEFAULT_FORMAT,
|
|
111
|
-
filterSpecs = []
|
|
112
|
-
} = opts;
|
|
113
|
-
const cmd = [...this.adb.defaultArgs, 'logcat', '-v', requireFormat(format), ...formatFilterSpecs(filterSpecs)];
|
|
114
|
-
log.debug(`Starting logs capture with command: ${_support.util.quote([this.adb.path, ...cmd])}`);
|
|
115
|
-
this.proc = new _teen_process.SubProcess(this.adb.path, cmd);
|
|
116
|
-
this.proc.on('exit', (code, signal) => {
|
|
117
|
-
log.error(`Logcat terminated with code ${code}, signal ${signal}`);
|
|
118
|
-
this.proc = null;
|
|
119
|
-
|
|
120
|
-
if (!started) {
|
|
121
|
-
log.warn('Logcat not started. Continuing');
|
|
122
|
-
resolve();
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
this.proc.on('lines-stderr', lines => {
|
|
126
|
-
for (let line of lines) {
|
|
127
|
-
if (/execvp\(\)/.test(line)) {
|
|
128
|
-
log.error('Logcat process failed to start');
|
|
129
|
-
reject(new Error(`Logcat process failed to start. stderr: ${line}`));
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
this.outputHandler(_lodash.default.trim(line), 'STDERR: ');
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
resolve();
|
|
136
|
-
});
|
|
137
|
-
this.proc.on('lines-stdout', lines => {
|
|
138
|
-
resolve();
|
|
139
|
-
|
|
140
|
-
for (let line of lines) {
|
|
141
|
-
this.outputHandler(_lodash.default.trim(line));
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
await this.proc.start(0);
|
|
145
|
-
setTimeout(resolve, LOGCAT_PROC_STARTUP_TIMEOUT);
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
outputHandler(output, prefix = '') {
|
|
150
|
-
if (!output) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (this.logs.length >= this.maxBufferSize) {
|
|
155
|
-
this.logs.shift();
|
|
156
|
-
|
|
157
|
-
if (this.logIdxSinceLastRequest > 0) {
|
|
158
|
-
--this.logIdxSinceLastRequest;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const outputObj = {
|
|
163
|
-
timestamp: Date.now(),
|
|
164
|
-
level: 'ALL',
|
|
165
|
-
message: output
|
|
166
|
-
};
|
|
167
|
-
this.logs.push(outputObj);
|
|
168
|
-
this.emit('output', outputObj);
|
|
169
|
-
const isTrace = /W\/Trace/.test(output);
|
|
170
|
-
|
|
171
|
-
if (this.debug && (!isTrace || this.debugTrace)) {
|
|
172
|
-
log.debug(prefix + output);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
async stopCapture() {
|
|
177
|
-
log.debug('Stopping logcat capture');
|
|
178
|
-
|
|
179
|
-
if (!this.proc || !this.proc.isRunning) {
|
|
180
|
-
log.debug('Logcat already stopped');
|
|
181
|
-
this.proc = null;
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
this.proc.removeAllListeners('exit');
|
|
186
|
-
await this.proc.stop();
|
|
187
|
-
this.proc = null;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
getLogs() {
|
|
191
|
-
if (this.logIdxSinceLastRequest < this.logs.length) {
|
|
192
|
-
const result = this.logs.slice(this.logIdxSinceLastRequest);
|
|
193
|
-
this.logIdxSinceLastRequest = this.logs.length;
|
|
194
|
-
return result;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return [];
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
getAllLogs() {
|
|
201
|
-
return this.logs;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
async clear() {
|
|
205
|
-
log.debug('Clearing logcat logs from device');
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
const args = [...this.adb.defaultArgs, 'logcat', '-c'];
|
|
209
|
-
await (0, _teen_process.exec)(this.adb.path, args);
|
|
210
|
-
} catch (err) {
|
|
211
|
-
log.warn(`Failed to clear logcat logs: ${err.stderr || err.message}`);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
var _default = Logcat;
|
|
218
|
-
exports.default = _default;require('source-map-support').install();
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2xvZ2NhdC5qcyIsIm5hbWVzIjpbIkV2ZW50RW1pdHRlciIsImV2ZW50cyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIk1BWF9CVUZGRVJfU0laRSIsIkxPR0NBVF9QUk9DX1NUQVJUVVBfVElNRU9VVCIsIlNVUFBPUlRFRF9GT1JNQVRTIiwiU1VQUE9SVEVEX1BSSU9SSVRJRVMiLCJERUZBVUxUX1BSSU9SSVRZIiwiREVGQVVMVF9UQUciLCJERUZBVUxUX0ZPUk1BVCIsInJlcXVpcmVGb3JtYXQiLCJmb3JtYXQiLCJpbmNsdWRlcyIsImluZm8iLCJyZXF1aXJlU3BlYyIsInNwZWMiLCJ0YWciLCJwcmlvcml0eSIsInNwbGl0IiwicmVzdWx0VGFnIiwic29tZSIsInAiLCJfIiwidG9Mb3dlciIsImZvcm1hdEZpbHRlclNwZWNzIiwiZmlsdGVyU3BlY3MiLCJpc0FycmF5IiwiZmlsdGVyIiwiaXNTdHJpbmciLCJzdGFydHNXaXRoIiwibWFwIiwiTG9nY2F0IiwiY29uc3RydWN0b3IiLCJvcHRzIiwiYWRiIiwiY2xlYXJMb2dzIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImRlYnVnIiwiZGVidWdUcmFjZSIsIm1heEJ1ZmZlclNpemUiLCJsb2dzIiwibG9nSWR4U2luY2VMYXN0UmVxdWVzdCIsInN0YXJ0Q2FwdHVyZSIsInN0YXJ0ZWQiLCJCIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzb2x2ZSIsImFyZ3MiLCJyZWplY3QiLCJjbGVhciIsImNtZCIsImRlZmF1bHRBcmdzIiwidXRpbCIsInF1b3RlIiwicGF0aCIsInByb2MiLCJTdWJQcm9jZXNzIiwib24iLCJjb2RlIiwic2lnbmFsIiwiZXJyb3IiLCJ3YXJuIiwibGluZXMiLCJsaW5lIiwidGVzdCIsIkVycm9yIiwib3V0cHV0SGFuZGxlciIsInRyaW0iLCJzdGFydCIsInNldFRpbWVvdXQiLCJvdXRwdXQiLCJwcmVmaXgiLCJsZW5ndGgiLCJzaGlmdCIsIm91dHB1dE9iaiIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJsZXZlbCIsIm1lc3NhZ2UiLCJwdXNoIiwiZW1pdCIsImlzVHJhY2UiLCJzdG9wQ2FwdHVyZSIsImlzUnVubmluZyIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0b3AiLCJnZXRMb2dzIiwicmVzdWx0Iiwic2xpY2UiLCJnZXRBbGxMb2dzIiwiZXhlYyIsImVyciIsInN0ZGVyciJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9sb2djYXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGxvZ2dlciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5jb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gZXZlbnRzO1xuaW1wb3J0IHsgU3ViUHJvY2VzcywgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0xvZ2NhdCcpO1xuY29uc3QgTUFYX0JVRkZFUl9TSVpFID0gMTAwMDA7XG5jb25zdCBMT0dDQVRfUFJPQ19TVEFSVFVQX1RJTUVPVVQgPSAxMDAwMDtcbmNvbnN0IFNVUFBPUlRFRF9GT1JNQVRTID0gWydicmllZicsICdwcm9jZXNzJywgJ3RhZycsICd0aHJlYWQnLCAncmF3JywgJ3RpbWUnLCAndGhyZWFkdGltZScsICdsb25nJ107XG5jb25zdCBTVVBQT1JURURfUFJJT1JJVElFUyA9IFsndicsICdkJywgJ2knLCAndycsICdlJywgJ2YnLCAncyddO1xuY29uc3QgREVGQVVMVF9QUklPUklUWSA9ICd2JztcbmNvbnN0IERFRkFVTFRfVEFHID0gJyonO1xuY29uc3QgREVGQVVMVF9GT1JNQVQgPSAndGhyZWFkdGltZSc7XG5cbmZ1bmN0aW9uIHJlcXVpcmVGb3JtYXQgKGZvcm1hdCkge1xuICBpZiAoIVNVUFBPUlRFRF9GT1JNQVRTLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGZvcm1hdCB2YWx1ZSAnJHtmb3JtYXR9JyBpcyB1bmtub3duLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogJHtTVVBQT1JURURfRk9STUFUU31gKTtcbiAgICBsb2cuaW5mbyhgRGVmYXVsdGluZyB0byAnJHtERUZBVUxUX0ZPUk1BVH0nYCk7XG4gICAgcmV0dXJuIERFRkFVTFRfRk9STUFUO1xuICB9XG4gIHJldHVybiBmb3JtYXQ7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVTcGVjIChzcGVjKSB7XG4gIGNvbnN0IFt0YWcsIHByaW9yaXR5XSA9IHNwZWMuc3BsaXQoJzonKTtcbiAgbGV0IHJlc3VsdFRhZyA9IHRhZztcbiAgaWYgKCFyZXN1bHRUYWcpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHRhZyB2YWx1ZSBpbiBzcGVjICcke3NwZWN9JyBjYW5ub3QgYmUgZW1wdHlgKTtcbiAgICBsb2cuaW5mbyhgRGVmYXVsdGluZyB0byAnJHtERUZBVUxUX1RBR30nYCk7XG4gICAgcmVzdWx0VGFnID0gREVGQVVMVF9UQUc7XG4gIH1cbiAgaWYgKCFwcmlvcml0eSkge1xuICAgIGxvZy5pbmZvKGBUaGUgcHJpb3JpdHkgdmFsdWUgaW4gc3BlYyAnJHtzcGVjfScgaXMgZW1wdHkuIERlZmF1bHRpbmcgdG8gVmVyYm9zZSAoJHtERUZBVUxUX1BSSU9SSVRZfSlgKTtcbiAgICByZXR1cm4gYCR7cmVzdWx0VGFnfToke0RFRkFVTFRfUFJJT1JJVFl9YDtcbiAgfVxuICBpZiAoIVNVUFBPUlRFRF9QUklPUklUSUVTLnNvbWUoKHApID0+IF8udG9Mb3dlcihwcmlvcml0eSkgPT09IF8udG9Mb3dlcihwKSkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHByaW9yaXR5IHZhbHVlIGluIHNwZWMgJyR7c3BlY30nIGlzIHVua25vd24uIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOiAke1NVUFBPUlRFRF9QUklPUklUSUVTfWApO1xuICAgIGxvZy5pbmZvKGBEZWZhdWx0aW5nIHRvIFZlcmJvc2UgKCR7REVGQVVMVF9QUklPUklUWX0pYCk7XG4gICAgcmV0dXJuIGAke3Jlc3VsdFRhZ306JHtERUZBVUxUX1BSSU9SSVRZfWA7XG4gIH1cbiAgcmV0dXJuIHNwZWM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbHRlclNwZWNzIChmaWx0ZXJTcGVjcykge1xuICBpZiAoIV8uaXNBcnJheShmaWx0ZXJTcGVjcykpIHtcbiAgICBmaWx0ZXJTcGVjcyA9IFtmaWx0ZXJTcGVjc107XG4gIH1cbiAgcmV0dXJuIGZpbHRlclNwZWNzXG4gICAgLmZpbHRlcigoc3BlYykgPT4gc3BlYyAmJiBfLmlzU3RyaW5nKHNwZWMpICYmICFzcGVjLnN0YXJ0c1dpdGgoJy0nKSlcbiAgICAubWFwKChzcGVjKSA9PiBzcGVjLmluY2x1ZGVzKCc6JykgPyByZXF1aXJlU3BlYyhzcGVjKSA6IHNwZWMpO1xufVxuXG5cbmNsYXNzIExvZ2NhdCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRiID0gb3B0cy5hZGI7XG4gICAgdGhpcy5jbGVhckxvZ3MgPSBvcHRzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQgfHwgZmFsc2U7XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdHMuZGVidWc7XG4gICAgdGhpcy5kZWJ1Z1RyYWNlID0gb3B0cy5kZWJ1Z1RyYWNlO1xuICAgIHRoaXMubWF4QnVmZmVyU2l6ZSA9IG9wdHMubWF4QnVmZmVyU2l6ZSB8fCBNQVhfQlVGRkVSX1NJWkU7XG4gICAgdGhpcy5sb2dzID0gW107XG4gICAgdGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID0gMDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0Q2FwdHVyZSAob3B0cyA9IHt9KSB7XG4gICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuICAgICAgY29uc3QgcmVzb2x2ZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBfcmVzb2x2ZSguLi5hcmdzKTtcbiAgICAgIH07XG4gICAgICBjb25zdCByZWplY3QgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgX3JlamVjdCguLi5hcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLmNsZWFyTG9ncykge1xuICAgICAgICBhd2FpdCB0aGlzLmNsZWFyKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZm9ybWF0ID0gREVGQVVMVF9GT1JNQVQsXG4gICAgICAgIGZpbHRlclNwZWNzID0gW10sXG4gICAgICB9ID0gb3B0cztcbiAgICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICAgLi4udGhpcy5hZGIuZGVmYXVsdEFyZ3MsXG4gICAgICAgICdsb2djYXQnLFxuICAgICAgICAnLXYnLCByZXF1aXJlRm9ybWF0KGZvcm1hdCksXG4gICAgICAgIC4uLmZvcm1hdEZpbHRlclNwZWNzKGZpbHRlclNwZWNzKSxcbiAgICAgIF07XG4gICAgICBsb2cuZGVidWcoYFN0YXJ0aW5nIGxvZ3MgY2FwdHVyZSB3aXRoIGNvbW1hbmQ6ICR7dXRpbC5xdW90ZShbdGhpcy5hZGIucGF0aCwgLi4uY21kXSl9YCk7XG4gICAgICB0aGlzLnByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmFkYi5wYXRoLCBjbWQpO1xuICAgICAgdGhpcy5wcm9jLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoYExvZ2NhdCB0ZXJtaW5hdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gICAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICAgIGlmICghc3RhcnRlZCkge1xuICAgICAgICAgIGxvZy53YXJuKCdMb2djYXQgbm90IHN0YXJ0ZWQuIENvbnRpbnVpbmcnKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9jLm9uKCdsaW5lcy1zdGRlcnInLCAobGluZXMpID0+IHtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgIGlmICgvZXhlY3ZwXFwoXFwpLy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0xvZ2NhdCBwcm9jZXNzIGZhaWxlZCB0byBzdGFydCcpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgTG9nY2F0IHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0LiBzdGRlcnI6ICR7bGluZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlcihfLnRyaW0obGluZSksICdTVERFUlI6ICcpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9jLm9uKCdsaW5lcy1zdGRvdXQnLCAobGluZXMpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgdGhpcy5vdXRwdXRIYW5kbGVyKF8udHJpbShsaW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wcm9jLnN0YXJ0KDApO1xuICAgICAgLy8gcmVzb2x2ZSBhZnRlciBhIHRpbWVvdXQsIGV2ZW4gaWYgbm8gb3V0cHV0IHdhcyByZWNvcmRlZFxuICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBMT0dDQVRfUFJPQ19TVEFSVFVQX1RJTUVPVVQpO1xuICAgIH0pO1xuICB9XG5cbiAgb3V0cHV0SGFuZGxlciAob3V0cHV0LCBwcmVmaXggPSAnJykge1xuICAgIGlmICghb3V0cHV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9ncy5sZW5ndGggPj0gdGhpcy5tYXhCdWZmZXJTaXplKSB7XG4gICAgICB0aGlzLmxvZ3Muc2hpZnQoKTtcbiAgICAgIGlmICh0aGlzLmxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QgPiAwKSB7XG4gICAgICAgIC0tdGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvdXRwdXRPYmogPSB7XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBsZXZlbDogJ0FMTCcsXG4gICAgICBtZXNzYWdlOiBvdXRwdXQsXG4gICAgfTtcbiAgICB0aGlzLmxvZ3MucHVzaChvdXRwdXRPYmopO1xuICAgIHRoaXMuZW1pdCgnb3V0cHV0Jywgb3V0cHV0T2JqKTtcbiAgICBjb25zdCBpc1RyYWNlID0gL1dcXC9UcmFjZS8udGVzdChvdXRwdXQpO1xuICAgIGlmICh0aGlzLmRlYnVnICYmICghaXNUcmFjZSB8fCB0aGlzLmRlYnVnVHJhY2UpKSB7XG4gICAgICBsb2cuZGVidWcocHJlZml4ICsgb3V0cHV0KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wQ2FwdHVyZSAoKSB7XG4gICAgbG9nLmRlYnVnKCdTdG9wcGluZyBsb2djYXQgY2FwdHVyZScpO1xuICAgIGlmICghdGhpcy5wcm9jIHx8ICF0aGlzLnByb2MuaXNSdW5uaW5nKSB7XG4gICAgICBsb2cuZGVidWcoJ0xvZ2NhdCBhbHJlYWR5IHN0b3BwZWQnKTtcbiAgICAgIHRoaXMucHJvYyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2V4aXQnKTtcbiAgICBhd2FpdCB0aGlzLnByb2Muc3RvcCgpO1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gIH1cblxuICBnZXRMb2dzICgpIHtcbiAgICBpZiAodGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0IDwgdGhpcy5sb2dzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5sb2dzLnNsaWNlKHRoaXMubG9nSWR4U2luY2VMYXN0UmVxdWVzdCk7XG4gICAgICB0aGlzLmxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QgPSB0aGlzLmxvZ3MubGVuZ3RoO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0QWxsTG9ncyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9ncztcbiAgfVxuXG4gIGFzeW5jIGNsZWFyICgpIHtcbiAgICBsb2cuZGVidWcoJ0NsZWFyaW5nIGxvZ2NhdCBsb2dzIGZyb20gZGV2aWNlJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBbLi4udGhpcy5hZGIuZGVmYXVsdEFyZ3MsICdsb2djYXQnLCAnLWMnXTtcbiAgICAgIGF3YWl0IGV4ZWModGhpcy5hZGIucGF0aCwgYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRmFpbGVkIHRvIGNsZWFyIGxvZ2NhdCBsb2dzOiAke2Vyci5zdGRlcnIgfHwgZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2NhdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFEQSxNQUFNO0VBQUVBO0FBQUYsSUFBbUJDLGVBQXpCOztBQUdBLE1BQU1DLEdBQUcsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQVo7O0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEtBQXhCO0FBQ0EsTUFBTUMsMkJBQTJCLEdBQUcsS0FBcEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLE9BQUQsRUFBVSxTQUFWLEVBQXFCLEtBQXJCLEVBQTRCLFFBQTVCLEVBQXNDLEtBQXRDLEVBQTZDLE1BQTdDLEVBQXFELFlBQXJELEVBQW1FLE1BQW5FLENBQTFCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcs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
|
package/build/lib/logger.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
|
|
8
|
-
require("source-map-support/register");
|
|
9
|
-
|
|
10
|
-
var _support = require("@appium/support");
|
|
11
|
-
|
|
12
|
-
const log = _support.logger.getLogger('ADB');
|
|
13
|
-
|
|
14
|
-
var _default = log;
|
|
15
|
-
exports.default = _default;require('source-map-support').install();
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2xvZ2dlci5qcyIsIm5hbWVzIjpbImxvZyIsImxvZ2dlciIsImdldExvZ2dlciJdLCJzb3VyY2VSb290IjoiLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9sb2dnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQURCJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGxvZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxlQUFBLENBQU9DLFNBQVAsQ0FBaUIsS0FBakIsQ0FBWjs7ZUFFZUYsRyJ9
|
|
@@ -1,157 +0,0 @@
|
|
|
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
|
-
|
|
10
|
-
require("source-map-support/register");
|
|
11
|
-
|
|
12
|
-
var _logger = _interopRequireDefault(require("../logger.js"));
|
|
13
|
-
|
|
14
|
-
var _path = _interopRequireDefault(require("path"));
|
|
15
|
-
|
|
16
|
-
var _support = require("@appium/support");
|
|
17
|
-
|
|
18
|
-
var _lruCache = _interopRequireDefault(require("lru-cache"));
|
|
19
|
-
|
|
20
|
-
var _helpers = require("../helpers.js");
|
|
21
|
-
|
|
22
|
-
var _asyncLock = _interopRequireDefault(require("async-lock"));
|
|
23
|
-
|
|
24
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
25
|
-
|
|
26
|
-
var _crypto = _interopRequireDefault(require("crypto"));
|
|
27
|
-
|
|
28
|
-
const AAB_CACHE = new _lruCache.default({
|
|
29
|
-
max: 10,
|
|
30
|
-
dispose: (hash, extractedFilesRoot) => _support.fs.rimraf(extractedFilesRoot)
|
|
31
|
-
});
|
|
32
|
-
const AAB_CACHE_GUARD = new _asyncLock.default();
|
|
33
|
-
const UNIVERSAL_APK = 'universal.apk';
|
|
34
|
-
const aabUtilsMethods = {};
|
|
35
|
-
process.on('exit', () => {
|
|
36
|
-
if (!AAB_CACHE.size) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const paths = [...AAB_CACHE.values()];
|
|
41
|
-
|
|
42
|
-
_logger.default.debug(`Performing cleanup of ${paths.length} cached .aab ` + _support.util.pluralize('package', paths.length));
|
|
43
|
-
|
|
44
|
-
for (const appPath of paths) {
|
|
45
|
-
try {
|
|
46
|
-
_support.fs.rimrafSync(appPath);
|
|
47
|
-
} catch (e) {
|
|
48
|
-
_logger.default.warn(e.message);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
aabUtilsMethods.extractUniversalApk = async function extractUniversalApk(aabPath, opts = {}) {
|
|
54
|
-
if (!(await _support.fs.exists(aabPath))) {
|
|
55
|
-
throw new Error(`The file at '${aabPath}' either does not exist or is not accessible`);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const aabName = _path.default.basename(aabPath);
|
|
59
|
-
|
|
60
|
-
const apkName = aabName.substring(0, aabName.length - _path.default.extname(aabName).length) + '.apk';
|
|
61
|
-
const tmpRoot = await _support.tempDir.openDir();
|
|
62
|
-
|
|
63
|
-
const tmpApksPath = _path.default.join(tmpRoot, `${aabName}.apks`);
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
return await AAB_CACHE_GUARD.acquire(aabPath, async () => {
|
|
67
|
-
const aabHash = await _support.fs.hash(aabPath);
|
|
68
|
-
const {
|
|
69
|
-
keystore,
|
|
70
|
-
keystorePassword,
|
|
71
|
-
keyAlias,
|
|
72
|
-
keyPassword
|
|
73
|
-
} = opts;
|
|
74
|
-
let cacheHash = aabHash;
|
|
75
|
-
|
|
76
|
-
if (keystore) {
|
|
77
|
-
if (!(await _support.fs.exists(keystore))) {
|
|
78
|
-
throw new Error(`The keystore file at '${keystore}' either does not exist ` + `or is not accessible`);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!keystorePassword || !keyAlias || !keyPassword) {
|
|
82
|
-
throw new Error('It is mandatory to also provide keystore password, key alias, ' + 'and key password if the keystore path is set');
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const keystoreHash = await _support.fs.hash(keystore);
|
|
86
|
-
|
|
87
|
-
const keyAliasHash = _crypto.default.createHash('sha1');
|
|
88
|
-
|
|
89
|
-
keyAliasHash.update(keyAlias);
|
|
90
|
-
cacheHash = [cacheHash, keystoreHash, keyAliasHash.digest('hex')].join(':');
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
_logger.default.debug(`Calculated the cache key for '${aabPath}': ${cacheHash}`);
|
|
94
|
-
|
|
95
|
-
if (AAB_CACHE.has(cacheHash)) {
|
|
96
|
-
const resultPath = _path.default.resolve(AAB_CACHE.get(cacheHash), apkName);
|
|
97
|
-
|
|
98
|
-
if (await _support.fs.exists(resultPath)) {
|
|
99
|
-
return resultPath;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
AAB_CACHE.del(cacheHash);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
await this.initAapt2();
|
|
106
|
-
const args = ['build-apks', '--aapt2', this.binaries.aapt2, '--bundle', aabPath, '--output', tmpApksPath, ...(keystore ? ['--ks', keystore, '--ks-pass', `pass:${keystorePassword}`, '--ks-key-alias', keyAlias, '--key-pass', `pass:${keyPassword}`] : []), '--mode=universal'];
|
|
107
|
-
|
|
108
|
-
_logger.default.debug(`Preparing universal .apks bundle from '${aabPath}'`);
|
|
109
|
-
|
|
110
|
-
await this.execBundletool(args, `Cannot build a universal .apks bundle from '${aabPath}'`);
|
|
111
|
-
|
|
112
|
-
_logger.default.debug(`Unpacking universal application bundle at '${tmpApksPath}' to '${tmpRoot}'`);
|
|
113
|
-
|
|
114
|
-
await (0, _helpers.unzipFile)(tmpApksPath, tmpRoot);
|
|
115
|
-
let universalApkPath;
|
|
116
|
-
const fileDeletionPromises = [];
|
|
117
|
-
const allFileNames = await _support.fs.readdir(tmpRoot);
|
|
118
|
-
|
|
119
|
-
for (const fileName of allFileNames) {
|
|
120
|
-
const fullPath = _path.default.join(tmpRoot, fileName);
|
|
121
|
-
|
|
122
|
-
if (fileName === UNIVERSAL_APK) {
|
|
123
|
-
universalApkPath = fullPath;
|
|
124
|
-
} else {
|
|
125
|
-
fileDeletionPromises.push(_support.fs.rimraf(fullPath));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
await _bluebird.default.all(fileDeletionPromises);
|
|
131
|
-
} catch (ign) {}
|
|
132
|
-
|
|
133
|
-
if (!universalApkPath) {
|
|
134
|
-
_logger.default.debug(`The following items were extracted from the .aab bundle: ${allFileNames}`);
|
|
135
|
-
|
|
136
|
-
throw new Error(`${UNIVERSAL_APK} cannot be found in '${aabPath}' bundle. ` + `Does the archive contain a valid application bundle?`);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const resultPath = _path.default.join(tmpRoot, apkName);
|
|
140
|
-
|
|
141
|
-
_logger.default.debug(`Found ${UNIVERSAL_APK} at '${universalApkPath}'. Caching it to '${resultPath}'`);
|
|
142
|
-
|
|
143
|
-
await _support.fs.mv(universalApkPath, resultPath);
|
|
144
|
-
AAB_CACHE.set(cacheHash, tmpRoot);
|
|
145
|
-
return resultPath;
|
|
146
|
-
});
|
|
147
|
-
} catch (e) {
|
|
148
|
-
await _support.fs.rimraf(tmpRoot);
|
|
149
|
-
throw e;
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
var _default = aabUtilsMethods;
|
|
154
|
-
exports.default = _default;require('source-map-support').install();
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL2FhYi11dGlscy5qcyIsIm5hbWVzIjpbIkFBQl9DQUNIRSIsIkxSVSIsIm1heCIsImRpc3Bvc2UiLCJoYXNoIiwiZXh0cmFjdGVkRmlsZXNSb290IiwiZnMiLCJyaW1yYWYiLCJBQUJfQ0FDSEVfR1VBUkQiLCJBc3luY0xvY2siLCJVTklWRVJTQUxfQVBLIiwiYWFiVXRpbHNNZXRob2RzIiwicHJvY2VzcyIsIm9uIiwic2l6ZSIsInBhdGhzIiwidmFsdWVzIiwibG9nIiwiZGVidWciLCJsZW5ndGgiLCJ1dGlsIiwicGx1cmFsaXplIiwiYXBwUGF0aCIsInJpbXJhZlN5bmMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJleHRyYWN0VW5pdmVyc2FsQXBrIiwiYWFiUGF0aCIsIm9wdHMiLCJleGlzdHMiLCJFcnJvciIsImFhYk5hbWUiLCJwYXRoIiwiYmFzZW5hbWUiLCJhcGtOYW1lIiwic3Vic3RyaW5nIiwiZXh0bmFtZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInRtcEFwa3NQYXRoIiwiam9pbiIsImFjcXVpcmUiLCJhYWJIYXNoIiwia2V5c3RvcmUiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsImNhY2hlSGFzaCIsImtleXN0b3JlSGFzaCIsImtleUFsaWFzSGFzaCIsImNyeXB0byIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJoYXMiLCJyZXN1bHRQYXRoIiwicmVzb2x2ZSIsImdldCIsImRlbCIsImluaXRBYXB0MiIsImFyZ3MiLCJiaW5hcmllcyIsImFhcHQyIiwiZXhlY0J1bmRsZXRvb2wiLCJ1bnppcEZpbGUiLCJ1bml2ZXJzYWxBcGtQYXRoIiwiZmlsZURlbGV0aW9uUHJvbWlzZXMiLCJhbGxGaWxlTmFtZXMiLCJyZWFkZGlyIiwiZmlsZU5hbWUiLCJmdWxsUGF0aCIsInB1c2giLCJCIiwiYWxsIiwiaWduIiwibXYiLCJzZXQiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvdG9vbHMvYWFiLXV0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHsgdW56aXBGaWxlIH0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgQXN5bmNMb2NrIGZyb20gJ2FzeW5jLWxvY2snO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5jb25zdCBBQUJfQ0FDSEUgPSBuZXcgTFJVKHtcbiAgbWF4OiAxMCxcbiAgZGlzcG9zZTogKGhhc2gsIGV4dHJhY3RlZEZpbGVzUm9vdCkgPT4gZnMucmltcmFmKGV4dHJhY3RlZEZpbGVzUm9vdCksXG59KTtcbmNvbnN0IEFBQl9DQUNIRV9HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcbmNvbnN0IFVOSVZFUlNBTF9BUEsgPSAndW5pdmVyc2FsLmFwayc7XG5cbmNvbnN0IGFhYlV0aWxzTWV0aG9kcyA9IHt9O1xuXG5wcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICBpZiAoIUFBQl9DQUNIRS5zaXplKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGF0aHMgPSBbLi4uQUFCX0NBQ0hFLnZhbHVlcygpXTtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGNsZWFudXAgb2YgJHtwYXRocy5sZW5ndGh9IGNhY2hlZCAuYWFiIGAgK1xuICAgIHV0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGF0aHMubGVuZ3RoKSk7XG4gIGZvciAoY29uc3QgYXBwUGF0aCBvZiBwYXRocykge1xuICAgIHRyeSB7XG4gICAgICAvLyBBc3luY2hyb25vdXMgY2FsbHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gb25FeGl0IGhhbmRsZXJcbiAgICAgIGZzLnJpbXJhZlN5bmMoYXBwUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwa0NyZWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleXN0b3JlIFNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCBrZXlzdG9yZSB1c2VkXG4gKiB0byBzaWduIHRoZSBBUEtzLiBUaGlzIGZsYWcgaXMgb3B0aW9uYWwuIElmIHlvdSBkb24ndCBpbmNsdWRlIGl0LFxuICogYnVuZGxldG9vbCBhdHRlbXB0cyB0byBzaWduIHlvdXIgQVBLcyB3aXRoIGEgZGVidWcgc2lnbmluZyBrZXkuXG4gKiBJZiB0aGUgLmFwayBoYXMgYmVlbiBhbHJlYWR5IHNpZ25lZCBhbmQgY2FjaGVkIHRoZW4gaXQgaXMgbm90IGdvaW5nIHRvIGJlIHJlc2lnbmVkXG4gKiB1bmxlc3MgYSBkaWZmZXJlbnQga2V5c3RvcmUgb3Iga2V5IGFsaWFzIGlzIHVzZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30ga2V5c3RvcmVQYXNzd29yZCBTcGVjaWZpZXMgeW91ciBrZXlzdG9yZeKAmXMgcGFzc3dvcmQuXG4gKiBJdCBpcyBtYW5kYXRvcnkgdG8gcHJvdmlkZSB0aGlzIHZhbHVlIGlmIGBrZXlzdG9yZWAgb25lIGlzIGFzc2lnbmVkXG4gKiBvdGhlcndpc2UgaXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlBbGlhcyBTcGVjaWZpZXMgdGhlIGFsaWFzIG9mIHRoZSBzaWduaW5nIGtleSB5b3Ugd2FudCB0byB1c2UuXG4gKiBJdCBpcyBtYW5kYXRvcnkgdG8gcHJvdmlkZSB0aGlzIHZhbHVlIGlmIGBrZXlzdG9yZWAgb25lIGlzIGFzc2lnbmVkXG4gKiBvdGhlcndpc2UgaXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlQYXNzd29yZCBTcGVjaWZpZXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgc2lnbmluZyBrZXkuXG4gKiBJdCBpcyBtYW5kYXRvcnkgdG8gcHJvdmlkZSB0aGlzIHZhbHVlIGlmIGBrZXlzdG9yZWAgb25lIGlzIGFzc2lnbmVkXG4gKiBvdGhlcndpc2UgaXQgaXMgZ29pbmcgdG8gYmUgaWdub3JlZC5cbiAqL1xuXG4vKipcbiAqIEJ1aWxkcyBhIHVuaXZlcnNhbCAuYXBrIGZyb20gdGhlIGdpdmVuIC5hYWIgcGFja2FnZS4gU2VlXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL2J1bmRsZXRvb2wjZ2VuZXJhdGVfYXBrc1xuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWFiUGF0aCBGdWxsIHBhdGggdG8gdGhlIHNvdXJjZSAuYWFiIHBhY2thZ2VcbiAqIEBwYXJhbSB7QXBrQ3JlYXRpb25PcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGUgcmVzdWx0aW5nIHVuaXZlcnNhbCAuYXBrLiBUaGUgLmFwayBpcyBzdG9yZWQgaW4gdGhlIGludGVybmFsIGNhY2hlXG4gKiBieSBkZWZhdWx0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgdW5pdmVyc2FsIC5hcGtcbiAqL1xuYWFiVXRpbHNNZXRob2RzLmV4dHJhY3RVbml2ZXJzYWxBcGsgPSBhc3luYyBmdW5jdGlvbiBleHRyYWN0VW5pdmVyc2FsQXBrIChhYWJQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMoYWFiUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmaWxlIGF0ICcke2FhYlBhdGh9JyBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGVgKTtcbiAgfVxuXG4gIGNvbnN0IGFhYk5hbWUgPSBwYXRoLmJhc2VuYW1lKGFhYlBhdGgpO1xuICBjb25zdCBhcGtOYW1lID0gYWFiTmFtZS5zdWJzdHJpbmcoMCwgYWFiTmFtZS5sZW5ndGggLSBwYXRoLmV4dG5hbWUoYWFiTmFtZSkubGVuZ3RoKSArICcuYXBrJztcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCB0bXBBcGtzUGF0aCA9IHBhdGguam9pbih0bXBSb290LCBgJHthYWJOYW1lfS5hcGtzYCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IEFBQl9DQUNIRV9HVUFSRC5hY3F1aXJlKGFhYlBhdGgsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFhYkhhc2ggPSBhd2FpdCBmcy5oYXNoKGFhYlBhdGgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBrZXlzdG9yZSxcbiAgICAgICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICAgICAga2V5QWxpYXMsXG4gICAgICAgIGtleVBhc3N3b3JkLFxuICAgICAgfSA9IG9wdHM7XG4gICAgICBsZXQgY2FjaGVIYXNoID0gYWFiSGFzaDtcbiAgICAgIGlmIChrZXlzdG9yZSkge1xuICAgICAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhrZXlzdG9yZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBrZXlzdG9yZSBmaWxlIGF0ICcke2tleXN0b3JlfScgZWl0aGVyIGRvZXMgbm90IGV4aXN0IGAgK1xuICAgICAgICAgICAgYG9yIGlzIG5vdCBhY2Nlc3NpYmxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFrZXlzdG9yZVBhc3N3b3JkIHx8ICFrZXlBbGlhcyB8fCAha2V5UGFzc3dvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0IGlzIG1hbmRhdG9yeSB0byBhbHNvIHByb3ZpZGUga2V5c3RvcmUgcGFzc3dvcmQsIGtleSBhbGlhcywgJyArXG4gICAgICAgICAgICAnYW5kIGtleSBwYXNzd29yZCBpZiB0aGUga2V5c3RvcmUgcGF0aCBpcyBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzdG9yZUhhc2ggPSBhd2FpdCBmcy5oYXNoKGtleXN0b3JlKTtcbiAgICAgICAgY29uc3Qga2V5QWxpYXNIYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcbiAgICAgICAga2V5QWxpYXNIYXNoLnVwZGF0ZShrZXlBbGlhcyk7XG4gICAgICAgIGNhY2hlSGFzaCA9IFtjYWNoZUhhc2gsIGtleXN0b3JlSGFzaCwga2V5QWxpYXNIYXNoLmRpZ2VzdCgnaGV4JyldLmpvaW4oJzonKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgQ2FsY3VsYXRlZCB0aGUgY2FjaGUga2V5IGZvciAnJHthYWJQYXRofSc6ICR7Y2FjaGVIYXNofWApO1xuICAgICAgaWYgKEFBQl9DQUNIRS5oYXMoY2FjaGVIYXNoKSkge1xuICAgICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5yZXNvbHZlKEFBQl9DQUNIRS5nZXQoY2FjaGVIYXNoKSwgYXBrTmFtZSk7XG4gICAgICAgIGlmIChhd2FpdCBmcy5leGlzdHMocmVzdWx0UGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICBBQUJfQ0FDSEUuZGVsKGNhY2hlSGFzaCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdEFhcHQyKCk7XG4gICAgICBjb25zdCBhcmdzID0gW1xuICAgICAgICAnYnVpbGQtYXBrcycsXG4gICAgICAgICctLWFhcHQyJywgdGhpcy5iaW5hcmllcy5hYXB0MixcbiAgICAgICAgJy0tYnVuZGxlJywgYWFiUGF0aCxcbiAgICAgICAgJy0tb3V0cHV0JywgdG1wQXBrc1BhdGgsXG4gICAgICAgIC4uLihrZXlzdG9yZSA/IFtcbiAgICAgICAgICAnLS1rcycsIGtleXN0b3JlLFxuICAgICAgICAgICctLWtzLXBhc3MnLCBgcGFzczoke2tleXN0b3JlUGFzc3dvcmR9YCxcbiAgICAgICAgICAnLS1rcy1rZXktYWxpYXMnLCBrZXlBbGlhcyxcbiAgICAgICAgICAnLS1rZXktcGFzcycsIGBwYXNzOiR7a2V5UGFzc3dvcmR9YCxcbiAgICAgICAgXSA6IFtdKSxcbiAgICAgICAgJy0tbW9kZT11bml2ZXJzYWwnXG4gICAgICBdO1xuICAgICAgbG9nLmRlYnVnKGBQcmVwYXJpbmcgdW5pdmVyc2FsIC5hcGtzIGJ1bmRsZSBmcm9tICcke2FhYlBhdGh9J2ApO1xuICAgICAgYXdhaXQgdGhpcy5leGVjQnVuZGxldG9vbChhcmdzLCBgQ2Fubm90IGJ1aWxkIGEgdW5pdmVyc2FsIC5hcGtzIGJ1bmRsZSBmcm9tICcke2FhYlBhdGh9J2ApO1xuXG4gICAgICBsb2cuZGVidWcoYFVucGFja2luZyB1bml2ZXJzYWwgYXBwbGljYXRpb24gYnVuZGxlIGF0ICcke3RtcEFwa3NQYXRofScgdG8gJyR7dG1wUm9vdH0nYCk7XG4gICAgICBhd2FpdCB1bnppcEZpbGUodG1wQXBrc1BhdGgsIHRtcFJvb3QpO1xuICAgICAgbGV0IHVuaXZlcnNhbEFwa1BhdGg7XG4gICAgICBjb25zdCBmaWxlRGVsZXRpb25Qcm9taXNlcyA9IFtdO1xuICAgICAgY29uc3QgYWxsRmlsZU5hbWVzID0gYXdhaXQgZnMucmVhZGRpcih0bXBSb290KTtcbiAgICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgYWxsRmlsZU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsIGZpbGVOYW1lKTtcbiAgICAgICAgaWYgKGZpbGVOYW1lID09PSBVTklWRVJTQUxfQVBLKSB7XG4gICAgICAgICAgdW5pdmVyc2FsQXBrUGF0aCA9IGZ1bGxQYXRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVEZWxldGlvblByb21pc2VzLnB1c2goZnMucmltcmFmKGZ1bGxQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKGZpbGVEZWxldGlvblByb21pc2VzKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAgIGlmICghdW5pdmVyc2FsQXBrUGF0aCkge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBmb2xsb3dpbmcgaXRlbXMgd2VyZSBleHRyYWN0ZWQgZnJvbSB0aGUgLmFhYiBidW5kbGU6ICR7YWxsRmlsZU5hbWVzfWApO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7VU5JVkVSU0FMX0FQS30gY2Fubm90IGJlIGZvdW5kIGluICcke2FhYlBhdGh9JyBidW5kbGUuIGAgK1xuICAgICAgICAgIGBEb2VzIHRoZSBhcmNoaXZlIGNvbnRhaW4gYSB2YWxpZCBhcHBsaWNhdGlvbiBidW5kbGU/YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHRQYXRoID0gcGF0aC5qb2luKHRtcFJvb3QsIGFwa05hbWUpO1xuICAgICAgbG9nLmRlYnVnKGBGb3VuZCAke1VOSVZFUlNBTF9BUEt9IGF0ICcke3VuaXZlcnNhbEFwa1BhdGh9Jy4gQ2FjaGluZyBpdCB0byAnJHtyZXN1bHRQYXRofSdgKTtcbiAgICAgIGF3YWl0IGZzLm12KHVuaXZlcnNhbEFwa1BhdGgsIHJlc3VsdFBhdGgpO1xuICAgICAgQUFCX0NBQ0hFLnNldChjYWNoZUhhc2gsIHRtcFJvb3QpO1xuICAgICAgcmV0dXJuIHJlc3VsdFBhdGg7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYWFiVXRpbHNNZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFNBQVMsR0FBRyxJQUFJQyxpQkFBSixDQUFRO0VBQ3hCQyxHQUFHLEVBQUUsRUFEbUI7RUFFeEJDLE9BQU8sRUFBRSxDQUFD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
|