@testplane/wdio-config
Version:
A helper utility to parse and validate WebdriverIO options
126 lines (124 loc) • 15.2 kB
JavaScript
// src/constants.ts
var DEFAULT_TIMEOUT = 1e4;
var DEFAULT_CONFIGS = () => ({
specs: [],
suites: {},
exclude: [],
outputDir: void 0,
logLevel: "info",
logLevels: {},
groupLogsByTestSpec: false,
excludeDriverLogs: [],
bail: 0,
waitforInterval: 500,
waitforTimeout: 5e3,
framework: "mocha",
reporters: [],
services: [],
maxInstances: 100,
maxInstancesPerCapability: 100,
injectGlobals: true,
filesToWatch: [],
connectionRetryTimeout: 12e4,
connectionRetryCount: 3,
execArgv: [],
runnerEnv: {},
runner: "local",
shard: {
current: 1,
total: 1
},
specFileRetries: 0,
specFileRetriesDelay: 0,
specFileRetriesDeferred: false,
reporterSyncInterval: 100,
reporterSyncTimeout: 5e3,
cucumberFeaturesWithLineNumbers: [],
/**
* framework defaults
*/
mochaOpts: {
timeout: DEFAULT_TIMEOUT
},
jasmineOpts: {
defaultTimeoutInterval: DEFAULT_TIMEOUT
},
cucumberOpts: {
timeout: DEFAULT_TIMEOUT
},
/**
* hooks
*/
onPrepare: [],
onWorkerStart: [],
onWorkerEnd: [],
before: [],
beforeSession: [],
beforeSuite: [],
beforeHook: [],
beforeTest: [],
beforeCommand: [],
afterCommand: [],
afterTest: [],
afterHook: [],
afterSuite: [],
afterSession: [],
after: [],
onComplete: [],
onReload: [],
beforeAssertion: [],
afterAssertion: [],
/**
* cucumber specific hooks
*/
beforeFeature: [],
beforeScenario: [],
beforeStep: [],
afterStep: [],
afterScenario: [],
afterFeature: []
});
// src/utils.ts
function isCloudCapability(caps) {
return Boolean(caps && (caps["bstack:options"] || caps["sauce:options"] || caps["tb:options"]));
}
function validateConfig(defaults, options, keysToKeep = []) {
const params = {};
for (const [name, expectedOption] of Object.entries(defaults)) {
if (typeof options[name] === "undefined" && !expectedOption.default && expectedOption.required) {
throw new Error(`Required option "${name.toString()}" is missing`);
}
if (typeof options[name] === "undefined" && expectedOption.default) {
params[name] = expectedOption.default;
}
if (typeof options[name] !== "undefined") {
const optValue = options[name];
if (typeof optValue !== expectedOption.type) {
throw new Error(`Expected option "${name.toString()}" to be type of ${expectedOption.type} but was ${typeof options[name]}`);
}
if (typeof expectedOption.validate === "function") {
try {
expectedOption.validate(optValue);
} catch (e) {
throw new Error(`Type check for option "${name.toString()}" failed: ${e.message}`);
}
}
if (typeof optValue === "string" && expectedOption.match && !optValue.match(expectedOption.match)) {
throw new Error(`Option "${name.toString()}" doesn't match expected values: ${expectedOption.match}`);
}
params[name] = options[name];
}
}
for (const [name, option] of Object.entries(options)) {
if (keysToKeep.includes(name)) {
params[name] = option;
}
}
return params;
}
export {
DEFAULT_CONFIGS,
isCloudCapability,
validateConfig
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbnN0YW50cy50cyIsICIuLi9zcmMvdXRpbHMudHMiXSwKICAic291cmNlUm9vdCI6ICIvVXNlcnMvZHVka2V2aWNoL2pvYi9wcm9qZWN0cy9nZW1pbmktdGVzdGluZy93ZWJkcml2ZXJpby9wYWNrYWdlcy93ZGlvLWNvbmZpZyIsCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IE9wdGlvbnMsIFNlcnZpY2VzIH0gZnJvbSAnQHRlc3RwbGFuZS93ZGlvLXR5cGVzJ1xuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09ORklHUzogKCkgPT4gT3B0aW9ucy5UZXN0cnVubmVyID0gKCkgPT4gKHtcbiAgICBzcGVjczogW10sXG4gICAgc3VpdGVzOiB7fSxcbiAgICBleGNsdWRlOiBbXSxcbiAgICBvdXRwdXREaXI6IHVuZGVmaW5lZCxcbiAgICBsb2dMZXZlbDogJ2luZm8nIGFzIGNvbnN0LFxuICAgIGxvZ0xldmVsczoge30sXG4gICAgZ3JvdXBMb2dzQnlUZXN0U3BlYzogZmFsc2UsXG4gICAgZXhjbHVkZURyaXZlckxvZ3M6IFtdLFxuICAgIGJhaWw6IDAsXG4gICAgd2FpdGZvckludGVydmFsOiA1MDAsXG4gICAgd2FpdGZvclRpbWVvdXQ6IDUwMDAsXG4gICAgZnJhbWV3b3JrOiAnbW9jaGEnIGFzIGNvbnN0LFxuICAgIHJlcG9ydGVyczogW10sXG4gICAgc2VydmljZXM6IFtdLFxuICAgIG1heEluc3RhbmNlczogMTAwLFxuICAgIG1heEluc3RhbmNlc1BlckNhcGFiaWxpdHk6IDEwMCxcbiAgICBpbmplY3RHbG9iYWxzOiB0cnVlLFxuICAgIGZpbGVzVG9XYXRjaDogW10sXG4gICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogMTIwMDAwLFxuICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiAzLFxuICAgIGV4ZWNBcmd2OiBbXSxcbiAgICBydW5uZXJFbnY6IHt9LFxuICAgIHJ1bm5lcjogJ2xvY2FsJyBhcyBjb25zdCxcbiAgICBzaGFyZDoge1xuICAgICAgICBjdXJyZW50OiAxLFxuICAgICAgICB0b3RhbDogMVxuICAgIH0sXG4gICAgc3BlY0ZpbGVSZXRyaWVzOiAwLFxuICAgIHNwZWNGaWxlUmV0cmllc0RlbGF5OiAwLFxuICAgIHNwZWNGaWxlUmV0cmllc0RlZmVycmVkOiBmYWxzZSxcbiAgICByZXBvcnRlclN5bmNJbnRlcnZhbDogMTAwLFxuICAgIHJlcG9ydGVyU3luY1RpbWVvdXQ6IDUwMDAsXG4gICAgY3VjdW1iZXJGZWF0dXJlc1dpdGhMaW5lTnVtYmVyczogW10sXG5cbiAgICAvKipcbiAgICAgKiBmcmFtZXdvcmsgZGVmYXVsdHNcbiAgICAgKi9cbiAgICBtb2NoYU9wdHM6IHtcbiAgICAgICAgdGltZW91dDogREVGQVVMVF9USU1FT1VUXG4gICAgfSxcbiAgICBqYXNtaW5lT3B0czoge1xuICAgICAgICBkZWZhdWx0VGltZW91dEludGVydmFsOiBERUZBVUxUX1RJTUVPVVRcbiAgICB9LFxuICAgIGN1Y3VtYmVyT3B0czoge1xuICAgICAgICB0aW1lb3V0OiBERUZBVUxUX1RJTUVPVVRcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogaG9va3NcbiAgICAgKi9cbiAgICBvblByZXBhcmU6IFtdLFxuICAgIG9uV29ya2VyU3RhcnQ6IFtdLFxuICAgIG9uV29ya2VyRW5kOiBbXSxcbiAgICBiZWZvcmU6IFtdLFxuICAgIGJlZm9yZVNlc3Npb246IFtdLFxuICAgIGJlZm9yZVN1aXRlOiBbXSxcbiAgICBiZWZvcmVIb29rOiBbXSxcbiAgICBiZWZvcmVUZXN0OiBbXSxcbiAgICBiZWZvcmVDb21tYW5kOiBbXSxcbiAgICBhZnRlckNvbW1hbmQ6IFtdLFxuICAgIGFmdGVyVGVzdDogW10sXG4gICAgYWZ0ZXJIb29rOiBbXSxcbiAgICBhZnRlclN1aXRlOiBbXSxcbiAgICBhZnRlclNlc3Npb246IFtdLFxuICAgIGFmdGVyOiBbXSxcbiAgICBvbkNvbXBsZXRlOiBbXSxcbiAgICBvblJlbG9hZDogW10sXG4gICAgYmVmb3JlQXNzZXJ0aW9uOiBbXSxcbiAgICBhZnRlckFzc2VydGlvbjogW10sXG5cbiAgICAvKipcbiAgICAgKiBjdWN1bWJlciBzcGVjaWZpYyBob29rc1xuICAgICAqL1xuICAgIGJlZm9yZUZlYXR1cmU6IFtdLFxuICAgIGJlZm9yZVNjZW5hcmlvOiBbXSxcbiAgICBiZWZvcmVTdGVwOiBbXSxcbiAgICBhZnRlclN0ZXA6IFtdLFxuICAgIGFmdGVyU2NlbmFyaW86IFtdLFxuICAgIGFmdGVyRmVhdHVyZTogW11cbn0pXG5cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfSE9PS1M6IChrZXlvZiBTZXJ2aWNlcy5Ib29rcylbXSA9IFtcbiAgICAnYmVmb3JlJywgJ2JlZm9yZVNlc3Npb24nLCAnYmVmb3JlU3VpdGUnLCAnYmVmb3JlSG9vaycsICdiZWZvcmVUZXN0JywgJ2JlZm9yZUNvbW1hbmQnLFxuICAgICdhZnRlckNvbW1hbmQnLCAnYWZ0ZXJUZXN0JywgJ2FmdGVySG9vaycsICdhZnRlclN1aXRlJywgJ2FmdGVyU2Vzc2lvbicsICdhZnRlcicsXG4gICAgJ2JlZm9yZUFzc2VydGlvbicsICdhZnRlckFzc2VydGlvbicsXG4gICAgLy8gQHRzLWlnbm9yZSBub3QgZGVmaW5lZCBpbiBjb3JlIGhvb2tzIGJ1dCBhZGRlZCB3aXRoIGN1Y3VtYmVyXG4gICAgJ2JlZm9yZUZlYXR1cmUnLCAnYmVmb3JlU2NlbmFyaW8nLCAnYmVmb3JlU3RlcCcsICdhZnRlclN0ZXAnLCAnYWZ0ZXJTY2VuYXJpbycsICdhZnRlckZlYXR1cmUnLFxuICAgICdvblJlbG9hZCcsICdvblByZXBhcmUnLCAnb25Xb3JrZXJTdGFydCcsICdvbldvcmtlckVuZCcsICdvbkNvbXBsZXRlJ1xuXVxuXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0ZJTEVfRVhURU5TSU9OUyA9IFtcbiAgICAnLmpzJywgJy5qc3gnLCAnLm1qcycsICcubXRzJywgJy5lczYnLCAnLnRzJywgJy50c3gnLCAnLmZlYXR1cmUnLCAnLmNvZmZlZScsICcuY2pzJ1xuXVxuXG5leHBvcnQgY29uc3QgTk9fTkFNRURfQ09ORklHX0VYUE9SVCA9IChcbiAgICAnTm8gbmFtZWQgZXhwb3J0IG9iamVjdCBjYWxsZWQgXCJjb25maWdcIiBmb3VuZC4gTWFrZSBzdXJlIHlvdSBleHBvcnQgdGhlIGNvbmZpZyBvYmplY3QgJyArXG4gICAgJ3ZpYSBgZXhwb3J0LmNvbmZpZyA9IHsgLi4uIH1gIHdoZW4gdXNpbmcgQ29tbW9uSlMgb3IgYGV4cG9ydCBjb25zdCBjb25maWcgPSB7IC4uLiB9YCB3aGVuICcgK1xuICAgICd1c2luZyBFU00uIFJlYWQgbW9yZSBvbiB0aGlzIG9uIGh0dHBzOi8vd2ViZHJpdmVyLmlvL2RvY3MvY29uZmlndXJhdGlvbmZpbGUgISdcbilcbiIsICJpbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICdAdGVzdHBsYW5lL3dkaW8tdHlwZXMnXG5cbmV4cG9ydCBjb25zdCB2YWxpZE9iamVjdE9yQXJyYXkgPSAob2JqZWN0OiBvYmplY3QpOiBvYmplY3QgaXMgb2JqZWN0IHwgQXJyYXk8dW5rbm93bj4gPT4gKEFycmF5LmlzQXJyYXkob2JqZWN0KSAmJiBvYmplY3QubGVuZ3RoID4gMCkgfHxcbiAgICAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGggPiAwKVxuXG4vKipcbiAqIHJlbW92ZSBsaW5lIG51bWJlcnMgZnJvbSBmaWxlIHBhdGgsIGV4OlxuICogYC9mb286OWAgb3IgYGM6XFxiYXI6MTQ6NWBcbiAqIEBwYXJhbSAgIHtzdHJpbmd9IGZpbGVQYXRoIHBhdGggdG8gc3BlYyBmaWxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGluZU51bWJlcnMoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoZXIgPSBmaWxlUGF0aC5tYXRjaCgvOlxcZCsoOlxcZCskfCQpLylcbiAgICBpZiAobWF0Y2hlcikge1xuICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygwLCBtYXRjaGVyLmluZGV4KVxuICAgIH1cbiAgICByZXR1cm4gZmlsZVBhdGhcbn1cblxuLyoqXG4gKiBkb2VzIHNwZWMgZmlsZSBwYXRoIGNvbnRhaW4gQ3VjdW1iZXIncyBsaW5lIG51bWJlciwgZXhcbiAqIGAvZm9vL2Jhcjo5YCBvciBgYzpcXGJhclxcZm9vOjE0OjVgXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gc3BlY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDdWN1bWJlckZlYXR1cmVXaXRoTGluZU51bWJlcihzcGVjOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHNwZWNzID0gQXJyYXkuaXNBcnJheShzcGVjKSA/IHNwZWMgOiBbc3BlY11cbiAgICByZXR1cm4gc3BlY3Muc29tZSgocykgPT4gLzpcXGQrKDpcXGQrJHwkKS8udGVzdChzKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xvdWRDYXBhYmlsaXR5KGNhcHM6IFdlYmRyaXZlcklPLkNhcGFiaWxpdGllcykge1xuICAgIHJldHVybiBCb29sZWFuKGNhcHMgJiYgKGNhcHNbJ2JzdGFjazpvcHRpb25zJ10gfHwgY2Fwc1snc2F1Y2U6b3B0aW9ucyddIHx8IGNhcHNbJ3RiOm9wdGlvbnMnXSkpXG59XG5cbi8qKlxuICogdmFsaWRhdGVzIGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIGRlZmF1bHQgdmFsdWVzXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRlZmF1bHRzICBvYmplY3QgZGVzY3JpYmluZyBhbGwgYWxsb3dlZCBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICBvcHRpb24gdG8gY2hlY2sgYWdhaW5zdFxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgdmFsaWRhdGVkIGNvbmZpZyBlbnJpY2hlZCB3aXRoIGRlZmF1bHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbmZpZzxUPihkZWZhdWx0czogT3B0aW9ucy5EZWZpbml0aW9uPFQ+LCBvcHRpb25zOiBULCBrZXlzVG9LZWVwID0gW10gYXMgKGtleW9mIFQpW10pIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fSBhcyBUXG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBleHBlY3RlZE9wdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdHMpIGFzIFtrZXlvZiBPcHRpb25zLkRlZmluaXRpb248VD4sIE5vbk51bGxhYmxlPE9wdGlvbnMuRGVmaW5pdGlvbjxUPltrZXlvZiBPcHRpb25zLkRlZmluaXRpb248VD5dPl1bXSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogY2hlY2sgaWYgb3B0aW9ucyBpcyBnaXZlblxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zW25hbWVdID09PSAndW5kZWZpbmVkJyAmJiAhZXhwZWN0ZWRPcHRpb24uZGVmYXVsdCAmJiBleHBlY3RlZE9wdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBvcHRpb24gXCIke25hbWUudG9TdHJpbmcoKX1cIiBpcyBtaXNzaW5nYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tuYW1lXSA9PT0gJ3VuZGVmaW5lZCcgJiYgZXhwZWN0ZWRPcHRpb24uZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gZXhwZWN0ZWRPcHRpb24uZGVmYXVsdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3Qgb3B0VmFsdWUgPSBvcHRpb25zW25hbWVdXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdFZhbHVlICE9PSBleHBlY3RlZE9wdGlvbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvcHRpb24gXCIke25hbWUudG9TdHJpbmcoKX1cIiB0byBiZSB0eXBlIG9mICR7ZXhwZWN0ZWRPcHRpb24udHlwZX0gYnV0IHdhcyAke3R5cGVvZiBvcHRpb25zW25hbWVdfWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRPcHRpb24udmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE9wdGlvbi52YWxpZGF0ZShvcHRWYWx1ZSlcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSBjaGVjayBmb3Igb3B0aW9uIFwiJHtuYW1lLnRvU3RyaW5nKCl9XCIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdFZhbHVlID09PSAnc3RyaW5nJyAmJiBleHBlY3RlZE9wdGlvbi5tYXRjaCAmJiAhb3B0VmFsdWUubWF0Y2goZXhwZWN0ZWRPcHRpb24ubWF0Y2gpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gXCIke25hbWUudG9TdHJpbmcoKX1cIiBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkIHZhbHVlczogJHtleHBlY3RlZE9wdGlvbi5tYXRjaH1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJhbXNbbmFtZV0gPSBvcHRpb25zW25hbWVdXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBvcHRpb25dIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMgYXMgb2JqZWN0KSBhcyBba2V5b2YgVCwgVFtrZXlvZiBUXV1bXSkge1xuICAgICAgICAvKipcbiAgICAgICAgICoga2VlcCBrZXlzIGZyb20gc291cmNlIG9iamVjdCBpZiBkZXNpcmVkXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoa2V5c1RvS2VlcC5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gb3B0aW9uXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsSUFBTSxrQkFBa0I7QUFHakIsSUFBTSxrQkFBNEMsT0FBTztBQUFBLEVBQzVELE9BQU8sQ0FBQztBQUFBLEVBQ1IsUUFBUSxDQUFDO0FBQUEsRUFDVCxTQUFTLENBQUM7QUFBQSxFQUNWLFdBQVc7QUFBQSxFQUNYLFVBQVU7QUFBQSxFQUNWLFdBQVcsQ0FBQztBQUFBLEVBQ1oscUJBQXFCO0FBQUEsRUFDckIsbUJBQW1CLENBQUM7QUFBQSxFQUNwQixNQUFNO0FBQUEsRUFDTixpQkFBaUI7QUFBQSxFQUNqQixnQkFBZ0I7QUFBQSxFQUNoQixXQUFXO0FBQUEsRUFDWCxXQUFXLENBQUM7QUFBQSxFQUNaLFVBQVUsQ0FBQztBQUFBLEVBQ1gsY0FBYztBQUFBLEVBQ2QsMkJBQTJCO0FBQUEsRUFDM0IsZUFBZTtBQUFBLEVBQ2YsY0FBYyxDQUFDO0FBQUEsRUFDZix3QkFBd0I7QUFBQSxFQUN4QixzQkFBc0I7QUFBQSxFQUN0QixVQUFVLENBQUM7QUFBQSxFQUNYLFdBQVcsQ0FBQztBQUFBLEVBQ1osUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLElBQ0gsU0FBUztBQUFBLElBQ1QsT0FBTztBQUFBLEVBQ1g7QUFBQSxFQUNBLGlCQUFpQjtBQUFBLEVBQ2pCLHNCQUFzQjtBQUFBLEVBQ3RCLHlCQUF5QjtBQUFBLEVBQ3pCLHNCQUFzQjtBQUFBLEVBQ3RCLHFCQUFxQjtBQUFBLEVBQ3JCLGlDQUFpQyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbEMsV0FBVztBQUFBLElBQ1AsU0FB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