@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
129 lines • 17.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk_1 = __importDefault(require("chalk"));
const runtime_1 = require("../errors/runtime");
const types_1 = require("../errors/types");
const argument_parser_1 = __importDefault(require("./argument-parser"));
const termination_handler_1 = __importDefault(require("./termination-handler"));
const log_1 = __importDefault(require("./log"));
const remotes_wizard_1 = __importDefault(require("./remotes-wizard"));
const correct_browsers_and_sources_1 = __importDefault(require("./correct-browsers-and-sources"));
const __1 = __importDefault(require("../"));
// NOTE: Load the provider pool lazily to reduce startup time
const lazyRequire = require('import-lazy')(require);
const browserProviderPool = lazyRequire('../browser/provider/pool');
let showMessageOnExit = true;
let exitMessageShown = false;
let exiting = false;
function exitHandler(terminationLevel) {
if (showMessageOnExit && !exitMessageShown) {
exitMessageShown = true;
log_1.default.write('Stopping TestCafe...');
process.on('exit', () => log_1.default.hideSpinner(true));
}
if (exiting || terminationLevel < 2)
return;
exiting = true;
exit(0);
}
function exit(code) {
log_1.default.hideSpinner(true);
// NOTE: give a process time to flush the output.
// It's necessary in some environments.
setTimeout(() => process.exit(code), 0);
}
function error(err) {
log_1.default.hideSpinner();
let message = null;
if (err instanceof runtime_1.GeneralError)
message = err.message;
else if (err instanceof runtime_1.APIError)
message = err.coloredStack;
else
message = err.stack;
log_1.default.write(chalk_1.default.red('ERROR ') + message + '\n');
log_1.default.write(chalk_1.default.gray('Type "testcafe -h" for help.'));
exit(1);
}
async function runTests(argParser) {
const opts = argParser.opts;
const port1 = opts.ports && opts.ports[0];
const port2 = opts.ports && opts.ports[1];
const proxy = opts.proxy;
const proxyBypass = opts.proxyBypass;
const { hostname, ssl, dev, experimentalCompilerService } = opts;
const testCafe = await __1.default({
developmentMode: dev,
hostname,
port1,
port2,
ssl,
experimentalCompilerService
});
const correctedBrowsersAndSources = await correct_browsers_and_sources_1.default(argParser, testCafe.configuration);
const automatedBrowsers = correctedBrowsersAndSources.browsers;
const remoteBrowsers = await remotes_wizard_1.default(testCafe, argParser.remoteCount, opts.qrCode);
const browsers = automatedBrowsers.concat(remoteBrowsers);
const sources = correctedBrowsersAndSources.sources;
const runner = opts.live ? testCafe.createLiveModeRunner() : testCafe.createRunner();
let failed = 0;
runner.isCli = true;
runner
.useProxy(proxy, proxyBypass)
.src(sources)
.tsConfigPath(argParser.opts.tsConfigPath)
.browsers(browsers)
.reporter(argParser.opts.reporter)
.concurrency(argParser.opts.concurrency)
.filter(argParser.opts.filter)
.video(opts.video, opts.videoOptions, opts.videoEncodingOptions)
.screenshots(opts.screenshots)
.startApp(opts.app, opts.appInitDelay)
.clientScripts(argParser.opts.clientScripts)
.enableTestScheduling(argParser.opts.testScheduling);
try {
const runOpts = argParser.getRunOptions();
failed = await runner.run(runOpts);
}
finally {
showMessageOnExit = false;
await testCafe.close();
}
exit(failed);
}
async function listBrowsers(providerName) {
const provider = await browserProviderPool.getProvider(providerName);
if (!provider)
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.browserProviderNotFound, providerName);
if (provider.isMultiBrowser) {
const browserNames = await provider.getBrowserList();
await browserProviderPool.dispose();
if (providerName === 'locally-installed')
console.log(browserNames.join('\n'));
else
console.log(browserNames.map(browserName => `"${providerName}:${browserName}"`).join('\n'));
}
else
console.log(`"${providerName}"`);
exit(0);
}
(async function cli() {
const terminationHandler = new termination_handler_1.default();
terminationHandler.on(termination_handler_1.default.TERMINATION_LEVEL_INCREASED_EVENT, exitHandler);
try {
const argParser = new argument_parser_1.default();
await argParser.parse(process.argv);
if (argParser.opts.listBrowsers)
await listBrowsers(argParser.opts.providerName);
else
await runTests(argParser);
}
catch (err) {
showMessageOnExit = false;
error(err);
}
})();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9jbGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQTJEO0FBQzNELDJDQUFpRDtBQUNqRCx3RUFBa0Q7QUFDbEQsZ0ZBQXVEO0FBQ3ZELGdEQUF3QjtBQUN4QixzRUFBNkM7QUFDN0Msa0dBQXVFO0FBQ3ZFLDRDQUFpQztBQUVqQyw2REFBNkQ7QUFDN0QsTUFBTSxXQUFXLEdBQVcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFcEUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDN0IsSUFBSSxnQkFBZ0IsR0FBSSxLQUFLLENBQUM7QUFDOUIsSUFBSSxPQUFPLEdBQWEsS0FBSyxDQUFDO0FBRTlCLFNBQVMsV0FBVyxDQUFFLGdCQUFnQjtJQUNsQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGFBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRyxDQUFDO1FBQy9CLE9BQU87SUFFWCxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFFLElBQUk7SUFDZixhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRCLGlEQUFpRDtJQUNqRCx1Q0FBdUM7SUFDdkMsVUFBVSxDQUFD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QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25HOztRQUVHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRCxDQUFDLEtBQUssVUFBVSxHQUFHO0lBQ2YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLDZCQUFrQixFQUFFLENBQUM7SUFFcEQsa0JBQWtCLENBQUMsRUFBRSxDQUFDLDZCQUFrQixDQUFDLGlDQUFpQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXpGLElBQUk7UUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLHlCQUFpQixFQUFFLENBQUM7UUFFMUMsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUMzQixNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOztZQUVoRCxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNqQztJQUNELE9BQU8sR0FBRyxFQUFFO1FBQ1IsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNkO0FBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IsIEFQSUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IENsaUFyZ3VtZW50UGFyc2VyIGZyb20gJy4vYXJndW1lbnQtcGFyc2VyJztcbmltcG9ydCBUZXJtaW5hdGlvbkhhbmRsZXIgZnJvbSAnLi90ZXJtaW5hdGlvbi1oYW5kbGVyJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHJlbW90ZXNXaXphcmQgZnJvbSAnLi9yZW1vdGVzLXdpemFyZCc7XG5pbXBvcnQgY29ycmVjdEJyb3dzZXJzQW5kU291cmNlcyBmcm9tICcuL2NvcnJlY3QtYnJvd3NlcnMtYW5kLXNvdXJjZXMnO1xuaW1wb3J0IGNyZWF0ZVRlc3RDYWZlIGZyb20gJy4uLyc7XG5cbi8vIE5PVEU6IExvYWQgdGhlIHByb3ZpZGVyIHBvb2wgbGF6aWx5IHRvIHJlZHVjZSBzdGFydHVwIHRpbWVcbmNvbnN0IGxhenlSZXF1aXJlICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3QgYnJvd3NlclByb3ZpZGVyUG9vbCA9IGxhenlSZXF1aXJlKCcuLi9icm93c2VyL3Byb3ZpZGVyL3Bvb2wnKTtcblxubGV0IHNob3dNZXNzYWdlT25FeGl0ID0gdHJ1ZTtcbmxldCBleGl0TWVzc2FnZVNob3duICA9IGZhbHNlO1xubGV0IGV4aXRpbmcgICAgICAgICAgID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGV4aXRIYW5kbGVyICh0ZXJtaW5hdGlvbkxldmVsKSB7XG4gICAgaWYgKHNob3dNZXNzYWdlT25FeGl0ICYmICFleGl0TWVzc2FnZVNob3duKSB7XG4gICAgICAgIGV4aXRNZXNzYWdlU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGxvZy53cml0ZSgnU3RvcHBpbmcgVGVzdENhZmUuLi4nKTtcblxuICAgICAgICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4gbG9nLmhpZGVTcGlubmVyKHRydWUpKTtcbiAgICB9XG5cbiAgICBpZiAoZXhpdGluZyB8fCB0ZXJtaW5hdGlvbkxldmVsIDwgMilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgZXhpdGluZyA9IHRydWU7XG5cbiAgICBleGl0KDApO1xufVxuXG5mdW5jdGlvbiBleGl0IChjb2RlKSB7XG4gICAgbG9nLmhpZGVTcGlubmVyKHRydWUpO1xuXG4gICAgLy8gTk9URTogZ2l2ZSBhIHByb2Nlc3MgdGltZSB0byBmbHVzaCB0aGUgb3V0cHV0LlxuICAgIC8vIEl0J3MgbmVjZXNzYXJ5IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KGNvZGUpLCAwKTtcbn1cblxuZnVuY3Rpb24gZXJyb3IgKGVycikge1xuICAgIGxvZy5oaWRlU3Bpbm5lcigpO1xuXG4gICAgbGV0IG1lc3NhZ2UgPSBudWxsO1xuXG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEdlbmVyYWxFcnJvcilcbiAgICAgICAgbWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuXG4gICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgQVBJRXJyb3IpXG4gICAgICAgIG1lc3NhZ2UgPSBlcnIuY29sb3JlZFN0YWNrO1xuXG4gICAgZWxzZVxuICAgICAgICBtZXNzYWdlID0gZXJyLnN0YWNrO1xuXG4gICAgbG9nLndyaXRlKGNoYWxrLnJlZCgnRVJST1IgJykgKyBtZXNzYWdlICsgJ1xcbicpO1xuICAgIGxvZy53cml0ZShjaGFsay5ncmF5KCdUeXBlIFwidGVzdGNhZmUgLWhcIiBmb3IgaGVscC4nKSk7XG5cbiAgICBleGl0KDEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5UZXN0cyAoYXJnUGFyc2VyKSB7XG4gICAgY29uc3Qgb3B0cyAgICAgICAgICAgICAgPSBhcmdQYXJzZXIub3B0cztcbiAgICBjb25zdCBwb3J0MSAgICAgICAgICAgICA9IG9wdHMucG9ydHMgJiYgb3B0cy5wb3J0c1swXTtcbiAgICBjb25zdCBwb3J0MiAgICAgICAgICAgICA9IG9wdHMucG9ydHMgJiYgb3B0cy5wb3J0c1sxXTtcbiAgICBjb25zdCBwcm94eSAgICAgICAgICAgICA9IG9wdHMucHJveHk7XG4gICAgY29uc3QgcHJveHlCeXBhc3MgICAgICAgPSBvcHRzLnByb3h5QnlwYXNzO1xuXG4gICAgY29uc3QgeyBob3N0bmFtZSwgc3NsLCBkZXYsIGV4cGVyaW1lbnRhbENvbXBpbGVyU2VydmljZSB9ID0gb3B0cztcblxuICAgIGNvbnN0IHRlc3RDYWZlID0gYXdhaXQgY3JlYXRlVGVzdENhZmUoe1xuICAgICAgICBkZXZlbG9wbWVudE1vZGU6IGRldixcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHBvcnQxLFxuICAgICAgICBwb3J0MixcbiAgICAgICAgc3NsLFxuICAgICAgICBleHBlcmltZW50YWxDb21waWxlclNlcnZpY2VcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZEJyb3dzZXJzQW5kU291cmNlcyA9IGF3YWl0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMoYXJnUGFyc2VyLCB0ZXN0Q2FmZS5jb25maWd1cmF0aW9uKTtcbiAgICBjb25zdCBhdXRvbWF0ZWRCcm93c2VycyAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuYnJvd3NlcnM7XG4gICAgY29uc3QgcmVtb3RlQnJvd3NlcnMgICAgICAgICAgICAgID0gYXdhaXQgcmVtb3Rlc1dpemFyZCh0ZXN0Q2FmZSwgYXJnUGFyc2VyLnJlbW90ZUNvdW50LCBvcHRzLnFyQ29kZSk7XG4gICAgY29uc3QgYnJvd3NlcnMgICAgICAgICAgICAgICAgICAgID0gYXV0b21hdGVkQnJvd3NlcnMuY29uY2F0KHJlbW90ZUJyb3dzZXJzKTtcbiAgICBjb25zdCBzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuc291cmNlcztcblxuICAgIGNvbnN0IHJ1bm5lciA9IG9wdHMubGl2ZSA/IHRlc3RDYWZlLmNyZWF0ZUxpdmVNb2RlUnVubmVyKCkgOiB0ZXN0Q2FmZS5jcmVhdGVSdW5uZXIoKTtcblxuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgcnVubmVyLmlzQ2xpID0gdHJ1ZTtcblxuICAgIHJ1bm5lclxuICAgICAgICAudXNlUHJveHkocHJveHksIHByb3h5QnlwYXNzKVxuICAgICAgICAuc3JjKHNvdXJjZXMpXG4gICAgICAgIC50c0NvbmZpZ1BhdGgoYXJnUGFyc2VyLm9wdHMudHNDb25maWdQYXRoKVxuICAgICAgICAuYnJvd3NlcnMoYnJvd3NlcnMpXG4gICAgICAgIC5yZXBvcnRlcihhcmdQYXJzZXIub3B0cy5yZXBvcnRlcilcbiAgICAgICAgLmNvbmN1cnJlbmN5KGFyZ1BhcnNlci5vcHRzLmNvbmN1cnJlbmN5KVxuICAgICAgICAuZmlsdGVyKGFyZ1BhcnNlci5vcHRzLmZpbHRlcilcbiAgICAgICAgLnZpZGVvKG9wdHMudmlkZW8sIG9wdHMudmlkZW9PcHRpb25zLCBvcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zKVxuICAgICAgICAuc2NyZWVuc2hvdHMob3B0cy5zY3JlZW5zaG90cylcbiAgICAgICAgLnN0YXJ0QXBwKG9wdHMuYXBwLCBvcHRzLmFwcEluaXREZWxheSlcbiAgICAgICAgLmNsaWVudFNjcmlwdHMoYXJnUGFyc2VyLm9wdHMuY2xpZW50U2NyaXB0cylcbiAgICAgICAgLmVuYWJsZVRlc3RTY2hlZHVsaW5nKGFyZ1BhcnNlci5vcHRzLnRlc3RTY2hlZHVsaW5nKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJ1bk9wdHMgPSBhcmdQYXJzZXIuZ2V0UnVuT3B0aW9ucygpO1xuXG4gICAgICAgIGZhaWxlZCA9IGF3YWl0IHJ1bm5lci5ydW4ocnVuT3B0cyk7XG4gICAgfVxuXG4gICAgZmluYWxseSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRlc3RDYWZlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZXhpdChmYWlsZWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJvd3NlcnMgKHByb3ZpZGVyTmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5nZXRQcm92aWRlcihwcm92aWRlck5hbWUpO1xuXG4gICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5icm93c2VyUHJvdmlkZXJOb3RGb3VuZCwgcHJvdmlkZXJOYW1lKTtcblxuICAgIGlmIChwcm92aWRlci5pc011bHRpQnJvd3Nlcikge1xuICAgICAgICBjb25zdCBicm93c2VyTmFtZXMgPSBhd2FpdCBwcm92aWRlci5nZXRCcm93c2VyTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmIChwcm92aWRlck5hbWUgPT09ICdsb2NhbGx5LWluc3RhbGxlZCcpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMuam9pbignXFxuJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMubWFwKGJyb3dzZXJOYW1lID0+IGBcIiR7cHJvdmlkZXJOYW1lfToke2Jyb3dzZXJOYW1lfVwiYCkuam9pbignXFxuJykpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKGBcIiR7cHJvdmlkZXJOYW1lfVwiYCk7XG5cbiAgICBleGl0KDApO1xufVxuXG4oYXN5bmMgZnVuY3Rpb24gY2xpICgpIHtcbiAgICBjb25zdCB0ZXJtaW5hdGlvbkhhbmRsZXIgPSBuZXcgVGVybWluYXRpb25IYW5kbGVyKCk7XG5cbiAgICB0ZXJtaW5hdGlvbkhhbmRsZXIub24oVGVybWluYXRpb25IYW5kbGVyLlRFUk1JTkFUSU9OX0xFVkVMX0lOQ1JFQVNFRF9FVkVOVCwgZXhpdEhhbmRsZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJnUGFyc2VyID0gbmV3IENsaUFyZ3VtZW50UGFyc2VyKCk7XG5cbiAgICAgICAgYXdhaXQgYXJnUGFyc2VyLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbiAgICAgICAgaWYgKGFyZ1BhcnNlci5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIGF3YWl0IGxpc3RCcm93c2VycyhhcmdQYXJzZXIub3B0cy5wcm92aWRlck5hbWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBydW5UZXN0cyhhcmdQYXJzZXIpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGVycm9yKGVycik7XG4gICAgfVxufSkoKTtcblxuIl19