gst-atom-xcuitest-driver
Version:
ATOM driver for iOS using XCUITest for backend
188 lines (145 loc) • 20.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.SafariNetworkLog = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _url = _interopRequireDefault(require("url"));
var _appiumSupport = require("appium-support");
var _rotatingLog = require("./rotating-log");
class SafariNetworkLog extends _rotatingLog.RotatingLog {
constructor(showLogs) {
super(showLogs, 'SafariNetwork');
}
getEntry(requestId) {
let outputEntry;
while (this.logs.length >= _rotatingLog.MAX_LOG_ENTRIES_COUNT) {
const entry = this.logs.shift();
if (entry && entry.requestId === requestId) {
outputEntry = entry;
this.logs.push(outputEntry);
continue;
}
if (this.logIdxSinceLastRequest > 0) {
this.logIdxSinceLastRequest--;
}
}
if (!outputEntry) {
for (let i = this.logs.length - 1; i >= 0; i--) {
if (this.logs[i].requestId === requestId) {
outputEntry = this.logs[i];
this.logs.splice(i, 1);
break;
}
}
if (!outputEntry) {
outputEntry = {
requestId,
logs: []
};
}
this.logs.push(outputEntry);
}
return outputEntry;
}
addLogLine(method, out) {
if (!this.isCapturing && !this.showLogs) {
return;
}
if (['Network.dataReceived'].includes(method)) {
return;
}
const outputEntry = this.getEntry(out.requestId);
if (this.isCapturing) {
outputEntry.logs = outputEntry.logs || [];
outputEntry.logs.push(out);
}
if (!this.showLogs) {
return;
}
if (method === 'Network.loadingFinished' || method === 'Network.loadingFailed') {
this.printLogLine(outputEntry);
}
}
getLogDetails(outputEntry) {
const record = outputEntry.logs.reduce(function getRecord(record, entry) {
record.requestId = entry.requestId;
if (entry.response) {
const url = _url.default.parse(entry.response.url);
record.name = `${_lodash.default.last(url.pathname.split('/'))}${url.search ? `?${url.search}` : ''}` || url.host;
record.status = entry.response.status;
if (entry.response.timing) {
record.time = entry.response.timing.receiveHeadersEnd || entry.response.timing.responseStart || 0;
}
record.source = entry.response.source;
}
if (entry.type) {
record.type = entry.type;
}
if (entry.initiator) {
record.initiator = entry.initiator;
}
if (entry.metrics) {
record.size = entry.metrics.responseBodyBytesReceived || 0;
}
if (entry.errorText) {
record.errorText = entry.errorText;
record.cancelled = entry.canceled;
}
return record;
}, {});
return record;
}
printLogLine(outputEntry) {
const {
requestId,
name,
status,
type,
initiator = {},
size = 0,
time = 0,
source,
errorText,
cancelled = false
} = this.getLogDetails(outputEntry);
this.log.debug(`Network event:`);
this.log.debug(` Id: ${requestId}`);
this.log.debug(` Name: ${name}`);
this.log.debug(` Status: ${status}`);
this.log.debug(` Type: ${type}`);
this.log.debug(` Initiator: ${initiator.type}`);
for (const line of initiator.stackTrace || []) {
const functionName = line.functionName || '(anonymous)';
const url = !line.url || line.url === '[native code]' ? '' : `@${_lodash.default.last((_url.default.parse(line.url).pathname || '').split('/'))}:${line.lineNumber}`;
this.log.debug(` ${_lodash.default.padEnd(_lodash.default.truncate(functionName, {
length: 20
}), 21)} ${url}`);
}
const sizeStr = source.includes('cache') ? ` (from ${source.replace('-', ' ')})` : `${size}B`;
this.log.debug(` Size: ${sizeStr}`);
this.log.debug(` Time: ${Math.round(time)}ms`);
if (errorText) {
this.log.debug(` Error: ${errorText}`);
}
if (_appiumSupport.util.hasValue(cancelled)) {
this.log.debug(` Cancelled: ${cancelled}`);
}
}
async getLogs() {
const logs = await super.getLogs();
return logs.map(function adjustEntry(entry) {
return Object.assign({}, entry, {
level: 'INFO',
timestamp: Date.now(),
message: JSON.stringify(entry)
});
});
}
}
exports.SafariNetworkLog = SafariNetworkLog;
var _default = SafariNetworkLog;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL3NhZmFyaS1uZXR3b3JrLWxvZy5qcyJdLCJuYW1lcyI6WyJTYWZhcmlOZXR3b3JrTG9nIiwiUm90YXRpbmdMb2ciLCJjb25zdHJ1Y3RvciIsInNob3dMb2dzIiwiZ2V0RW50cnkiLCJyZXF1ZXN0SWQiLCJvdXRwdXRFbnRyeSIsImxvZ3MiLCJsZW5ndGgiLCJNQVhfTE9HX0VOVFJJRVNfQ09VTlQiLCJlbnRyeSIsInNoaWZ0IiwicHVzaCIsImxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QiLCJpIiwic3BsaWNlIiwiYWRkTG9nTGluZSIsIm1ldGhvZCIsIm91dCIsImlzQ2FwdHVyaW5nIiwiaW5jbHVkZXMiLCJwcmludExvZ0xpbmUiLCJnZXRMb2dEZXRhaWxzIiwicmVjb3JkIiwicmVkdWNlIiwiZ2V0UmVjb3JkIiwicmVzcG9uc2UiLCJ1cmwiLCJVUkwiLCJwYXJzZSIsIm5hbWUiLCJfIiwibGFzdCIsInBhdGhuYW1lIiwic3BsaXQiLCJzZWFyY2giLCJob3N0Iiwic3RhdHVzIiwidGltaW5nIiwidGltZSIsInJlY2VpdmVIZWFkZXJzRW5kIiwicmVzcG9uc2VTdGFydCIsInNvdXJjZSIsInR5cGUiLCJpbml0aWF0b3IiLCJtZXRyaWNzIiwic2l6ZSIsInJlc3BvbnNlQm9keUJ5dGVzUmVjZWl2ZWQiLCJlcnJvclRleHQiLCJjYW5jZWxsZWQiLCJjYW5jZWxlZCIsImxvZyIsImRlYnVnIiwibGluZSIsInN0YWNrVHJhY2UiLCJmdW5jdGlvbk5hbWUiLCJsaW5lTnVtYmVyIiwicGFkRW5kIiwidHJ1bmNhdGUiLCJzaXplU3RyIiwicmVwbGFjZSIsIk1hdGgiLCJyb3VuZCIsInV0aWwiLCJoYXNWYWx1ZSIsImdldExvZ3MiLCJtYXAiLCJhZGp1c3RFbnRyeSIsIk9iamVjdCIsImFzc2lnbiIsImxldmVsIiwidGltZXN0YW1wIiwiRGF0ZSIsIm5vdyIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7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O0FBQ2YsVUFBTTFELElBQUksR0FBRyxNQUFNLE1BQU0wRCxPQUFOLEVBQW5CO0FBSUEsV0FBTzFELElBQUksQ0FBQzJELEdBQUwsQ0FBUyxTQUFTQyxXQUFULENBQXNCekQsS0FBdEIsRUFBNkI7QUFDM0MsYUFBTzBELE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0IzRCxLQUFsQixFQUF5QjtBQUM5QjRELFFBQUFBLEtBQUssRUFBRSxNQUR1QjtBQUU5QkMsUUFBQUEsU0FBUyxFQUFFQyxJQUFJLENBQUNDLEdBQUwsRUFGbUI7QUFHOUJDLFFBQUFBLE9BQU8sRUFBRUMsSUFBSSxDQUFDQyxTQUFMLENBQWVsRSxLQUFmO0FBSHFCLE9BQXpCLENBQVA7QUFLRCxLQU5NLENBQVA7QUFPRDs7QUF0THdDOzs7ZUEwTDVCVixnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgVVJMIGZyb20gJ3VybCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgUm90YXRpbmdMb2csIE1BWF9MT0dfRU5UUklFU19DT1VOVCB9IGZyb20gJy4vcm90YXRpbmctbG9nJztcblxuXG5jbGFzcyBTYWZhcmlOZXR3b3JrTG9nIGV4dGVuZHMgUm90YXRpbmdMb2cge1xuICBjb25zdHJ1Y3RvciAoc2hvd0xvZ3MpIHtcbiAgICBzdXBlcihzaG93TG9ncywgJ1NhZmFyaU5ldHdvcmsnKTtcbiAgfVxuXG4gIGdldEVudHJ5IChyZXF1ZXN0SWQpIHtcbiAgICBsZXQgb3V0cHV0RW50cnk7XG4gICAgd2hpbGUgKHRoaXMubG9ncy5sZW5ndGggPj0gTUFYX0xPR19FTlRSSUVTX0NPVU5UKSB7XG4gICAgICAvLyBwdWxsIHRoZSBmaXJzdCBlbnRyeSwgd2hpY2ggaXMgdGhlIG9sZGVzdFxuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxvZ3Muc2hpZnQoKTtcbiAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5yZXF1ZXN0SWQgPT09IHJlcXVlc3RJZCkge1xuICAgICAgICAvLyB3ZSBhcmUgYWRkaW5nIHRvIGFuIGV4aXN0aW5nIGVudHJ5LCBhbmQgaXQgd2FzIGFsbW9zdCByZW1vdmVkXG4gICAgICAgIC8vIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCB0cnkgYWdhaW5cbiAgICAgICAgb3V0cHV0RW50cnkgPSBlbnRyeTtcbiAgICAgICAgdGhpcy5sb2dzLnB1c2gob3V0cHV0RW50cnkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHdlJ3ZlIHJlbW92ZWQgYW4gZWxlbWVudCwgc28gdGhlIGNvdW50IGlzIGRvd24gb25lXG4gICAgICBpZiAodGhpcy5sb2dJZHhTaW5jZUxhc3RSZXF1ZXN0ID4gMCkge1xuICAgICAgICB0aGlzLmxvZ0lkeFNpbmNlTGFzdFJlcXVlc3QtLTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIGlmICghb3V0cHV0RW50cnkpIHtcbiAgICAgIC8vIHdlIGRvIG5vdCB5ZXMgaGF2ZSBhbiBlbnRyeSB0byBhc3NvY2lhdGUgdGhpcyBiaXQgb2Ygb3V0cHV0IHdpdGhcbiAgICAgIC8vIG1vc3QgbGlrZWx5IHRoZSBlbnRyeSB3aWxsIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHNvIHN0YXJ0IHRoZXJlXG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5sb2dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICh0aGlzLmxvZ3NbaV0ucmVxdWVzdElkID09PSByZXF1ZXN0SWQpIHtcbiAgICAgICAgICAvLyBmb3VuZCBpdCFcbiAgICAgICAgICBvdXRwdXRFbnRyeSA9IHRoaXMubG9nc1tpXTtcbiAgICAgICAgICAvLyB0aGlzIGlzIG5vdyB0aGUgbW9zdCBjdXJyZW50IGVudHJ5LCBzbyByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdFxuICAgICAgICAgIC8vIHRvIGJlIGFkZGVkIHRvIHRoZSBlbmQgYmVsb3dcbiAgICAgICAgICB0aGlzLmxvZ3Muc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG5vdGhpbmcgaGFzIGJlZW4gZm91bmQsIHNvIGNyZWF0ZSBhIG5ldyBlbnRyeVxuICAgICAgaWYgKCFvdXRwdXRFbnRyeSkge1xuICAgICAgICBvdXRwdXRFbnRyeSA9IHtcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgbG9nczogW10sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbmFsbHksIGFkZCB0aGUgZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdFxuICAgICAgdGhpcy5sb2dzLnB1c2gob3V0cHV0RW50cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXRFbnRyeTtcbiAgfVxuXG4gIGFkZExvZ0xpbmUgKG1ldGhvZCwgb3V0KSB7XG4gICAgaWYgKCF0aGlzLmlzQ2FwdHVyaW5nICYmICF0aGlzLnNob3dMb2dzKSB7XG4gICAgICAvLyBuZWl0aGVyIGNhcHR1cmluZyBub3IgZGlzcGxheWluZywgc28gZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ05ldHdvcmsuZGF0YVJlY2VpdmVkJ10uaW5jbHVkZXMobWV0aG9kKSkge1xuICAgICAgLy8gc3RhdHVzIHVwZGF0ZSwgbm8gbmVlZCB0byBoYW5kbGVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBldmVudHMgd2UgY2FyZSBhYm91dDpcbiAgICAvLyAgIE5ldHdvcmsucmVxdWVzdFdpbGxCZVNlbnRcbiAgICAvLyAgIE5ldHdvcmsucmVzcG9uc2VSZWNlaXZlZFxuICAgIC8vICAgTmV0d29yay5sb2FkaW5nRmluaXNoZWRcbiAgICAvLyAgIE5ldHdvcmsubG9hZGluZ0ZhaWxlZFxuXG4gICAgY29uc3Qgb3V0cHV0RW50cnkgPSB0aGlzLmdldEVudHJ5KG91dC5yZXF1ZXN0SWQpO1xuICAgIGlmICh0aGlzLmlzQ2FwdHVyaW5nKSB7XG4gICAgICAvLyBub3cgYWRkIHRoZSBvdXRwdXQgd2UganVzdCByZWNlaXZlZCB0byB0aGUgbG9ncyBmb3IgdGhpcyBwYXJ0aWN1bGFyIGVudHJ5XG4gICAgICBvdXRwdXRFbnRyeS5sb2dzID0gb3V0cHV0RW50cnkubG9ncyB8fCBbXTtcblxuICAgICAgb3V0cHV0RW50cnkubG9ncy5wdXNoKG91dCk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIG5vdCBkaXNwbGF5aW5nIHRoZSBsb2dzLFxuICAgIC8vIG9yIHdlIGFyZSBub3QgZmluaXNoZWQgZ2V0dGluZyBldmVudHMgZm9yIHRoaXMgbmV0d29yayBjYWxsLFxuICAgIC8vIHdlIGFyZSBkb25lXG4gICAgaWYgKCF0aGlzLnNob3dMb2dzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJyB8fCBtZXRob2QgPT09ICdOZXR3b3JrLmxvYWRpbmdGYWlsZWQnKSB7XG4gICAgICB0aGlzLnByaW50TG9nTGluZShvdXRwdXRFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0TG9nRGV0YWlscyAob3V0cHV0RW50cnkpIHtcbiAgICAvLyBleHRyYWN0IHRoZSBkYXRhXG4gICAgY29uc3QgcmVjb3JkID0gb3V0cHV0RW50cnkubG9ncy5yZWR1Y2UoZnVuY3Rpb24gZ2V0UmVjb3JkIChyZWNvcmQsIGVudHJ5KSB7XG4gICAgICByZWNvcmQucmVxdWVzdElkID0gZW50cnkucmVxdWVzdElkO1xuICAgICAgaWYgKGVudHJ5LnJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5wYXJzZShlbnRyeS5yZXNwb25zZS51cmwpO1xuICAgICAgICAvLyBnZXQgdGhlIGxhc3QgcGFydCBvZiB0aGUgdXJsLCBhbG9uZyB3aXRoIHRoZSBxdWVyeSBzdHJpbmcsIGlmIHBvc3NpYmxlXG4gICAgICAgIHJlY29yZC5uYW1lID0gYCR7Xy5sYXN0KHVybC5wYXRobmFtZS5zcGxpdCgnLycpKX0ke3VybC5zZWFyY2ggPyBgPyR7dXJsLnNlYXJjaH1gIDogJyd9YCB8fCB1cmwuaG9zdDtcbiAgICAgICAgcmVjb3JkLnN0YXR1cyA9IGVudHJ5LnJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgaWYgKGVudHJ5LnJlc3BvbnNlLnRpbWluZykge1xuICAgICAgICAgIHJlY29yZC50aW1lID0gZW50cnkucmVzcG9uc2UudGltaW5nLnJlY2VpdmVIZWFkZXJzRW5kXG4gICAgICAgICAgICB8fCBlbnRyeS5yZXNwb25zZS50aW1pbmcucmVzcG9uc2VTdGFydFxuICAgICAgICAgICAgfHwgMDtcbiAgICAgICAgfVxuICAgICAgICByZWNvcmQuc291cmNlID0gZW50cnkucmVzcG9uc2Uuc291cmNlO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LnR5cGUpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBlbnRyeS50eXBlO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmluaXRpYXRvcikge1xuICAgICAgICByZWNvcmQuaW5pdGlhdG9yID0gZW50cnkuaW5pdGlhdG9yO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5Lm1ldHJpY3MpIHtcbiAgICAgICAgLy8gU2FmYXJpIGhhcyBhIGBtZXRyaWNzYCBvYmplY3Qgb24gaXQncyBgTmV0d29yay5sb2FkaW5nRmluaXNoZWRgIGV2ZW50XG4gICAgICAgIHJlY29yZC5zaXplID0gZW50cnkubWV0cmljcy5yZXNwb25zZUJvZHlCeXRlc1JlY2VpdmVkIHx8IDA7XG4gICAgICB9XG4gICAgICBpZiAoZW50cnkuZXJyb3JUZXh0KSB7XG4gICAgICAgIHJlY29yZC5lcnJvclRleHQgPSBlbnRyeS5lcnJvclRleHQ7XG4gICAgICAgIC8vIFdoZW4gYSBuZXR3b3JrIGNhbGwgaXMgY2FuY2VsbGVkLCBTYWZhcmkgcmV0dXJucyBgY2FuY2VsbGVkYCBhcyBlcnJvciB0ZXh0XG4gICAgICAgIC8vIGJ1dCBoYXMgYSBib29sZWFuIGBjYW5jZWxlZGAuIE5vcm1hbGl6ZSB0aGUgdHdvIHNwZWxsaW5ncyBpbiBmYXZvciBvZlxuICAgICAgICAvLyB0aGUgdGV4dCwgd2hpY2ggd2lsbCBhbHNvIGJlIGRpc3BsYXllZFxuICAgICAgICByZWNvcmQuY2FuY2VsbGVkID0gZW50cnkuY2FuY2VsZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBwcmludExvZ0xpbmUgKG91dHB1dEVudHJ5KSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVxdWVzdElkLFxuICAgICAgbmFtZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHR5cGUsXG4gICAgICBpbml0aWF0b3IgPSB7fSxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgdGltZSA9IDAsXG4gICAgICBzb3VyY2UsXG4gICAgICBlcnJvclRleHQsXG4gICAgICBjYW5jZWxsZWQgPSBmYWxzZSxcbiAgICB9ID0gdGhpcy5nZXRMb2dEZXRhaWxzKG91dHB1dEVudHJ5KTtcblxuICAgIC8vIHByaW50IG91dCB0aGUgcmVjb3JkLCBmb3JtYXR0ZWQgYXBwcm9wcmlhdGVseVxuICAgIHRoaXMubG9nLmRlYnVnKGBOZXR3b3JrIGV2ZW50OmApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgIElkOiAke3JlcXVlc3RJZH1gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICBOYW1lOiAke25hbWV9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgU3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgICBUeXBlOiAke3R5cGV9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgSW5pdGlhdG9yOiAke2luaXRpYXRvci50eXBlfWApO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiAoaW5pdGlhdG9yLnN0YWNrVHJhY2UgfHwgW10pKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaW5lLmZ1bmN0aW9uTmFtZSB8fCAnKGFub255bW91cyknO1xuXG4gICAgICBjb25zdCB1cmwgPSAoIWxpbmUudXJsIHx8IGxpbmUudXJsID09PSAnW25hdGl2ZSBjb2RlXScpXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgQCR7Xy5sYXN0KChVUkwucGFyc2UobGluZS51cmwpLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpKX06JHtsaW5lLmxpbmVOdW1iZXJ9YDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAgICAgJHtfLnBhZEVuZChfLnRydW5jYXRlKGZ1bmN0aW9uTmFtZSwge2xlbmd0aDogMjB9KSwgMjEpfSAke3VybH1gKTtcbiAgICB9XG4gICAgLy8gZ2V0IGBtZW1vcnktY2FjaGVgIG9yIGBkaXNrLWNhY2hlYCwgZXRjLiwgcmlnaHRcbiAgICBjb25zdCBzaXplU3RyID0gc291cmNlLmluY2x1ZGVzKCdjYWNoZScpID8gYCAoZnJvbSAke3NvdXJjZS5yZXBsYWNlKCctJywgJyAnKX0pYCA6IGAke3NpemV9QmA7XG4gICAgdGhpcy5sb2cuZGVidWcoYCAgU2l6ZTogJHtzaXplU3RyfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGAgIFRpbWU6ICR7TWF0aC5yb3VuZCh0aW1lKX1tc2ApO1xuICAgIGlmIChlcnJvclRleHQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGAgIEVycm9yOiAke2Vycm9yVGV4dH1gKTtcbiAgICB9XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoY2FuY2VsbGVkKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYCAgQ2FuY2VsbGVkOiAke2NhbmNlbGxlZH1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRMb2dzICgpIHtcbiAgICBjb25zdCBsb2dzID0gYXdhaXQgc3VwZXIuZ2V0TG9ncygpO1xuICAgIC8vIGluIG9yZGVyIHRvIHNhdGlzZnkgY2VydGFpbiBjbGllbnRzLCB3ZSBuZWVkIHRvIGhhdmUgYSBiYXNpYyBzdHJ1Y3R1cmVcbiAgICAvLyB0byB0aGUgcmVzdWx0cywgd2l0aCBgbGV2ZWxgLCBgdGltZXN0YW1wYCwgYW5kIGBtZXNzYWdlYCwgd2hpY2ggaXNcbiAgICAvLyBhbGwgdGhlIGluZm9ybWF0aW9uIHN0cmluZ2lmaWVkXG4gICAgcmV0dXJuIGxvZ3MubWFwKGZ1bmN0aW9uIGFkanVzdEVudHJ5IChlbnRyeSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGVudHJ5LCB7XG4gICAgICAgIGxldmVsOiAnSU5GTycsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgbWVzc2FnZTogSlNPTi5zdHJpbmdpZnkoZW50cnkpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2FmYXJpTmV0d29ya0xvZyB9O1xuZXhwb3J0IGRlZmF1bHQgU2FmYXJpTmV0d29ya0xvZztcbiJdLCJmaWxlIjoibGliL2RldmljZS1sb2cvc2FmYXJpLW5ldHdvcmstbG9nLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=