site-metadata-extractor
Version:
web(site) resource metadata extractor
194 lines • 30.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTopNode = exports.getParsedDocForText = exports.getParsedDoc = exports.getCleanedDoc = exports.lazy = void 0;
/* eslint-disable no-unused-vars */
/* eslint-disable @typescript-eslint/no-unused-vars */
const cheerio_1 = __importDefault(require("cheerio"));
const url_1 = require("url");
const cleaner_1 = __importDefault(require("./cleaner"));
const extractor_1 = __importDefault(require("./extractor"));
const siteMetadataExtractor = (markup, resourceUrl, lang = "en") => {
const resourceUrlObj = new url_1.URL(resourceUrl);
const doc = cheerio_1.default.load(markup, { xmlMode: true });
// Separate instance with decodeEntities: false specifically for JSON-LD extraction
const docForJsonLd = cheerio_1.default.load(markup, {
xmlMode: true,
decodeEntities: false,
});
const docForText = cheerio_1.default.load(markup, { xmlMode: false });
const language = lang || extractor_1.default.lang(doc);
const pageData = {
author: extractor_1.default.author(doc),
canonicalLink: extractor_1.default.canonicalLink(doc, resourceUrl),
copyright: extractor_1.default.copyright(doc),
date: extractor_1.default.date(doc),
description: extractor_1.default.description(doc),
favicon: extractor_1.default.favicon(doc, resourceUrlObj),
image: extractor_1.default.image(doc),
jsonld: extractor_1.default.jsonld(docForJsonLd),
keywords: extractor_1.default.keywords(doc),
lang: language,
locale: extractor_1.default.locale(doc),
origin: resourceUrlObj.origin,
publisher: extractor_1.default.publisher(doc),
siteName: extractor_1.default.siteName(doc),
softTitle: extractor_1.default.softTitle(doc),
tags: extractor_1.default.tags(doc),
title: extractor_1.default.title(doc),
type: extractor_1.default.type(doc),
};
// Step 1: Clean the doc
(0, cleaner_1.default)(doc);
// Step 2: Find the doc node with the best text
const topNode = extractor_1.default.calculateBestNode(docForText, language);
// Step 3: Extract text ,videos, images, link
pageData.videos = extractor_1.default.videos(doc, topNode);
pageData.links = extractor_1.default.links(doc, topNode, language);
pageData.text = extractor_1.default.text(doc, topNode, language);
return pageData;
};
exports.default = siteMetadataExtractor;
// Allow access to document properties with lazy evaluation
const lazy = (html, resourceUrl, language = "en") => {
const resourceUrlObj = new url_1.URL(resourceUrl);
global.lazyPageData = global.lazyPageData || {};
return {
author: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.author = extractor_1.default.author(doc);
return global.lazyPageData.author;
},
canonicalLink: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.canonicalLink = extractor_1.default.canonicalLink(doc, resourceUrl);
return global.lazyPageData.canonicalLink;
},
copyright: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.copyright = extractor_1.default.copyright(doc);
return global.lazyPageData.copyright;
},
date: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.date = extractor_1.default.date(doc);
return global.lazyPageData.date;
},
description: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.description = extractor_1.default.description(doc);
return global.lazyPageData.description;
},
favicon: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.favicon = extractor_1.default.favicon(doc, resourceUrlObj);
return global.lazyPageData.favicon;
},
image: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.image = extractor_1.default.image(doc);
return global.lazyPageData.image;
},
jsonld: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.jsonld = extractor_1.default.jsonld(doc);
return global.lazyPageData.jsonld;
},
keywords: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.keywords = extractor_1.default.keywords(doc);
return global.lazyPageData.keywords;
},
lang: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.lang = language || extractor_1.default.lang(doc);
return global.lazyPageData.lang;
},
locale: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.locale = extractor_1.default.locale(doc);
return global.lazyPageData.locale;
},
links() {
let doc = getParsedDocForText.call(global, html);
const topNode = getTopNode.call(global, doc, this.lang());
doc = (0, cleaner_1.default)(doc);
global.lazyPageData.links = extractor_1.default.links(doc, topNode, this.lang());
return global.lazyPageData.links;
},
origin: () => {
global.lazyPageData.origin = resourceUrlObj.origin;
return global.lazyPageData.origin;
},
publisher: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.publisher = extractor_1.default.publisher(doc);
return global.lazyPageData.publisher;
},
siteName: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.siteName = extractor_1.default.siteName(doc);
return global.lazyPageData.siteName;
},
softTitle: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.softTitle = extractor_1.default.softTitle(doc);
return global.lazyPageData.softTitle;
},
tags: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.tags = extractor_1.default.tags(doc);
return global.lazyPageData.tags;
},
text() {
let doc = getParsedDocForText.call(global, html);
doc = (0, cleaner_1.default)(doc);
const topNode = getTopNode.call(global, doc, this.lang());
const textData = extractor_1.default.text(doc, topNode, this.lang());
global.lazyPageData.text = textData;
return textData;
},
title: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.title = extractor_1.default.title(doc);
return global.lazyPageData.title;
},
type: () => {
const doc = getParsedDoc.call(global, html);
global.lazyPageData.type = extractor_1.default.type(doc);
return global.lazyPageData.type;
},
videos() {
let doc = getParsedDocForText.call(global, html);
doc = (0, cleaner_1.default)(doc);
const topNode = getTopNode.call(global, doc, this.lang());
global.lazyPageData.videos = extractor_1.default.videos(doc, topNode);
return global.lazyPageData.videos;
},
};
};
exports.lazy = lazy;
function getCleanedDoc(html) {
if (!global.cleanedDoc) {
const doc = getParsedDoc.call(global, html);
global.cleanedDoc = (0, cleaner_1.default)(doc);
}
return global.cleanedDoc;
}
exports.getCleanedDoc = getCleanedDoc;
function getParsedDoc(html) {
return (global.doc = cheerio_1.default.load(html));
}
exports.getParsedDoc = getParsedDoc;
function getParsedDocForText(html) {
return (global.doc = cheerio_1.default.load(html, { xmlMode: false }));
}
exports.getParsedDocForText = getParsedDocForText;
function getTopNode(doc, lang) {
global.topNode = extractor_1.default.calculateBestNode(doc, lang);
return global.topNode;
}
exports.getTopNode = getTopNode;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbUNBQW1DO0FBQ25DLHNEQUFzRDtBQUN0RCxzREFBOEI7QUFFOUIsNkJBQTBCO0FBRTFCLHdEQUFnQztBQUNoQyw0REFBNkQ7QUFrRDdELE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsTUFBYyxFQUNkLFdBQW1CLEVBQ25CLElBQUksR0FBRyxJQUFJLEVBQ0QsRUFBRTtJQUNaLE1BQU0sY0FBYyxHQUFHLElBQUksU0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sR0FBRyxHQUFHLGlCQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXBELG1GQUFtRjtJQUNuRixNQUFNLFlBQVksR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDeEMsT0FBTyxFQUFFLElBQUk7UUFDYixjQUFjLEVBQUUsS0FBSztLQUN0QixDQUFDLENBQUM7SUFFSCxNQUFNLFVBQVUsR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUU1RCxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksbUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFN0MsTUFBTSxRQUFRLEdBQWE7UUFDekIsTUFBTSxFQUFFLG1CQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM3QixhQUFhLEVBQUUsbUJBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQztRQUN4RCxTQUFTLEVBQUUsbUJBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ25DLElBQUksRUFBRSxtQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDekIsV0FB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LEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUEsaUJBQU8sRUFBQyxHQUFHLENBQUMsQ0FBQztLQUNsQztJQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUMzQixDQUFDO0FBTkQsc0NBTUM7QUFFRCxTQUFnQixZQUFZLENBQUMsSUFBWTtJQUN2QyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFGRCxvQ0FFQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRkQsa0RBRUM7QUFFRCxTQUFnQixVQUFVLENBQUMsR0FBaUIsRUFBRSxJQUFZO0lBQ3hELE1BQU0sQ0FBQyxPQUFPLEdBQUcsbUJBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFIRCxnQ0FHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCBjaGVlcmlvIGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgeyBOZXdzQXJ0aWNsZSwgQXJ0aWNsZSB9IGZyb20gXCJzY2hlbWEtZHRzXCI7XG5pbXBvcnQgeyBVUkwgfSBmcm9tIFwidXJsXCI7XG5cbmltcG9ydCBjbGVhbmVyIGZyb20gXCIuL2NsZWFuZXJcIjtcbmltcG9ydCBleHRyYWN0b3IsIHsgTGlua09iaiwgVmlkZW9BdHRycyB9IGZyb20gXCIuL2V4dHJhY3RvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEYXRhIHtcbiAgYXV0aG9yOiBzdHJpbmdbXTtcbiAgY2Fub25pY2FsTGluazogc3RyaW5nO1xuICBjb3B5cmlnaHQ6IHN0cmluZztcbiAgZGF0ZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBmYXZpY29uOiBzdHJpbmc7XG4gIGltYWdlOiBzdHJpbmc7XG4gIGpzb25sZDogTmV3c0FydGljbGUgfCBBcnRpY2xlIHwgbnVsbDtcbiAga2V5d29yZHM6IHN0cmluZztcbiAgbGFuZzogc3RyaW5nO1xuICBsaW5rcz86IExpbmtPYmpbXTtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIG9yaWdpbjogc3RyaW5nO1xuICBwdWJsaXNoZXI6IHN0cmluZztcbiAgc2l0ZU5hbWU6IHN0cmluZztcbiAgc29mdFRpdGxlOiBzdHJpbmc7XG4gIHRhZ3M6IHN0cmluZ1tdO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHZpZGVvcz86IFZpZGVvQXR0cnNbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXp5RXh0cmFjdG9yIHtcbiAgYXV0aG9yOiAoKSA9PiBzdHJpbmdbXTtcbiAgY2Fub25pY2FsTGluazogKCkgPT4gc3RyaW5nO1xuICBjb3B5cmlnaHQ6ICgpID0+IHN0cmluZztcbiAgZGF0ZTogKCkgPT4gc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogKCkgPT4gc3RyaW5nO1xuICBmYXZpY29uOiAoKSA9PiBzdHJpbmc7XG4gIGltYWdlOiAoKSA9PiBzdHJpbmc7XG4gIGpzb25sZDogKCkgPT4gTmV3c0FydGljbGUgfCBBcnRpY2xlIHwgbnVsbDtcbiAga2V5d29yZHM6ICgpID0+IHN0cmluZztcbiAgbGFuZzogKCkgPT4gc3RyaW5nO1xuICBsaW5rczogKCkgPT4gTGlua09ialtdO1xuICBsb2NhbGU6ICgpID0+IHN0cmluZztcbiAgb3JpZ2luOiAoKSA9PiBzdHJpbmc7XG4gIHB1Ymxpc2hlcjogKCkgPT4gc3RyaW5nO1xuICBzaXRlTmFtZTogKCkgPT4gc3RyaW5nO1xuICBzb2Z0VGl0bGU6ICgpID0+IHN0cmluZztcbiAgdGFnczogKCkgPT4gc3RyaW5nW107XG4gIHRleHQ6ICgpID0+IHN0cmluZztcbiAgdGl0bGU6ICgpID0+IHN0cmluZztcbiAgdHlwZTogKCkgPT4gc3RyaW5nO1xuICB2aWRlb3M6ICgpID0+IFZpZGVvQXR0cnNbXTtcbn1cblxuY29uc3Qgc2l0ZU1ldGFkYXRhRXh0cmFjdG9yID0gKFxuICBtYXJrdXA6IHN0cmluZyxcbiAgcmVzb3VyY2VVcmw6IHN0cmluZyxcbiAgbGFuZyA9IFwiZW5cIixcbik6IFBhZ2VEYXRhID0+IHtcbiAgY29uc3QgcmVzb3VyY2VVcmxPYmogPSBuZXcgVVJMKHJlc291cmNlVXJsKTtcbiAgY29uc3QgZG9jID0gY2hlZXJpby5sb2FkKG1hcmt1cCwgeyB4bWxNb2RlOiB0cnVlIH0pO1xuXG4gIC8vIFNlcGFyYXRlIGluc3RhbmNlIHdpdGggZGVjb2RlRW50aXRpZXM6IGZhbHNlIHNwZWNpZmljYWxseSBmb3IgSlNPTi1MRCBleHRyYWN0aW9uXG4gIGNvbnN0IGRvY0Zvckpzb25MZCA9IGNoZWVyaW8ubG9hZChtYXJrdXAsIHtcbiAgICB4bWxNb2RlOiB0cnVlLFxuICAgIGRlY29kZUVudGl0aWVzOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgZG9jRm9yVGV4dCA9IGNoZWVyaW8ubG9hZChtYXJrdXAsIHsgeG1sTW9kZTogZmFsc2UgfSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5nIHx8IGV4dHJhY3Rvci5sYW5nKGRvYyk7XG5cbiAgY29uc3QgcGFnZURhdGE6IFBhZ2VEYXRhID0ge1xuICAgIGF1dGhvcjogZXh0cmFjdG9yLmF1dGhvcihkb2MpLFxuICAgIGNhbm9uaWNhbExpbms6IGV4dHJhY3Rvci5jYW5vbmljYWxMaW5rKGRvYywgcmVzb3VyY2VVcmwpLFxuICAgIGNvcHlyaWdodDogZXh0cmFjdG9yLmNvcHlyaWdodChkb2MpLFxuICAgIGRhdGU6IGV4dHJhY3Rvci5kYXRlKGRvYyksXG4gICAgZGVzY3JpcHRpb246IGV4dHJhY3Rvci5kZXNjcmlwdGlvbihkb2MpLFxuICAgIGZhdmljb246IGV4dHJhY3Rvci5mYXZpY29uKGRvYywgcmVzb3VyY2VVcmxPYmopLFxuICAgIGltYWdlOiBleHRyYWN0b3IuaW1hZ2UoZG9jKSxcbiAgICBqc29ubGQ6IGV4dHJhY3Rvci5qc29ubGQoZG9jRm9ySnNvbkxkKSxcbiAgICBrZXl3b3JkczogZXh0cmFjdG9yLmtleXdvcmRzKGRvYyksXG4gICAgbGFuZzogbGFuZ3VhZ2UsXG4gICAgbG9jYWxlOiBleHRyYWN0b3IubG9jYWxlKGRvYyksXG4gICAgb3JpZ2luOiByZXNvdXJjZVVybE9iai5vcmlnaW4sXG4gICAgcHVibGlzaGVyOiBleHRyYWN0b3IucHVibGlzaGVyKGRvYyksXG4gICAgc2l0ZU5hbWU6IGV4dHJhY3Rvci5zaXRlTmFtZShkb2MpLFxuICAgIHNvZnRUaXRsZTogZXh0cmFjdG9yLnNvZnRUaXRsZShkb2MpLFxuICAgIHRhZ3M6IGV4dHJhY3Rvci50YWdzKGRvYyksXG4gICAgdGl0bGU6IGV4dHJhY3Rvci50aXRsZShkb2MpLFxuICAgIHR5cGU6IGV4dHJhY3Rvci50eXBlKGRvYyksXG4gIH07XG5cbiAgLy8gU3RlcCAxOiBDbGVhbiB0aGUgZG9jXG4gIGNsZWFuZXIoZG9jKTtcblxuICAvLyBTdGVwIDI6IEZpbmQgdGhlIGRvYyBub2RlIHdpdGggdGhlIGJlc3QgdGV4dFxuICBjb25zdCB0b3BOb2RlID0gZXh0cmFjdG9yLmNhbGN1bGF0ZUJlc3ROb2RlKGRvY0ZvclRleHQsIGxhbmd1YWdlKTtcblxuICAvLyBTdGVwIDM6IEV4dHJhY3QgdGV4dCAsdmlkZW9zLCBpbWFnZXMsIGxpbmtcbiAgcGFnZURhdGEudmlkZW9zID0gZXh0cmFjdG9yLnZpZGVvcyhkb2MsIHRvcE5vZGUpO1xuICBwYWdlRGF0YS5saW5rcyA9IGV4dHJhY3Rvci5saW5rcyhkb2MsIHRvcE5vZGUsIGxhbmd1YWdlKTtcbiAgcGFnZURhdGEudGV4dCA9IGV4dHJhY3Rvci50ZXh0KGRvYywgdG9wTm9kZSwgbGFuZ3VhZ2UpO1xuXG4gIHJldHVybiBwYWdlRGF0YTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNpdGVNZXRhZGF0YUV4dHJhY3RvcjtcblxuLy8gQWxsb3cgYWNjZXNzIHRvIGRvY3VtZW50IHByb3BlcnRpZXMgd2l0aCBsYXp5IGV2YWx1YXRpb25cbmV4cG9ydCBjb25zdCBsYXp5ID0gKFxuICBodG1sOiBzdHJpbmcsXG4gIHJlc291cmNlVXJsOiBzdHJpbmcsXG4gIGxhbmd1YWdlID0gXCJlblwiLFxuKTogTGF6eUV4dHJhY3RvciA9PiB7XG4gIGNvbnN0IHJlc291cmNlVXJsT2JqID0gbmV3IFVSTChyZXNvdXJjZVVybCk7XG4gIGdsb2JhbC5sYXp5UGFnZURhdGEgPSBnbG9iYWwubGF6eVBhZ2VEYXRhIHx8IHt9O1xuXG4gIHJldHVybiB7XG4gICAgYXV0aG9yOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5hdXRob3IgPSBleHRyYWN0b3IuYXV0aG9yKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5hdXRob3I7XG4gICAgfSxcbiAgICBjYW5vbmljYWxMaW5rOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5jYW5vbmljYWxMaW5rID0gZXh0cmFjdG9yLmNhbm9uaWNhbExpbmsoXG4gICAgICAgIGRvYyxcbiAgICAgICAgcmVzb3VyY2VVcmwsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuY2Fub25pY2FsTGluaztcbiAgICB9LFxuICAgIGNvcHlyaWdodDogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuY29weXJpZ2h0ID0gZXh0cmFjdG9yLmNvcHlyaWdodChkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuY29weXJpZ2h0O1xuICAgIH0sXG4gICAgZGF0ZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuZGF0ZSA9IGV4dHJhY3Rvci5kYXRlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5kYXRlO1xuICAgIH0sXG4gICAgZGVzY3JpcHRpb246ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLmRlc2NyaXB0aW9uID0gZXh0cmFjdG9yLmRlc2NyaXB0aW9uKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5kZXNjcmlwdGlvbjtcbiAgICB9LFxuICAgIGZhdmljb246ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLmZhdmljb24gPSBleHRyYWN0b3IuZmF2aWNvbihkb2MsIHJlc291cmNlVXJsT2JqKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmZhdmljb247XG4gICAgfSxcbiAgICBpbWFnZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEuaW1hZ2UgPSBleHRyYWN0b3IuaW1hZ2UoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmltYWdlO1xuICAgIH0sXG4gICAganNvbmxkOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5qc29ubGQgPSBleHRyYWN0b3IuanNvbmxkKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5qc29ubGQ7XG4gICAgfSxcbiAgICBrZXl3b3JkczogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEua2V5d29yZHMgPSBleHRyYWN0b3Iua2V5d29yZHMoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLmtleXdvcmRzO1xuICAgIH0sXG4gICAgbGFuZzogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEubGFuZyA9IGxhbmd1YWdlIHx8IGV4dHJhY3Rvci5sYW5nKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5sYW5nO1xuICAgIH0sXG4gICAgbG9jYWxlOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5sb2NhbGUgPSBleHRyYWN0b3IubG9jYWxlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5sb2NhbGU7XG4gICAgfSxcbiAgICBsaW5rcygpIHtcbiAgICAgIGxldCBkb2MgPSBnZXRQYXJzZWREb2NGb3JUZXh0LmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGNvbnN0IHRvcE5vZGUgPSBnZXRUb3BOb2RlLmNhbGwoZ2xvYmFsLCBkb2MsIHRoaXMubGFuZygpKTtcbiAgICAgIGRvYyA9IGNsZWFuZXIoZG9jKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEubGlua3MgPSBleHRyYWN0b3IubGlua3MoZG9jLCB0b3BOb2RlLCB0aGlzLmxhbmcoKSk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5saW5rcztcbiAgICB9LFxuICAgIG9yaWdpbjogKCkgPT4ge1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5vcmlnaW4gPSByZXNvdXJjZVVybE9iai5vcmlnaW47XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS5vcmlnaW47XG4gICAgfSxcbiAgICBwdWJsaXNoZXI6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnB1Ymxpc2hlciA9IGV4dHJhY3Rvci5wdWJsaXNoZXIoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnB1Ymxpc2hlcjtcbiAgICB9LFxuICAgIHNpdGVOYW1lOiAoKSA9PiB7XG4gICAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS5zaXRlTmFtZSA9IGV4dHJhY3Rvci5zaXRlTmFtZShkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEuc2l0ZU5hbWU7XG4gICAgfSxcbiAgICBzb2Z0VGl0bGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnNvZnRUaXRsZSA9IGV4dHJhY3Rvci5zb2Z0VGl0bGUoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnNvZnRUaXRsZTtcbiAgICB9LFxuICAgIHRhZ3M6ICgpID0+IHtcbiAgICAgIGNvbnN0IGRvYyA9IGdldFBhcnNlZERvYy5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBnbG9iYWwubGF6eVBhZ2VEYXRhLnRhZ3MgPSBleHRyYWN0b3IudGFncyhkb2MpO1xuICAgICAgcmV0dXJuIGdsb2JhbC5sYXp5UGFnZURhdGEudGFncztcbiAgICB9LFxuICAgIHRleHQoKSB7XG4gICAgICBsZXQgZG9jID0gZ2V0UGFyc2VkRG9jRm9yVGV4dC5jYWxsKGdsb2JhbCwgaHRtbCk7XG4gICAgICBkb2MgPSBjbGVhbmVyKGRvYyk7XG4gICAgICBjb25zdCB0b3BOb2RlID0gZ2V0VG9wTm9kZS5jYWxsKGdsb2JhbCwgZG9jLCB0aGlzLmxhbmcoKSk7XG4gICAgICBjb25zdCB0ZXh0RGF0YSA9IGV4dHJhY3Rvci50ZXh0KGRvYywgdG9wTm9kZSwgdGhpcy5sYW5nKCkpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS50ZXh0ID0gdGV4dERhdGE7XG4gICAgICByZXR1cm4gdGV4dERhdGE7XG4gICAgfSxcbiAgICB0aXRsZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEudGl0bGUgPSBleHRyYWN0b3IudGl0bGUoZG9jKTtcbiAgICAgIHJldHVybiBnbG9iYWwubGF6eVBhZ2VEYXRhLnRpdGxlO1xuICAgIH0sXG4gICAgdHlwZTogKCkgPT4ge1xuICAgICAgY29uc3QgZG9jID0gZ2V0UGFyc2VkRG9jLmNhbGwoZ2xvYmFsLCBodG1sKTtcbiAgICAgIGdsb2JhbC5sYXp5UGFnZURhdGEudHlwZSA9IGV4dHJhY3Rvci50eXBlKGRvYyk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS50eXBlO1xuICAgIH0sXG4gICAgdmlkZW9zKCkge1xuICAgICAgbGV0IGRvYyA9IGdldFBhcnNlZERvY0ZvclRleHQuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgICAgZG9jID0gY2xlYW5lcihkb2MpO1xuICAgICAgY29uc3QgdG9wTm9kZSA9IGdldFRvcE5vZGUuY2FsbChnbG9iYWwsIGRvYywgdGhpcy5sYW5nKCkpO1xuICAgICAgZ2xvYmFsLmxhenlQYWdlRGF0YS52aWRlb3MgPSBleHRyYWN0b3IudmlkZW9zKGRvYywgdG9wTm9kZSk7XG4gICAgICByZXR1cm4gZ2xvYmFsLmxhenlQYWdlRGF0YS52aWRlb3M7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGVhbmVkRG9jKGh0bWw6IHN0cmluZyk6IGNoZWVyaW8uUm9vdCB7XG4gIGlmICghZ2xvYmFsLmNsZWFuZWREb2MpIHtcbiAgICBjb25zdCBkb2MgPSBnZXRQYXJzZWREb2MuY2FsbChnbG9iYWwsIGh0bWwpO1xuICAgIGdsb2JhbC5jbGVhbmVkRG9jID0gY2xlYW5lcihkb2MpO1xuICB9XG4gIHJldHVybiBnbG9iYWwuY2xlYW5lZERvYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcnNlZERvYyhodG1sOiBzdHJpbmcpOiBjaGVlcmlvLlJvb3Qge1xuICByZXR1cm4gKGdsb2JhbC5kb2MgPSBjaGVlcmlvLmxvYWQoaHRtbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyc2VkRG9jRm9yVGV4dChodG1sOiBzdHJpbmcpOiBjaGVlcmlvLlJvb3Qge1xuICByZXR1cm4gKGdsb2JhbC5kb2MgPSBjaGVlcmlvLmxvYWQoaHRtbCwgeyB4bWxNb2RlOiBmYWxzZSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3BOb2RlKGRvYzogY2hlZXJpby5Sb290LCBsYW5nOiBzdHJpbmcpOiBjaGVlcmlvLkNoZWVyaW8ge1xuICBnbG9iYWwudG9wTm9kZSA9IGV4dHJhY3Rvci5jYWxjdWxhdGVCZXN0Tm9kZShkb2MsIGxhbmcpO1xuICByZXR1cm4gZ2xvYmFsLnRvcE5vZGU7XG59XG4iXX0=