"use strict"; require("core-js/modules/es.array.flat"); require("core-js/modules/es.array.unscopables.flat"); Object.defineProperty(exports, "__esModule", { value: true }); exports.isSupportedByMDN = isSupportedByMDN; exports.getUnsupportedTargets = getUnsupportedTargets; exports.default = void 0; var _astMetadataInferer = _interopRequireDefault(require("ast-metadata-inferer")); var _semver = _interopRequireDefault(require("semver")); var _helpers = require("../helpers"); var _constants = require("../constants"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const apis = _astMetadataInferer.default; // @TODO Import this type from ast-metadata-inferer after migrating this project to TypeScript const mdnRecords = new Map(apis.map(e => [e.protoChainId, e])); /** * Map ids of mdn targets to their "common/friendly" name */ const targetIdMappings = { chrome: "chrome", firefox: "firefox", opera: "opera", safari: "safari", safari_ios: "ios_saf", ie: "ie", edge_mobile: "ie_mob", edge: "edge", opera_android: "and_opera", chrome_android: "and_chrome", firefox_android: "and_firefox", webview_android: "and_webview", samsunginternet_android: "and_samsung", nodejs: "node" }; const reversedTargetMappings = (0, _helpers.reverseTargetMappings)(targetIdMappings); /** * Take a target's id and return it's full name by using `targetNameMappings` * ex. {target: and_ff, version: 40} => 'Android FireFox 40' */ function formatTargetNames(target) { return `${_constants.STANDARD_TARGET_NAME_MAPPING[target.target]} ${target.version}`; } /** * Convert '9' => '9.0.0' */ function customCoerce(version) { return version.length === 1 ? [version, 0, 0].join(".") : version; } /* * Return if MDN supports the API or not */ function isSupportedByMDN(node, { version, target: mdnTarget }) { const target = reversedTargetMappings[mdnTarget]; // If no record could be found, return true. Rules might not // be found because they could belong to another provider if (!mdnRecords.has(node.protoChainId)) return true; const record = mdnRecords.get(node.protoChainId); if (!record || !record.compat.support) return true; const compatRecord = record.compat.support[target]; if (!compatRecord) return true; if (!Array.isArray(compatRecord) && !("version_added" in compatRecord)) return true; const { version_added: versionAdded } = Array.isArray(compatRecord) ? compatRecord.find(e => "version_added" in e) : compatRecord; // If a version is true then it is supported but version is unsure if (typeof versionAdded === "boolean") return versionAdded; if (versionAdded === null) return true; // Special case for Safari TP: TP is always gte than any other releases if (target === "safari") { if (version === "TP") return true; if (versionAdded === "TP") return false; } // A browser supports an API if its version is greater than or equal // to the first version of the browser that API was added in const semverCurrent = _semver.default.coerce(customCoerce(version)); const semverAdded = _semver.default.coerce(customCoerce(versionAdded)); // semver.coerce() might be null for non-semvers (other than Safari TP) // Just warn and treat features as supported here for now to avoid lint from // crashing if (!semverCurrent) { // eslint-disable-next-line no-console console.warn(`eslint-plugin-compat: A non-semver target "${target} ${version}" matched for the feature ${node.protoChainId}, skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`); return true; } if (!versionAdded) { // eslint-disable-next-line no-console console.warn(`eslint-plugin-compat: The feature ${node.protoChainId} is supported since a non-semver target "${target} ${versionAdded}", skipping. You're welcome to submit this log to https://github.com/amilajack/eslint-plugin-compat/issues for analysis.`); return true; } return _semver.default.gte(semverCurrent, semverAdded); } /** * Return an array of all unsupported targets */ function getUnsupportedTargets(node, targets) { return targets.filter(target => !isSupportedByMDN(node, target)).map(formatTargetNames); } function getMetadataName(metadata) { switch (metadata.protoChain.length) { case 1: { return metadata.protoChain[0]; } default: return `${metadata.protoChain.join(".")}()`; } } const MdnProvider = apis // Create entries for each ast node type .map(metadata => metadata.astNodeTypes.map(astNodeType => ({ ...metadata, name: getMetadataName(metadata), id: metadata.protoChainId, protoChainId: metadata.protoChainId, astNodeType, object: metadata.protoChain[0], // @TODO Handle cases where 'prototype' is in protoChain property: metadata.protoChain[1] }))) // Flatten the array of arrays .flat() // Add rule and target support logic for each entry .map(rule => ({ ...rule, getUnsupportedTargets })); var _default = MdnProvider; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlcnMvbWRuLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbImFwaXMiLCJhcGlNZXRhZGF0YSIsIm1kblJlY29yZHMiLCJNYXAiLCJtYXAiLCJlIiwicHJvdG9DaGFpbklkIiwidGFyZ2V0SWRNYXBwaW5ncyIsImNocm9tZSIsImZpcmVmb3giLCJvcGVyYSIsInNhZmFyaSIsInNhZmFyaV9pb3MiLCJpZSIsImVkZ2VfbW9iaWxlIiwiZWRnZSIsIm9wZXJhX2FuZHJvaWQiLCJjaHJvbWVfYW5kcm9pZCIsImZpcmVmb3hfYW5kcm9pZCIsIndlYnZpZXdfYW5kcm9pZCIsInNhbXN1bmdpbnRlcm5ldF9hbmRyb2lkIiwibm9kZWpzIiwicmV2ZXJzZWRUYXJnZXRNYXBwaW5ncyIsImZvcm1hdFRhcmdldE5hbWVzIiwidGFyZ2V0IiwiU1RBTkRBUkRfVEFSR0VUX05BTUVfTUFQUElORyIsInZlcnNpb24iLCJjdXN0b21Db2VyY2UiLCJsZW5ndGgiLCJqb2luIiwiaXNTdXBwb3J0ZWRCeU1ETiIsIm5vZGUiLCJtZG5UYXJnZXQiLCJoYXMiLCJyZWNvcmQiLCJnZXQiLCJjb21wYXQiLCJzdXBwb3J0IiwiY29tcGF0UmVjb3JkIiwiQXJyYXkiLCJpc0FycmF5IiwidmVyc2lvbl9hZGRlZCIsInZlcnNpb25BZGRlZCIsImZpbmQiLCJzZW12ZXJDdXJyZW50Iiwic2VtdmVyIiwiY29lcmNlIiwic2VtdmVyQWRkZWQiLCJjb25zb2xlIiwid2FybiIsImd0ZSIsImdldFVuc3VwcG9ydGVkVGFyZ2V0cyIsInRhcmdldHMiLCJmaWx0ZXIiLCJnZXRNZXRhZGF0YU5hbWUiLCJtZXRhZGF0YSIsInByb3RvQ2hhaW4iLCJNZG5Qcm92aWRlciIsImFzdE5vZGVUeXBlcyIsImFzdE5vZGVUeXBlIiwibmFtZSIsImlkIiwib2JqZWN0IiwicHJvcGVydHkiLCJmbGF0IiwicnVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztB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QUNDLFVBQVQsQ0FBb0I1QixNQUE1QjtBQUNFLFNBQUssQ0FBTDtBQUFRO0FBQ04sZUFBTzJCLFFBQVEsQ0FBQ0MsVUFBVCxDQUFvQixDQUFwQixDQUFQO0FBQ0Q7O0FBQ0Q7QUFDRSxhQUFRLEdBQUVELFFBQVEsQ0FBQ0MsVUFBVCxDQUFvQjNCLElBQXBCLENBQXlCLEdBQXpCLENBQThCLElBQXhDO0FBTEo7QUFPRDs7QUFFRCxNQUFNNEIsV0FBcUQsR0FBR3pELElBQUksQ0FDaEU7QUFEZ0UsQ0FFL0RJLEdBRjJELENBRXREbUQsUUFBRCxJQUNIQSxRQUFRLENBQUNHLFlBQVQsQ0FBc0J0RCxHQUF0QixDQUEyQnVELFdBQUQsS0FBa0IsRUFDMUMsR0FBR0osUUFEdUM7QUFFMUNLLEVBQUFBLElBQUksRUFBRU4sZUFBZSxDQUFDQyxRQUFELENBRnFCO0FBRzFDTSxFQUFBQSxFQUFFLEVBQUVOLFFBQVEsQ0FBQ2pELFlBSDZCO0FBSTFDQSxFQUFBQSxZQUFZLEVBQUVpRCxRQUFRLENBQUNqRCxZQUptQjtBQUsxQ3FELEVBQUFBLFdBTDBDO0FBTTFDRyxFQUFBQSxNQUFNLEVBQUVQLFFBQVEsQ0FBQ0MsVUFBVCxDQUFvQixDQUFwQixDQU5rQztBQU8xQztBQUNBTyxFQUFBQSxRQUFRLEVBQUVSLFFBQVEsQ0FBQ0MsVUFBVCxDQUFvQixDQUFwQjtBQVJnQyxDQUFsQixDQUExQixDQUgwRCxFQWM1RDtBQWQ0RCxDQWUzRFEsSUFmMkQsR0FnQjVEO0FBaEI0RCxDQWlCM0Q1RCxHQWpCMkQsQ0FpQnRENkQsSUFBRCxLQUFXLEVBQ2QsR0FBR0EsSUFEVztBQUVkZCxFQUFBQTtBQUZjLENBQVgsQ0FqQnVELENBQTlEO2VBc0JlTSxXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFwaU1ldGFkYXRhIGZyb20gXCJhc3QtbWV0YWRhdGEtaW5mZXJlclwiO1xuaW1wb3J0IHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5pbXBvcnQgeyBBcGlNZXRhZGF0YSB9IGZyb20gXCJhc3QtbWV0YWRhdGEtaW5mZXJlci9saWIvdHlwZXNcIjtcbmltcG9ydCB7IHJldmVyc2VUYXJnZXRNYXBwaW5ncyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBTVEFOREFSRF9UQVJHRVRfTkFNRV9NQVBQSU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXN0TWV0YWRhdGFBcGlXaXRoVGFyZ2V0c1Jlc29sdmVyLCBUYXJnZXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuY29uc3QgYXBpcyA9IGFwaU1ldGFkYXRhIGFzIEFwaU1ldGFkYXRhW107XG5cbi8vIEBUT0RPIEltcG9ydCB0aGlzIHR5cGUgZnJvbSBhc3QtbWV0YWRhdGEtaW5mZXJlciBhZnRlciBtaWdyYXRpbmcgdGhpcyBwcm9qZWN0IHRvIFR5cGVTY3JpcHRcbmNvbnN0IG1kblJlY29yZHM6IE1hcDxzdHJpbmcsIEFwaU1ldGFkYXRhPiA9IG5ldyBNYXAoXG4gIGFwaXMubWFwKChlKSA9PiBbZS5wcm90b0NoYWluSWQsIGVdKVxuKTtcblxuaW50ZXJmYWNlIFRhcmdldElkTWFwcGluZ3Mge1xuICBjaHJvbWU6IFwiY2hyb21lXCI7XG4gIGZpcmVmb3g6IFwiZmlyZWZveFwiO1xuICBvcGVyYTogXCJvcGVyYVwiO1xuICBzYWZhcmk6IFwic2FmYXJpXCI7XG4gIHNhZmFyaV9pb3M6IFwiaW9zX3NhZlwiO1xuICBpZTogXCJpZVwiO1xuICBlZGdlX21vYmlsZTogXCJpZV9tb2JcIjtcbiAgZWRnZTogXCJlZGdlXCI7XG4gIG9wZXJhX2FuZHJvaWQ6IFwiYW5kX29wZXJhXCI7XG4gIGNocm9tZV9hbmRyb2lkOiBcImFuZF9jaHJvbWVcIjtcbiAgZmlyZWZveF9hbmRyb2lkOiBcImFuZF9maXJlZm94XCI7XG4gIHdlYnZpZXdfYW5kcm9pZDogXCJhbmRfd2Vidmlld1wiO1xuICBzYW1zdW5naW50ZXJuZXRfYW5kcm9pZDogXCJhbmRfc2Ftc3VuZ1wiO1xuICBub2RlanM6IFwibm9kZVwiO1xufVxuXG4vKipcbiAqIE1hcCBpZHMgb2YgbWRuIHRhcmdldHMgdG8gdGhlaXIgXCJjb21tb24vZnJpZW5kbHlcIiBuYW1lXG4gKi9cbmNvbnN0IHRhcmdldElkTWFwcGluZ3M6IFJlYWRvbmx5PFRhcmdldElkTWFwcGluZ3M+ID0ge1xuICBjaHJvbWU6IFwiY2hyb21lXCIsXG4gIGZpcmVmb3g6IFwiZmlyZWZveFwiLFxuICBvcGVyYTogXCJvcGVyYVwiLFxuICBzYWZhcmk6IFwic2FmYXJpXCIsXG4gIHNhZmFyaV9pb3M6IFwiaW9zX3NhZlwiLFxuICBpZTogXCJpZVwiLFxuICBlZGdlX21vYmlsZTogXCJpZV9tb2JcIixcbiAgZWRnZTogXCJlZGdlXCIsXG4gIG9wZXJhX2FuZHJvaWQ6IFwiYW5kX29wZXJhXCIsXG4gIGNocm9tZV9hbmRyb2lkOiBcImFuZF9jaHJvbWVcIixcbiAgZmlyZWZveF9hbmRyb2lkOiBcImFuZF9maXJlZm94XCIsXG4gIHdlYnZpZXdfYW5kcm9pZDogXCJhbmRfd2Vidmlld1wiLFxuICBzYW1zdW5naW50ZXJuZXRfYW5kcm9pZDogXCJhbmRfc2Ftc3VuZ1wiLFxuICBub2RlanM6IFwibm9kZVwiLFxufTtcblxuY29uc3QgcmV2ZXJzZWRUYXJnZXRNYXBwaW5ncyA9IHJldmVyc2VUYXJnZXRNYXBwaW5ncyh0YXJnZXRJZE1hcHBpbmdzKTtcblxuLyoqXG4gKiBUYWtlIGEgdGFyZ2V0J3MgaWQgYW5kIHJldHVybiBpdCdzIGZ1bGwgbmFtZSBieSB1c2luZyBgdGFyZ2V0TmFtZU1hcHBpbmdzYFxuICogZXguIHt0YXJnZXQ6IGFuZF9mZiwgdmVyc2lvbjogNDB9ID0+ICdBbmRyb2lkIEZpcmVGb3ggNDAnXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFRhcmdldE5hbWVzKHRhcmdldDogVGFyZ2V0KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke1NUQU5EQVJEX1RBUkdFVF9OQU1FX01BUFBJTkdbdGFyZ2V0LnRhcmdldF19ICR7dGFyZ2V0LnZlcnNpb259YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0ICc5JyA9PiAnOS4wLjAnXG4gKi9cbmZ1bmN0aW9uIGN1c3RvbUNvZXJjZSh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmVyc2lvbi5sZW5ndGggPT09IDEgPyBbdmVyc2lvbiwgMCwgMF0uam9pbihcIi5cIikgOiB2ZXJzaW9uO1xufVxuXG4vKlxuICogUmV0dXJuIGlmIE1ETiBzdXBwb3J0cyB0aGUgQVBJIG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdXBwb3J0ZWRCeU1ETihcbiAgbm9kZTogQXN0TWV0YWRhdGFBcGlXaXRoVGFyZ2V0c1Jlc29sdmVyLFxuICB7IHZlcnNpb24sIHRhcmdldDogbWRuVGFyZ2V0IH06IFRhcmdldFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldCA9IHJldmVyc2VkVGFyZ2V0TWFwcGluZ3NbbWRuVGFyZ2V0XTtcbiAgLy8gSWYgbm8gcmVjb3JkIGNvdWxkIGJlIGZvdW5kLCByZXR1cm4gdHJ1ZS4gUnVsZXMgbWlnaHQgbm90XG4gIC8vIGJlIGZvdW5kIGJlY2F1c2UgdGhleSBjb3VsZCBiZWxvbmcgdG8gYW5vdGhlciBwcm92aWRlclxuICBpZiAoIW1kblJlY29yZHMuaGFzKG5vZGUucHJvdG9DaGFpbklkKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHJlY29yZCA9IG1kblJlY29yZHMuZ2V0KG5vZGUucHJvdG9DaGFpbklkKTtcbiAgaWYgKCFyZWNvcmQgfHwgIXJlY29yZC5jb21wYXQuc3VwcG9ydCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGNvbXBhdFJlY29yZCA9IHJlY29yZC5jb21wYXQuc3VwcG9ydFt0YXJnZXRdO1xuICBpZiAoIWNvbXBhdFJlY29yZCkgcmV0dXJuIHRydWU7XG4gIGlmICghQXJyYXkuaXNBcnJheShjb21wYXRSZWNvcmQpICYmICEoXCJ2ZXJzaW9uX2FkZGVkXCIgaW4gY29tcGF0UmVjb3JkKSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgeyB2ZXJzaW9uX2FkZGVkOiB2ZXJzaW9uQWRkZWQgfSA9IEFycmF5LmlzQXJyYXkoY29tcGF0UmVjb3JkKVxuICAgID8gY29tcGF0UmVjb3JkLmZpbmQoKGUpID0+IFwidmVyc2lvbl9hZGRlZFwiIGluIGUpXG4gICAgOiBjb21wYXRSZWNvcmQ7XG5cbiAgLy8gSWYgYSB2ZXJzaW9uIGlzIHRydWUgdGhlbiBpdCBpcyBzdXBwb3J0ZWQgYnV0IHZlcnNpb24gaXMgdW5zdXJlXG4gIGlmICh0eXBlb2YgdmVyc2lvbkFkZGVkID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHZlcnNpb25BZGRlZDtcbiAgaWYgKHZlcnNpb25BZGRlZCA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBTYWZhcmkgVFA6IFRQIGlzIGFsd2F5cyBndGUgdGhhbiBhbnkgb3RoZXIgcmVsZWFzZXNcbiAgaWYgKHRhcmdldCA9PT0gXCJzYWZhcmlcIikge1xuICAgIGlmICh2ZXJzaW9uID09PSBcIlRQXCIpIHJldHVybiB0cnVlO1xuICAgIGlmICh2ZXJzaW9uQWRkZWQgPT09IFwiVFBcIikgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgYnJvd3NlciBzdXBwb3J0cyBhbiBBUEkgaWYgaXRzIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsXG4gIC8vIHRvIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyIHRoYXQgQVBJIHdhcyBhZGRlZCBpblxuICBjb25zdCBzZW12ZXJDdXJyZW50ID0gc2VtdmVyLmNvZXJjZShjdXN0b21Db2VyY2UodmVyc2lvbikpO1xuICBjb25zdCBzZW12ZXJBZGRlZCA9IHNlbXZlci5jb2VyY2UoY3VzdG9tQ29lcmNlKHZlcnNpb25BZGRlZCkpO1xuXG4gIC8vIHNlbXZlci5jb2VyY2UoKSBtaWdodCBiZSBudWxsIGZvciBub24tc2VtdmVycyAob3RoZXIgdGhhbiBTYWZhcmkgVFApXG4gIC8vIEp1c3Qgd2FybiBhbmQgdHJlYXQgZmVhdHVyZXMgYXMgc3VwcG9ydGVkIGhlcmUgZm9yIG5vdyB0byBhdm9pZCBsaW50IGZyb21cbiAgLy8gY3Jhc2hpbmdcbiAgaWYgKCFzZW12ZXJDdXJyZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgZXNsaW50LXBsdWdpbi1jb21wYXQ6IEEgbm9uLXNlbXZlciB0YXJnZXQgXCIke3RhcmdldH0gJHt2ZXJzaW9ufVwiIG1hdGNoZWQgZm9yIHRoZSBmZWF0dXJlICR7bm9kZS5wcm90b0NoYWluSWR9LCBza2lwcGluZy4gWW91J3JlIHdlbGNvbWUgdG8gc3VibWl0IHRoaXMgbG9nIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWlsYWphY2svZXNsaW50LXBsdWdpbi1jb21wYXQvaXNzdWVzIGZvciBhbmFseXNpcy5gXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIXZlcnNpb25BZGRlZCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYGVzbGludC1wbHVnaW4tY29tcGF0OiBUaGUgZmVhdHVyZSAke25vZGUucHJvdG9DaGFpbklkfSBpcyBzdXBwb3J0ZWQgc2luY2UgYSBub24tc2VtdmVyIHRhcmdldCBcIiR7dGFyZ2V0fSAke3ZlcnNpb25BZGRlZH1cIiwgc2tpcHBpbmcuIFlvdSdyZSB3ZWxjb21lIHRvIHN1Ym1pdCB0aGlzIGxvZyB0byBodHRwczovL2dpdGh1Yi5jb20vYW1pbGFqYWNrL2VzbGludC1wbHVnaW4tY29tcGF0L2lzc3VlcyBmb3IgYW5hbHlzaXMuYFxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHNlbXZlci5ndGUoc2VtdmVyQ3VycmVudCwgc2VtdmVyQWRkZWQpO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgdW5zdXBwb3J0ZWQgdGFyZ2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5zdXBwb3J0ZWRUYXJnZXRzKFxuICBub2RlOiBBc3RNZXRhZGF0YUFwaVdpdGhUYXJnZXRzUmVzb2x2ZXIsXG4gIHRhcmdldHM6IFRhcmdldFtdXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzXG4gICAgLmZpbHRlcigodGFyZ2V0KSA9PiAhaXNTdXBwb3J0ZWRCeU1ETihub2RlLCB0YXJnZXQpKVxuICAgIC5tYXAoZm9ybWF0VGFyZ2V0TmFtZXMpO1xufVxuXG5mdW5jdGlvbiBnZXRNZXRhZGF0YU5hbWUobWV0YWRhdGE6IEFwaU1ldGFkYXRhKSB7XG4gIHN3aXRjaCAobWV0YWRhdGEucHJvdG9DaGFpbi5sZW5ndGgpIHtcbiAgICBjYXNlIDE6IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5wcm90b0NoYWluWzBdO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGAke21ldGFkYXRhLnByb3RvQ2hhaW4uam9pbihcIi5cIil9KClgO1xuICB9XG59XG5cbmNvbnN0IE1kblByb3ZpZGVyOiBBcnJheTxBc3RNZXRhZGF0YUFwaVdpdGhUYXJnZXRzUmVzb2x2ZXI+ID0gYXBpc1xuICAvLyBDcmVhdGUgZW50cmllcyBmb3IgZWFjaCBhc3Qgbm9kZSB0eXBlXG4gIC5tYXAoKG1ldGFkYXRhKSA9PlxuICAgIG1ldGFkYXRhLmFzdE5vZGVUeXBlcy5tYXAoKGFzdE5vZGVUeXBlKSA9PiAoe1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBuYW1lOiBnZXRNZXRhZGF0YU5hbWUobWV0YWRhdGEpLFxuICAgICAgaWQ6IG1ldGFkYXRhLnByb3RvQ2hhaW5JZCxcbiAgICAgIHByb3RvQ2hhaW5JZDogbWV0YWRhdGEucHJvdG9DaGFpbklkLFxuICAgICAgYXN0Tm9kZVR5cGUsXG4gICAgICBvYmplY3Q6IG1ldGFkYXRhLnByb3RvQ2hhaW5bMF0sXG4gICAgICAvLyBAVE9ETyBIYW5kbGUgY2FzZXMgd2hlcmUgJ3Byb3RvdHlwZScgaXMgaW4gcHJvdG9DaGFpblxuICAgICAgcHJvcGVydHk6IG1ldGFkYXRhLnByb3RvQ2hhaW5bMV0sXG4gICAgfSkpXG4gIClcbiAgLy8gRmxhdHRlbiB0aGUgYXJyYXkgb2YgYXJyYXlzXG4gIC5mbGF0KClcbiAgLy8gQWRkIHJ1bGUgYW5kIHRhcmdldCBzdXBwb3J0IGxvZ2ljIGZvciBlYWNoIGVudHJ5XG4gIC5tYXAoKHJ1bGUpID0+ICh7XG4gICAgLi4ucnVsZSxcbiAgICBnZXRVbnN1cHBvcnRlZFRhcmdldHMsXG4gIH0pKTtcblxuZXhwb3J0IGRlZmF1bHQgTWRuUHJvdmlkZXI7XG4iXX0=