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.
147 lines • 21.5 kB
JavaScript
import { AnnotationMode } from './editor-annotations';
const _isIE11 = typeof window === 'undefined' ? false : !!globalThis.MSInputMethodContext && !!document.documentMode;
const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent);
const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined';
export const pdfjsVersion = '4.10.733';
export const pdfjsBleedingEdgeVersion = '5.3.729';
export function getVersionSuffix(folder) {
if (folder?.includes('bleeding-edge')) {
return pdfjsBleedingEdgeVersion;
}
return pdfjsVersion;
}
export function assetsUrl(url, postfixIfPathIsRelativ = '') {
if (url.includes('://')) {
// the assets folder is on an absolute path (like https://example.com/assets)
return url;
}
return `./${url + postfixIfPathIsRelativ}`;
}
function isTestEnvironment() {
return (typeof process !== 'undefined' &&
typeof process.env !== 'undefined' &&
(process.env.NODE_ENV === 'test' || process.env.JEST_WORKER_ID !== undefined || process.env.VITEST !== undefined));
}
export function getSafeCanvasSize() {
if (typeof window === 'undefined' || typeof document === 'undefined' || isTestEnvironment()) {
return 4096;
}
// Create a temporary WebGL context
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
let maxTextureSize;
if (gl instanceof WebGLRenderingContext) {
maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
}
else {
maxTextureSize = 4096;
}
// Get available device RAM (in MB)
function getAvailableMemoryMB() {
if ('deviceMemory' in navigator) {
return navigator.deviceMemory * 1024; // Convert GB to MB
}
if (window.performance && 'memory' in window.performance) {
return window.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome, Firefox, and Edgewindow.performance.memory.jsHeapSizeLimit / 1024 / 1024; // Only works on Chrome
}
return 4096; // Default to 4GB if unknown
}
const availableMemoryMB = getAvailableMemoryMB();
// Conservative formula: Scale by square root of available memory
let estimatedSafeSize = Math.floor(Math.sqrt((availableMemoryMB * 1024 * 1024) / 6));
// Apply platform-specific limits
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);
const isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent);
const isHighEndDesktop = availableMemoryMB > 12000; // Assume high-end desktops have >12GB RAM
if (isIOS) {
estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // iOS Safari memory limits
}
else if (isMobile) {
estimatedSafeSize = Math.min(estimatedSafeSize, 4096); // Most mobile devices
}
else if (isHighEndDesktop) {
estimatedSafeSize = Math.min(estimatedSafeSize, 8192); // Allow larger sizes for desktops
}
else {
estimatedSafeSize = Math.min(estimatedSafeSize, 6000); // Mid-range desktops
}
// Final limit based on GPU and estimated memory safety
const maxWidth = Math.min(maxTextureSize, estimatedSafeSize);
return maxWidth * maxWidth;
}
// sonar ignore next line
export const pdfDefaultOptions = {
needsES5: _isIE11 || isEdge || needsES5,
annotationEditorMode: 0,
annotationMode: AnnotationMode.ENABLE_FORMS,
defaultZoomDelay: 400,
cursorToolOnLoad: 0,
defaultUrl: '',
defaultZoomValue: '',
disableHistory: false,
disablePageLabels: false,
enablePermissions: false,
docBaseUrl: '',
enablePrintAutoRotate: true,
enableSignatureEditor: true,
externalLinkRel: 'noopener noreferrer nofollow',
externalLinkTarget: 0,
findController: undefined,
historyUpdateUrl: false,
ignoreDestinationZoom: false,
imageResourcesPath: './images/',
maxCanvasPixels: getSafeCanvasSize(),
forcePageColors: false,
pageColorsBackground: 'Canvas',
pageColorsForeground: 'CanvasText',
pdfBugEnabled: false,
printResolution: 150,
rangeChunkSize: 65536,
removePageBorders: false,
enableXfa: true,
fontExtraProperties: false,
sidebarViewOnLoad: -1,
scrollModeOnLoad: -1,
spreadModeOnLoad: -1,
textLayerMode: 1,
// viewerCssTheme: 0, // not supported by ngx-extended-pdf-viewer, use [theme] instead
viewOnLoad: 0,
cMapPacked: true,
cMapUrl: function () {
return `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/cmaps/`;
},
disableAutoFetch: false,
disableFontFace: false,
disableRange: false,
disableStream: true,
isEvalSupported: true,
isOffscreenCanvasSupported: true,
maxImageSize: -1,
pdfBug: false,
verbosity: 1,
workerPort: null,
assetsFolder: 'assets',
_internalFilenameSuffix: '.min',
sandboxBundleSrc: function () {
return pdfDefaultOptions.needsES5
? `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`
: `./pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`;
},
workerSrc: function () {
return pdfDefaultOptions.needsES5
? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`
: `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`;
},
standardFontDataUrl: () => `${assetsUrl(pdfDefaultOptions.assetsFolder, '/..')}/standard_fonts/`,
// options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js)
doubleTapZoomFactor: 'page-width',
doubleTapZoomsInHandMode: true,
doubleTapZoomsInTextSelectionMode: false,
doubleTapResetsZoomOnSecondDoubleTap: false,
enableScripting: true,
defaultCacheSize: 50,
passwordPrompt: undefined,
enableHWA: true,
positionPopupDialogsWithJavaScript: true,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWRlZmF1bHQtb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvb3B0aW9ucy9wZGYtZGVmYXVsdC1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFPLFVBQVcsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLENBQU8sUUFBUyxDQUFDLFlBQVksQ0FBQztBQUNuSSxNQUFNLE1BQU0sR0FBRyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUYsTUFBTSxRQUFRLEdBQUcsT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztBQUNsRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBYztJQUM3QyxJQUFJLE1BQU0sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDckMsT0FBTyx3QkFBd0IsQ0FBQztLQUNqQztJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO0lBQ2hFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2Qiw2RUFBNkU7UUFDN0UsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELE9BQU8sS0FBSyxHQUFHLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBSUQsU0FBUyxpQkFBaUI7SUFDeEIsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7UUFDOUIsT0FBUSxPQUFlLENBQUMsR0FBRyxLQUFLLFdBQVc7UUFDM0MsQ0FBRSxPQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUssT0FBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFLLE9BQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUM3SSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLGlCQUFpQixFQUFFLEVBQUU7UUFDM0YsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELG1DQUFtQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2pGLElBQUksY0FBYyxDQUFDO0lBQ25CLElBQUksRUFBRSxZQUFZLHFCQUFxQixFQUFFO1FBQ3ZDLGNBQWMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBQ3ZEO1NBQU07UUFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDO0tBQ3ZCO0lBQ0QsbUNBQW1DO0lBQ25DLFNBQVMsb0JBQW9CO1FBQzNCLElBQUksY0FBYyxJQUFJLFNBQVMsRUFBRTtZQUMvQixPQUFRLFNBQVMsQ0FBQyxZQUF1QixHQUFHLElBQUksQ0FBQyxDQUFDLG1CQUFtQjtTQUN0RTtRQUNELElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUN4RCxPQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBYyxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsMEhBQTBIO1NBQ3BNO1FBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyw0QkFBNEI7SUFDM0MsQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUVqRCxpRUFBaUU7SUFDakUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRixpQ0FBaUM7SUFDakMsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQywwQ0FBMEM7SUFFOUYsSUFBSSxLQUFLLEVBQUU7UUFDVCxpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0tBQ25GO1NBQU0sSUFBSSxRQUFRLEVBQUU7UUFDbkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtLQUM5RTtTQUFNLElBQUksZ0JBQWdCLEVBQUU7UUFDM0IsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztLQUMxRjtTQUFNO1FBQ0wsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtLQUM3RTtJQUVELHVEQUF1RDtJQUN2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdELE9BQU8sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM3QixDQUFDO0FBRUQseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLFFBQVEsRUFBRSxPQUFPLElBQUksTUFBTSxJQUFJLFFBQVE7SUFDdkMsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixjQUFjLEVBQUUsY0FBYyxDQUFDLFlBQVk7SUFDM0MsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ25CLFVBQVUsRUFBRSxFQUFFO0lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQixjQUFjLEVBQUUsS0FBSztJQUNyQixpQkFBaUIsRUFBRSxLQUFLO0lBQ3hCLGlCQUFpQixFQUFFLEtBQUs7SUFDeEIsVUFBVSxFQUFFLEVBQUU7SUFDZCxxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLHFCQUFxQixFQUFFLElBQUk7SUFDM0IsZUFBZSxFQUFFLDhCQUE4QjtJQUMvQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIscUJBQXFCLEVBQUUsS0FBSztJQUM1QixrQkFBa0IsRUFBRSxXQUFXO0lBQy9CLGVBQWUsRUFBRSxpQkFBaUIsRUFBRTtJQUNwQyxlQUFlLEVBQUUsS0FBSztJQUN0QixvQkFBb0IsRUFBRSxRQUFRO0lBQzlCLG9CQUFvQixFQUFFLFlBQVk7SUFDbEMsYUFBYSxFQUFFLEtBQUs7SUFDcEIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsY0FBYyxFQUFFLEtBQUs7SUFDckIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixTQUFTLEVBQUUsSUFBSTtJQUNmLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQ3JCLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUNwQixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDcEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsc0ZBQXNGO0lBQ3RGLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLElBQUk7SUFDaEIsT0FBTyxFQUFFO1FBQ1AsT0FBTyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixlQUFlLEVBQUUsS0FBSztJQUN0QixZQUFZLEVBQUUsS0FBSztJQUNuQixhQUFhLEVBQUUsSUFBSTtJQUNuQixlQUFlLEVBQUUsSUFBSTtJQUNyQiwwQkFBMEIsRUFBRSxJQUFJO0lBQ2hDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDaEIsTUFBTSxFQUFFLEtBQUs7SUFDYixTQUFTLEVBQUUsQ0FBQztJQUNaLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxRQUFRO0lBQ3RCLHVCQUF1QixFQUFFLE1BQU07SUFDL0IsZ0JBQWdCLEVBQUU7UUFDaEIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRO1lBQy9CLENBQUMsQ0FBQyxpQkFBaUIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDLFVBQVU7WUFDeEYsQ0FBQyxDQUFDLGlCQUFpQixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyx1QkFBdUIsTUFBTSxDQUFDO0lBQ3JJLENBQUM7SUFDRCxTQUFTLEVBQUU7UUFDVCxPQUFPLGlCQUFpQixDQUFDLFFBQVE7WUFDL0IsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxlQUFlLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVO1lBQ2xJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsZUFBZSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsR0FDcEgsaUJBQWlCLENBQUMsdUJBQ3BCLE1BQU0sQ0FBQztJQUNiLENBQUM7SUFDRCxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtJQUVoRyxtRkFBbUY7SUFDbkYsbUJBQW1CLEVBQUUsWUFBWTtJQUNqQyx3QkFBd0IsRUFBRSxJQUFJO0lBQzlCLGlDQUFpQyxFQUFFLEtBQUs7SUFDeEMsb0NBQW9DLEVBQUUsS0FBSztJQUMzQyxlQUFlLEVBQUUsSUFBSTtJQUNyQixnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLFNBQVMsRUFBRSxJQUFJO0lBQ2Ysa0NBQWtDLEVBQUUsSUFBSTtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbk1vZGUgfSBmcm9tICcuL2VkaXRvci1hbm5vdGF0aW9ucyc7XG5cbmNvbnN0IF9pc0lFMTEgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogISEoPGFueT5nbG9iYWxUaGlzKS5NU0lucHV0TWV0aG9kQ29udGV4dCAmJiAhISg8YW55PmRvY3VtZW50KS5kb2N1bWVudE1vZGU7XG5jb25zdCBpc0VkZ2UgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAvRWRnZVxcL1xcZC4vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuY29uc3QgbmVlZHNFUzUgPSB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBQcm9taXNlWydhbGxTZXR0bGVkJ10gPT09ICd1bmRlZmluZWQnO1xuXG5leHBvcnQgY29uc3QgcGRmanNWZXJzaW9uID0gJzQuMTAuNzMzJztcbmV4cG9ydCBjb25zdCBwZGZqc0JsZWVkaW5nRWRnZVZlcnNpb24gPSAnNS4zLjcyOSc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVyc2lvblN1ZmZpeChmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChmb2xkZXI/LmluY2x1ZGVzKCdibGVlZGluZy1lZGdlJykpIHtcbiAgICByZXR1cm4gcGRmanNCbGVlZGluZ0VkZ2VWZXJzaW9uO1xuICB9XG4gIHJldHVybiBwZGZqc1ZlcnNpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NldHNVcmwodXJsOiBzdHJpbmcsIHBvc3RmaXhJZlBhdGhJc1JlbGF0aXYgPSAnJyk6IHN0cmluZyB7XG4gIGlmICh1cmwuaW5jbHVkZXMoJzovLycpKSB7XG4gICAgLy8gdGhlIGFzc2V0cyBmb2xkZXIgaXMgb24gYW4gYWJzb2x1dGUgcGF0aCAobGlrZSBodHRwczovL2V4YW1wbGUuY29tL2Fzc2V0cylcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIHJldHVybiBgLi8ke3VybCArIHBvc3RmaXhJZlBhdGhJc1JlbGF0aXZ9YDtcbn1cblxuZGVjbGFyZSBjb25zdCBwcm9jZXNzOiBhbnk7XG5cbmZ1bmN0aW9uIGlzVGVzdEVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiAocHJvY2VzcyBhcyBhbnkpLmVudiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAoKHByb2Nlc3MgYXMgYW55KS5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JyB8fCAocHJvY2VzcyBhcyBhbnkpLmVudi5KRVNUX1dPUktFUl9JRCAhPT0gdW5kZWZpbmVkIHx8IChwcm9jZXNzIGFzIGFueSkuZW52LlZJVEVTVCAhPT0gdW5kZWZpbmVkKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUNhbnZhc1NpemUoKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNUZXN0RW52aXJvbm1lbnQoKSkge1xuICAgIHJldHVybiA0MDk2O1xuICB9XG4gIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBXZWJHTCBjb250ZXh0XG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICBjb25zdCBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnKTtcbiAgbGV0IG1heFRleHR1cmVTaXplO1xuICBpZiAoZ2wgaW5zdGFuY2VvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgfSBlbHNlIHtcbiAgICBtYXhUZXh0dXJlU2l6ZSA9IDQwOTY7XG4gIH1cbiAgLy8gR2V0IGF2YWlsYWJsZSBkZXZpY2UgUkFNIChpbiBNQilcbiAgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlTWVtb3J5TUIoKTogbnVtYmVyIHtcbiAgICBpZiAoJ2RldmljZU1lbW9yeScgaW4gbmF2aWdhdG9yKSB7XG4gICAgICByZXR1cm4gKG5hdmlnYXRvci5kZXZpY2VNZW1vcnkgYXMgbnVtYmVyKSAqIDEwMjQ7IC8vIENvbnZlcnQgR0IgdG8gTUJcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZSAmJiAnbWVtb3J5JyBpbiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICAgIHJldHVybiAod2luZG93LnBlcmZvcm1hbmNlLm1lbW9yeSBhcyBhbnkpLmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZSwgRmlyZWZveCwgYW5kIEVkZ2V3aW5kb3cucGVyZm9ybWFuY2UubWVtb3J5LmpzSGVhcFNpemVMaW1pdCAvIDEwMjQgLyAxMDI0OyAvLyBPbmx5IHdvcmtzIG9uIENocm9tZVxuICAgIH1cbiAgICByZXR1cm4gNDA5NjsgLy8gRGVmYXVsdCB0byA0R0IgaWYgdW5rbm93blxuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlTWVtb3J5TUIgPSBnZXRBdmFpbGFibGVNZW1vcnlNQigpO1xuXG4gIC8vIENvbnNlcnZhdGl2ZSBmb3JtdWxhOiBTY2FsZSBieSBzcXVhcmUgcm9vdCBvZiBhdmFpbGFibGUgbWVtb3J5XG4gIGxldCBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KChhdmFpbGFibGVNZW1vcnlNQiAqIDEwMjQgKiAxMDI0KSAvIDYpKTtcblxuICAvLyBBcHBseSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW1pdHNcbiAgY29uc3QgaXNJT1MgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhKCdNU1N0cmVhbScgaW4gd2luZG93KTtcbiAgY29uc3QgaXNNb2JpbGUgPSAvQW5kcm9pZHxpUGhvbmV8aVBhZHxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBjb25zdCBpc0hpZ2hFbmREZXNrdG9wID0gYXZhaWxhYmxlTWVtb3J5TUIgPiAxMjAwMDsgLy8gQXNzdW1lIGhpZ2gtZW5kIGRlc2t0b3BzIGhhdmUgPjEyR0IgUkFNXG5cbiAgaWYgKGlzSU9TKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIGlPUyBTYWZhcmkgbWVtb3J5IGxpbWl0c1xuICB9IGVsc2UgaWYgKGlzTW9iaWxlKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgNDA5Nik7IC8vIE1vc3QgbW9iaWxlIGRldmljZXNcbiAgfSBlbHNlIGlmIChpc0hpZ2hFbmREZXNrdG9wKSB7XG4gICAgZXN0aW1hdGVkU2FmZVNpemUgPSBNYXRoLm1pbihlc3RpbWF0ZWRTYWZlU2l6ZSwgODE5Mik7IC8vIEFsbG93IGxhcmdlciBzaXplcyBmb3IgZGVza3RvcHNcbiAgfSBlbHNlIHtcbiAgICBlc3RpbWF0ZWRTYWZlU2l6ZSA9IE1hdGgubWluKGVzdGltYXRlZFNhZmVTaXplLCA2MDAwKTsgLy8gTWlkLXJhbmdlIGRlc2t0b3BzXG4gIH1cblxuICAvLyBGaW5hbCBsaW1pdCBiYXNlZCBvbiBHUFUgYW5kIGVzdGltYXRlZCBtZW1vcnkgc2FmZXR5XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5taW4obWF4VGV4dHVyZVNpemUsIGVzdGltYXRlZFNhZmVTaXplKTtcbiAgcmV0dXJuIG1heFdpZHRoICogbWF4V2lkdGg7XG59XG5cbi8vIHNvbmFyIGlnbm9yZSBuZXh0IGxpbmVcbmV4cG9ydCBjb25zdCBwZGZEZWZhdWx0T3B0aW9ucyA9IHtcbiAgbmVlZHNFUzU6IF9pc0lFMTEgfHwgaXNFZGdlIHx8IG5lZWRzRVM1LFxuICBhbm5vdGF0aW9uRWRpdG9yTW9kZTogMCxcbiAgYW5ub3RhdGlvbk1vZGU6IEFubm90YXRpb25Nb2RlLkVOQUJMRV9GT1JNUyxcbiAgZGVmYXVsdFpvb21EZWxheTogNDAwLCAvLyBtaWxsaXNlY29uZHNcbiAgY3Vyc29yVG9vbE9uTG9hZDogMCxcbiAgZGVmYXVsdFVybDogJycsXG4gIGRlZmF1bHRab29tVmFsdWU6ICcnLFxuICBkaXNhYmxlSGlzdG9yeTogZmFsc2UsXG4gIGRpc2FibGVQYWdlTGFiZWxzOiBmYWxzZSxcbiAgZW5hYmxlUGVybWlzc2lvbnM6IGZhbHNlLFxuICBkb2NCYXNlVXJsOiAnJyxcbiAgZW5hYmxlUHJpbnRBdXRvUm90YXRlOiB0cnVlLFxuICBlbmFibGVTaWduYXR1cmVFZGl0b3I6IHRydWUsXG4gIGV4dGVybmFsTGlua1JlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3cnLFxuICBleHRlcm5hbExpbmtUYXJnZXQ6IDAsXG4gIGZpbmRDb250cm9sbGVyOiB1bmRlZmluZWQsIC8vIG11c3QgZXh0ZW5kIFBERkZpbmRDb250cm9sbGVyXG4gIGhpc3RvcnlVcGRhdGVVcmw6IGZhbHNlLFxuICBpZ25vcmVEZXN0aW5hdGlvblpvb206IGZhbHNlLFxuICBpbWFnZVJlc291cmNlc1BhdGg6ICcuL2ltYWdlcy8nLFxuICBtYXhDYW52YXNQaXhlbHM6IGdldFNhZmVDYW52YXNTaXplKCksXG4gIGZvcmNlUGFnZUNvbG9yczogZmFsc2UsXG4gIHBhZ2VDb2xvcnNCYWNrZ3JvdW5kOiAnQ2FudmFzJyxcbiAgcGFnZUNvbG9yc0ZvcmVncm91bmQ6ICdDYW52YXNUZXh0JyxcbiAgcGRmQnVnRW5hYmxlZDogZmFsc2UsXG4gIHByaW50UmVzb2x1dGlvbjogMTUwLFxuICByYW5nZUNodW5rU2l6ZTogNjU1MzYsXG4gIHJlbW92ZVBhZ2VCb3JkZXJzOiBmYWxzZSxcbiAgZW5hYmxlWGZhOiB0cnVlLFxuICBmb250RXh0cmFQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgc2lkZWJhclZpZXdPbkxvYWQ6IC0xLFxuICBzY3JvbGxNb2RlT25Mb2FkOiAtMSxcbiAgc3ByZWFkTW9kZU9uTG9hZDogLTEsXG4gIHRleHRMYXllck1vZGU6IDEsXG4gIC8vIHZpZXdlckNzc1RoZW1lOiAwLCAvLyBub3Qgc3VwcG9ydGVkIGJ5IG5neC1leHRlbmRlZC1wZGYtdmlld2VyLCB1c2UgW3RoZW1lXSBpbnN0ZWFkXG4gIHZpZXdPbkxvYWQ6IDAsXG4gIGNNYXBQYWNrZWQ6IHRydWUsXG4gIGNNYXBVcmw6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYCR7YXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlciwgJy8uLicpfS9jbWFwcy9gO1xuICB9LFxuICBkaXNhYmxlQXV0b0ZldGNoOiBmYWxzZSxcbiAgZGlzYWJsZUZvbnRGYWNlOiBmYWxzZSxcbiAgZGlzYWJsZVJhbmdlOiBmYWxzZSxcbiAgZGlzYWJsZVN0cmVhbTogdHJ1ZSxcbiAgaXNFdmFsU3VwcG9ydGVkOiB0cnVlLFxuICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZDogdHJ1ZSxcbiAgbWF4SW1hZ2VTaXplOiAtMSxcbiAgcGRmQnVnOiBmYWxzZSxcbiAgdmVyYm9zaXR5OiAxLFxuICB3b3JrZXJQb3J0OiBudWxsLFxuICBhc3NldHNGb2xkZXI6ICdhc3NldHMnLFxuICBfaW50ZXJuYWxGaWxlbmFtZVN1ZmZpeDogJy5taW4nLCAvLyBkb24ndCBtb2RpZnkgdGhpcyAtIGl0J3MgYW4gaW50ZXJuYWwgZmllbGRcbiAgc2FuZGJveEJ1bmRsZVNyYzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwZGZEZWZhdWx0T3B0aW9ucy5uZWVkc0VTNVxuICAgICAgPyBgLi9wZGYuc2FuZGJveC0ke2dldFZlcnNpb25TdWZmaXgoYXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcikpfS1lczUubWpzYFxuICAgICAgOiBgLi9wZGYuc2FuZGJveC0ke2dldFZlcnNpb25TdWZmaXgoYXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcikpfSR7cGRmRGVmYXVsdE9wdGlvbnMuX2ludGVybmFsRmlsZW5hbWVTdWZmaXh9Lm1qc2A7XG4gIH0sXG4gIHdvcmtlclNyYzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwZGZEZWZhdWx0T3B0aW9ucy5uZWVkc0VTNVxuICAgICAgPyBgJHthc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKX0vcGRmLndvcmtlci0ke2dldFZlcnNpb25TdWZmaXgoYXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcikpfS1lczUubWpzYFxuICAgICAgOiBgJHthc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyKX0vcGRmLndvcmtlci0ke2dldFZlcnNpb25TdWZmaXgoYXNzZXRzVXJsKHBkZkRlZmF1bHRPcHRpb25zLmFzc2V0c0ZvbGRlcikpfSR7XG4gICAgICAgICAgcGRmRGVmYXVsdE9wdGlvbnMuX2ludGVybmFsRmlsZW5hbWVTdWZmaXhcbiAgICAgICAgfS5tanNgO1xuICB9LFxuICBzdGFuZGFyZEZvbnREYXRhVXJsOiAoKSA9PiBgJHthc3NldHNVcmwocGRmRGVmYXVsdE9wdGlvbnMuYXNzZXRzRm9sZGVyLCAnLy4uJyl9L3N0YW5kYXJkX2ZvbnRzL2AsXG5cbiAgLy8gb3B0aW9ucyBzcGVjaWZpYyB0byBuZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlciAoYXMgb3Bwb3NlZCB0byBiZWluZyB1c2VkIGJ5IHBkZi5qcylcbiAgZG91YmxlVGFwWm9vbUZhY3RvcjogJ3BhZ2Utd2lkdGgnLFxuICBkb3VibGVUYXBab29tc0luSGFuZE1vZGU6IHRydWUsXG4gIGRvdWJsZVRhcFpvb21zSW5UZXh0U2VsZWN0aW9uTW9kZTogZmFsc2UsXG4gIGRvdWJsZVRhcFJlc2V0c1pvb21PblNlY29uZERvdWJsZVRhcDogZmFsc2UsXG4gIGVuYWJsZVNjcmlwdGluZzogdHJ1ZSxcbiAgZGVmYXVsdENhY2hlU2l6ZTogNTAsXG4gIHBhc3N3b3JkUHJvbXB0OiB1bmRlZmluZWQsXG4gIGVuYWJsZUhXQTogdHJ1ZSwgLy8gZW5hYmxlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4gQWN0aXZlIHNpbmNlIHBkZi5qcyA0LjQuXG4gIHBvc2l0aW9uUG9wdXBEaWFsb2dzV2l0aEphdmFTY3JpcHQ6IHRydWUsXG59O1xuIl19