UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

95 lines 14.9 kB
import { __awaiter } from "tslib"; export class PdfDocumentPropertiesExtractor { constructor() { this.pdfDateStringRegex = new RegExp('^D:' + // Prefix (required) '(\\d{4})' + // Year (required) '(\\d{2})?' + // Month (optional) '(\\d{2})?' + // Day (optional) '(\\d{2})?' + // Hour (optional) '(\\d{2})?' + // Minute (optional) '(\\d{2})?' + // Second (optional) '([Z|+|-])?' + // Universal time relation (optional) '(\\d{2})?' + // Offset hour (optional) // tslint:disable-next-line: quotemark "'?" + // Splitting apostrophe (optional) '(\\d{2})?' + // Offset minute (optional) // tslint:disable-next-line: quotemark "'?" // Trailing apostrophe (optional) ); } getDocumentProperties() { return __awaiter(this, void 0, void 0, function* () { const PDFViewerApplication = window .PDFViewerApplication; const pdfDocument = PDFViewerApplication.pdfDocument; const result = {}; return pdfDocument .getMetadata() .then(({ info, metadata, contentDispositionFilename }) => { result.author = info.Author; result.creationDate = this.toDateObject(info.CreationDate); result.creator = info.Creator; result.keywords = info.Keywords; result.linearized = info.IsLinearized; result.modificationDate = this.toDateObject(info.ModDate); result.pdfFormatVersion = info.PDFFormatVersion; result.producer = info.Producer; result.subject = info.Subject; result.title = info.Title; if (contentDispositionFilename) { result.fileName = contentDispositionFilename; } return pdfDocument.getDownloadInfo(); }) .then(({ length }) => { result.maybeFileSize = length; return result; }); }); } /** shamelessly copied from pdf.js */ toDateObject(input) { // if (!input || typeof input !== "string")) { // return null; // } // Optional fields that don't satisfy the requirements from the regular // expression (such as incorrect digit counts or numbers that are out of // range) will fall back the defaults from the specification. const matches = this.pdfDateStringRegex.exec(input); if (!matches) { return null; } // JavaScript's `Date` object expects the month to be between 0 and 11 // instead of 1 and 12, so we have to correct for that. const year = parseInt(matches[1], 10); let month = parseInt(matches[2], 10); month = month >= 1 && month <= 12 ? month - 1 : 0; let day = parseInt(matches[3], 10); day = day >= 1 && day <= 31 ? day : 1; let hour = parseInt(matches[4], 10); hour = hour >= 0 && hour <= 23 ? hour : 0; let minute = parseInt(matches[5], 10); minute = minute >= 0 && minute <= 59 ? minute : 0; let second = parseInt(matches[6], 10); second = second >= 0 && second <= 59 ? second : 0; const universalTimeRelation = matches[7] || 'Z'; let offsetHour = parseInt(matches[8], 10); offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; let offsetMinute = parseInt(matches[9], 10) || 0; offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; // Universal time relation 'Z' means that the local time is equal to the // universal time, whereas the relations '+'/'-' indicate that the local // time is later respectively earlier than the universal time. Every date // is normalized to universal time. if (universalTimeRelation === '-') { hour += offsetHour; minute += offsetMinute; } else if (universalTimeRelation === '+') { hour -= offsetHour; minute -= offsetMinute; } return new Date(Date.UTC(year, month, day, hour, minute, second)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRvY3VtZW50LXByb3BlcnRpZXMtZXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZG9jdW1lbnQtcHJvcGVydGllcy1leHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWlCQSxNQUFNLE9BQU8sOEJBQThCO0lBQTNDO1FBQ1UsdUJBQWtCLEdBQUcsSUFBSSxNQUFNLENBQ3JDLEtBQUssR0FBRyxvQkFBb0I7WUFDMUIsVUFBVSxHQUFHLGtCQUFrQjtZQUMvQixXQUFXLEdBQUcsbUJBQW1CO1lBQ2pDLFdBQVcsR0FBRyxpQkFBaUI7WUFDL0IsV0FBVyxHQUFHLGtCQUFrQjtZQUNoQyxXQUFXLEdBQUcsb0JBQW9CO1lBQ2xDLFdBQVcsR0FBRyxvQkFBb0I7WUFDbEMsWUFBWSxHQUFHLHFDQUFxQztZQUNwRCxXQUFXLEdBQUcseUJBQXlCO1lBQ3ZDLHNDQUFzQztZQUN0QyxJQUFJLEdBQUcsa0NBQWtDO1lBQ3pDLFdBQVcsR0FBRywyQkFBMkI7WUFDekMsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxpQ0FBaUM7U0FDekMsQ0FBQztJQW1GSixDQUFDO0lBakZjLHFCQUFxQjs7WUFDaEMsTUFBTSxvQkFBb0IsR0FBMkIsTUFBYztpQkFDaEUsb0JBQW9CLENBQUM7WUFDeEIsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDO1lBRXJELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztZQUN2QixPQUFPLFdBQVc7aUJBQ2YsV0FBVyxFQUFFO2lCQUNiLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSwwQkFBMEIsRUFBRSxFQUFFLEVBQUU7Z0JBQ3ZELE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNyQyxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUN6QyxJQUFJLENBQUMsT0FBTyxDQUNiLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDMUIsSUFBSSwwQkFBMEIsRUFBRTtvQkFDOUIsTUFBTSxDQUFDLFFBQVEsR0FBRywwQkFBMEIsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkMsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtnQkFDbkIsTUFBTSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztLQUFBO0lBRUQscUNBQXFDO0lBQzdCLFlBQVksQ0FBQyxLQUFtQjtRQUN0QywrQ0FBK0M7UUFDL0MsZ0JBQWdCO1FBQ2hCLEtBQUs7UUFFTCx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsc0VBQXNFO1FBQ3RFLHVEQUF1RDtRQUN2RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsS0FBSyxHQUFHLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ2hELElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxDQUFDLElBQUksVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsbUNBQW1DO1FBQ25DLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ2pDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjthQUFNLElBQUkscUJBQXFCLEtBQUssR0FBRyxFQUFFO1lBQ3hDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztTQUN4QjtRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBERlZpZXdlckFwcGxpY2F0aW9uIH0gZnJvbSAnLi9vcHRpb25zL3BkZi12aWV3ZXItYXBwbGljYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkZkRvY3VtZW50SW5mbyB7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgY3JlYXRpb25EYXRlPzogRGF0ZTtcbiAgY3JlYXRvcj86IHN0cmluZztcblxuICBrZXl3b3Jkcz86IHN0cmluZztcbiAgbGluZWFyaXplZD86IGJvb2xlYW47XG4gIG1heWJlRmlsZVNpemU/OiBzdHJpbmc7XG4gIG1vZGlmaWNhdGlvbkRhdGU/OiBEYXRlO1xuICBwZGZGb3JtYXRWZXJzaW9uPzogc3RyaW5nO1xuICBwcm9kdWNlcj86IHN0cmluZztcbiAgc3ViamVjdD86IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBQZGZEb2N1bWVudFByb3BlcnRpZXNFeHRyYWN0b3Ige1xuICBwcml2YXRlIHBkZkRhdGVTdHJpbmdSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgJ15EOicgKyAvLyBQcmVmaXggKHJlcXVpcmVkKVxuICAgICAgJyhcXFxcZHs0fSknICsgLy8gWWVhciAocmVxdWlyZWQpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTW9udGggKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIERheSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gSG91ciAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gTWludXRlIChvcHRpb25hbClcbiAgICAgICcoXFxcXGR7Mn0pPycgKyAvLyBTZWNvbmQgKG9wdGlvbmFsKVxuICAgICAgJyhbWnwrfC1dKT8nICsgLy8gVW5pdmVyc2FsIHRpbWUgcmVsYXRpb24gKG9wdGlvbmFsKVxuICAgICAgJyhcXFxcZHsyfSk/JyArIC8vIE9mZnNldCBob3VyIChvcHRpb25hbClcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogcXVvdGVtYXJrXG4gICAgICBcIic/XCIgKyAvLyBTcGxpdHRpbmcgYXBvc3Ryb3BoZSAob3B0aW9uYWwpXG4gICAgICAnKFxcXFxkezJ9KT8nICsgLy8gT2Zmc2V0IG1pbnV0ZSAob3B0aW9uYWwpXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuICAgICAgXCInP1wiIC8vIFRyYWlsaW5nIGFwb3N0cm9waGUgKG9wdGlvbmFsKVxuICApO1xuXG4gIHB1YmxpYyBhc3luYyBnZXREb2N1bWVudFByb3BlcnRpZXMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBQREZWaWV3ZXJBcHBsaWNhdGlvbjogSVBERlZpZXdlckFwcGxpY2F0aW9uID0gKHdpbmRvdyBhcyBhbnkpXG4gICAgICAuUERGVmlld2VyQXBwbGljYXRpb247XG4gICAgY29uc3QgcGRmRG9jdW1lbnQgPSBQREZWaWV3ZXJBcHBsaWNhdGlvbi5wZGZEb2N1bWVudDtcblxuICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgcmV0dXJuIHBkZkRvY3VtZW50XG4gICAgICAuZ2V0TWV0YWRhdGEoKVxuICAgICAgLnRoZW4oKHsgaW5mbywgbWV0YWRhdGEsIGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lIH0pID0+IHtcbiAgICAgICAgcmVzdWx0LmF1dGhvciA9IGluZm8uQXV0aG9yO1xuICAgICAgICByZXN1bHQuY3JlYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoXG4gICAgICAgICAgaW5mby5DcmVhdGlvbkRhdGVcbiAgICAgICAgKTtcbiAgICAgICAgcmVzdWx0LmNyZWF0b3IgPSBpbmZvLkNyZWF0b3I7XG4gICAgICAgIHJlc3VsdC5rZXl3b3JkcyA9IGluZm8uS2V5d29yZHM7XG4gICAgICAgIHJlc3VsdC5saW5lYXJpemVkID0gaW5mby5Jc0xpbmVhcml6ZWQ7XG4gICAgICAgIHJlc3VsdC5tb2RpZmljYXRpb25EYXRlID0gdGhpcy50b0RhdGVPYmplY3QoXG4gICAgICAgICAgaW5mby5Nb2REYXRlXG4gICAgICAgICk7XG4gICAgICAgIHJlc3VsdC5wZGZGb3JtYXRWZXJzaW9uID0gaW5mby5QREZGb3JtYXRWZXJzaW9uO1xuICAgICAgICByZXN1bHQucHJvZHVjZXIgPSBpbmZvLlByb2R1Y2VyO1xuICAgICAgcmVzdWx0LnN1YmplY3QgPSBpbmZvLlN1YmplY3Q7XG4gICAgICAgIHJlc3VsdC50aXRsZSA9IGluZm8uVGl0bGU7XG4gICAgICAgIGlmIChjb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSkge1xuICAgICAgICAgIHJlc3VsdC5maWxlTmFtZSA9IGNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwZGZEb2N1bWVudC5nZXREb3dubG9hZEluZm8oKTtcbiAgICAgIH0pXG4gICAgICAudGhlbigoeyBsZW5ndGggfSkgPT4ge1xuICAgICAgICByZXN1bHQubWF5YmVGaWxlU2l6ZSA9IGxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqIHNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIHBkZi5qcyAqL1xuICBwcml2YXRlIHRvRGF0ZU9iamVjdChpbnB1dDogc3RyaW5nIHwgYW55KTogRGF0ZSB8IG51bGwge1xuICAgIC8vIGlmICghaW5wdXQgfHwgIHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIikpIHtcbiAgICAvLyAgcmV0dXJuIG51bGw7XG4gICAgLy8gIH1cblxuICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBmcm9tIHRoZSByZWd1bGFyXG4gICAgLy8gZXhwcmVzc2lvbiAoc3VjaCBhcyBpbmNvcnJlY3QgZGlnaXQgY291bnRzIG9yIG51bWJlcnMgdGhhdCBhcmUgb3V0IG9mXG4gICAgLy8gcmFuZ2UpIHdpbGwgZmFsbCBiYWNrIHRoZSBkZWZhdWx0cyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLlxuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLnBkZkRhdGVTdHJpbmdSZWdleC5leGVjKGlucHV0KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEphdmFTY3JpcHQncyBgRGF0ZWAgb2JqZWN0IGV4cGVjdHMgdGhlIG1vbnRoIHRvIGJlIGJldHdlZW4gMCBhbmQgMTFcbiAgICAvLyBpbnN0ZWFkIG9mIDEgYW5kIDEyLCBzbyB3ZSBoYXZlIHRvIGNvcnJlY3QgZm9yIHRoYXQuXG4gICAgY29uc3QgeWVhciA9IHBhcnNlSW50KG1hdGNoZXNbMV0sIDEwKTtcbiAgICBsZXQgbW9udGggPSBwYXJzZUludChtYXRjaGVzWzJdLCAxMCk7XG4gICAgbW9udGggPSBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyID8gbW9udGggLSAxIDogMDtcbiAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hlc1szXSwgMTApO1xuICAgIGRheSA9IGRheSA+PSAxICYmIGRheSA8PSAzMSA/IGRheSA6IDE7XG4gICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaGVzWzRdLCAxMCk7XG4gICAgaG91ciA9IGhvdXIgPj0gMCAmJiBob3VyIDw9IDIzID8gaG91ciA6IDA7XG4gICAgbGV0IG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoZXNbNV0sIDEwKTtcbiAgICBtaW51dGUgPSBtaW51dGUgPj0gMCAmJiBtaW51dGUgPD0gNTkgPyBtaW51dGUgOiAwO1xuICAgIGxldCBzZWNvbmQgPSBwYXJzZUludChtYXRjaGVzWzZdLCAxMCk7XG4gICAgc2Vjb25kID0gc2Vjb25kID49IDAgJiYgc2Vjb25kIDw9IDU5ID8gc2Vjb25kIDogMDtcbiAgICBjb25zdCB1bml2ZXJzYWxUaW1lUmVsYXRpb24gPSBtYXRjaGVzWzddIHx8ICdaJztcbiAgICBsZXQgb2Zmc2V0SG91ciA9IHBhcnNlSW50KG1hdGNoZXNbOF0sIDEwKTtcbiAgICBvZmZzZXRIb3VyID0gb2Zmc2V0SG91ciA+PSAwICYmIG9mZnNldEhvdXIgPD0gMjMgPyBvZmZzZXRIb3VyIDogMDtcbiAgICBsZXQgb2Zmc2V0TWludXRlID0gcGFyc2VJbnQobWF0Y2hlc1s5XSwgMTApIHx8IDA7XG4gICAgb2Zmc2V0TWludXRlID0gb2Zmc2V0TWludXRlID49IDAgJiYgb2Zmc2V0TWludXRlIDw9IDU5ID8gb2Zmc2V0TWludXRlIDogMDtcblxuICAgIC8vIFVuaXZlcnNhbCB0aW1lIHJlbGF0aW9uICdaJyBtZWFucyB0aGF0IHRoZSBsb2NhbCB0aW1lIGlzIGVxdWFsIHRvIHRoZVxuICAgIC8vIHVuaXZlcnNhbCB0aW1lLCB3aGVyZWFzIHRoZSByZWxhdGlvbnMgJysnLyctJyBpbmRpY2F0ZSB0aGF0IHRoZSBsb2NhbFxuICAgIC8vIHRpbWUgaXMgbGF0ZXIgcmVzcGVjdGl2ZWx5IGVhcmxpZXIgdGhhbiB0aGUgdW5pdmVyc2FsIHRpbWUuIEV2ZXJ5IGRhdGVcbiAgICAvLyBpcyBub3JtYWxpemVkIHRvIHVuaXZlcnNhbCB0aW1lLlxuICAgIGlmICh1bml2ZXJzYWxUaW1lUmVsYXRpb24gPT09ICctJykge1xuICAgICAgaG91ciArPSBvZmZzZXRIb3VyO1xuICAgICAgbWludXRlICs9IG9mZnNldE1pbnV0ZTtcbiAgICB9IGVsc2UgaWYgKHVuaXZlcnNhbFRpbWVSZWxhdGlvbiA9PT0gJysnKSB7XG4gICAgICBob3VyIC09IG9mZnNldEhvdXI7XG4gICAgICBtaW51dGUgLT0gb2Zmc2V0TWludXRlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkpO1xuICB9XG59XG4iXX0=