129 lines
19 KiB
Plaintext
129 lines
19 KiB
Plaintext
import { clamp, isString } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
|
|
import { BaseError } from "/_nuxt/lib/core/errors/base.ts";
|
|
import { BlobUploadStatus } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js";
|
|
|
|
import { reactive } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
export class BlobRetrievalError extends BaseError {
|
|
static defaultMessage = "An error occurred while trying to retrieve the blob";
|
|
}
|
|
export function isSuccessfullyUploaded(upload) {
|
|
return !!upload.result?.blobId;
|
|
}
|
|
export async function downloadBlobWithUrl(params) {
|
|
const { blobId, principal, apiOrigin } = params;
|
|
const dlUrl = new URL(`/api/stream/${principal.streamId}/blob/${blobId}`, apiOrigin);
|
|
const dlAnchor = document.createElement("a");
|
|
dlAnchor.href = dlUrl.toString();
|
|
dlAnchor.target = "_blank";
|
|
dlAnchor.rel = "noopener noreferrer";
|
|
dlAnchor.style.display = "none";
|
|
document.body.appendChild(dlAnchor);
|
|
dlAnchor.click();
|
|
dlAnchor.remove();
|
|
}
|
|
export async function getBlobUrl(params) {
|
|
const { blobId, principal, apiOrigin } = params;
|
|
const url = new URL(`/api/stream/${principal.streamId}/blob/${blobId}`, apiOrigin);
|
|
return url.toString();
|
|
}
|
|
export function uploadFile(params) {
|
|
const { file, principal, authToken, callback, apiOrigin } = params;
|
|
const cbWrapper = callback ? (files) => callback(Object.values(files)[0]) : void 0;
|
|
const results = uploadFiles({
|
|
files: [file],
|
|
principal,
|
|
authToken,
|
|
callback: cbWrapper,
|
|
apiOrigin
|
|
});
|
|
return Object.values(results)[0];
|
|
}
|
|
export function uploadFiles(params) {
|
|
const { files, principal, authToken, callback, apiOrigin } = params;
|
|
const formData = new FormData();
|
|
const uploadFiles2 = {};
|
|
for (const file of files) {
|
|
const hasError = file.error;
|
|
if (!hasError && !uploadFiles2[file.id]) {
|
|
formData.append(file.id, file.file);
|
|
}
|
|
uploadFiles2[file.id] = reactive({
|
|
...file,
|
|
result: void 0,
|
|
progress: 0
|
|
});
|
|
}
|
|
if (![...formData.keys()].length) return uploadFiles2;
|
|
const req = new XMLHttpRequest();
|
|
req.open("POST", new URL(`/api/stream/${principal.streamId}/blob`, apiOrigin));
|
|
req.responseType = "json";
|
|
if (authToken) {
|
|
req.setRequestHeader("Authorization", `Bearer ${authToken}`);
|
|
}
|
|
req.upload.addEventListener("progress", (e) => {
|
|
const newProgress = clamp(Math.floor(e.loaded / e.total * 100), 0, 100);
|
|
for (const resultItem of Object.values(uploadFiles2)) {
|
|
if (resultItem.error) continue;
|
|
resultItem.progress = newProgress;
|
|
}
|
|
});
|
|
const getErrorMessage = (fallbackMessage) => {
|
|
if (req.response?.error && isString(req.response.error)) {
|
|
return req.response.error;
|
|
}
|
|
if (req.status === 403) {
|
|
return "You do not have permissions to do this";
|
|
}
|
|
return fallbackMessage;
|
|
};
|
|
req.addEventListener("load", () => {
|
|
const uploadResults = req.response?.uploadResults || [];
|
|
for (const uploadFile2 of Object.values(uploadFiles2)) {
|
|
if (uploadFile2.error) continue;
|
|
uploadFile2.progress = 100;
|
|
uploadFile2.result = uploadResults.find((r) => r.formKey === uploadFile2.id) || {
|
|
uploadError: getErrorMessage("Unable to resolve upload results"),
|
|
uploadStatus: BlobUploadStatus.Error,
|
|
formKey: uploadFile2.id
|
|
};
|
|
}
|
|
if (callback) callback(uploadFiles2);
|
|
});
|
|
req.addEventListener("error", () => {
|
|
const uploadResults = req.response?.uploadResults || [];
|
|
for (const uploadFile2 of Object.values(uploadFiles2)) {
|
|
if (uploadFile2.error) continue;
|
|
uploadFile2.progress = 100;
|
|
uploadFile2.result = uploadResults.find((r) => r.formKey === uploadFile2.id) || {
|
|
uploadError: getErrorMessage("Upload request failed unexpectedly"),
|
|
uploadStatus: BlobUploadStatus.Error,
|
|
formKey: uploadFile2.id
|
|
};
|
|
}
|
|
if (callback) callback(uploadFiles2);
|
|
});
|
|
req.send(formData);
|
|
return uploadFiles2;
|
|
}
|
|
export class BlobDeleteFailedError extends BaseError {
|
|
static defaultMessage = "Unable to delete the file";
|
|
}
|
|
export async function deleteBlob(params) {
|
|
const { blobId, principal, authToken, apiOrigin } = params;
|
|
const { streamId } = principal;
|
|
const res = await fetch(
|
|
new URL(`/api/stream/${streamId}/blob/${blobId}`, apiOrigin),
|
|
{
|
|
method: "DELETE",
|
|
headers: {
|
|
...authToken ? { Authorization: `Bearer ${authToken}` } : {}
|
|
}
|
|
}
|
|
);
|
|
if (res.status !== 204) {
|
|
throw new BlobDeleteFailedError();
|
|
}
|
|
}
|
|
export { BlobUploadStatus };
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QkFBc0IsV0FBVyxRQUs5QjtBQUNELFFBQU0sRUFBRSxRQUFRLFdBQVcsV0FBVyxVQUFVLElBQUk7QUFDcEQsUUFBTSxFQUFFLFNBQVMsSUFBSTtBQUVyQixRQUFNLE1BQU0sTUFBTTtBQUFBLElBQ2hCLElBQUksSUFBSSxlQUFlLFFBQVEsU0FBUyxNQUFNLElBQUksU0FBUztBQUFBLElBQzNEO0FBQUEsTUFDRSxRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsUUFDUCxHQUFJLFlBQVksRUFBRSxlQUFlLFVBQVUsU0FBUyxHQUFHLElBQUksQ0FBQztBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLElBQUksV0FBVyxLQUFLO0FBQ3RCLFVBQU0sSUFBSSxzQkFBc0I7QUFBQSxFQUNsQztBQUNGO0FBRUEsU0FBUyIsIm5hbWVzIjpbInVwbG9hZEZpbGVzIiwidXBsb2FkRmlsZSJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJibG9iU3RvcmFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGFtcCwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gJ35+L2xpYi9jb3JlL2Vycm9ycy9iYXNlJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgVXBsb2FkYWJsZUZpbGVJdGVtLFxyXG4gIFVwbG9hZEZpbGVJdGVtXHJcbn0gZnJvbSAnfn4vbGliL2Zvcm0vY29tcG9zYWJsZXMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IHR5cGUgeyBPcHRpb25hbCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBNZXJnZSwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnXHJcbmltcG9ydCB7IEJsb2JVcGxvYWRTdGF0dXMgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYmxvYnMnXHJcbmltcG9ydCB0eXBlIHsgQmxvYlBvc3RSZXN1bHRJdGVtIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuXHJcbmV4cG9ydCB0eXBlIEJsb2JVcGxvYWRQcmluY2lwYWwgPSB7XHJcbiAgc3RyZWFtSWQ6IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTdWNjZXNzZnVsbHlVcGxvYWRlZEZpbGVJdGVtID0gTWVyZ2U8XHJcbiAgVXBsb2FkRmlsZUl0ZW0sXHJcbiAgeyByZXN1bHQ6IFNldFJlcXVpcmVkPEJsb2JQb3N0UmVzdWx0SXRlbSwgJ2Jsb2JJZCc+IH1cclxuPlxyXG5cclxuZXhwb3J0IGNsYXNzIEJsb2JSZXRyaWV2YWxFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XHJcbiAgc3RhdGljIG92ZXJyaWRlIGRlZmF1bHRNZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZXRyaWV2ZSB0aGUgYmxvYidcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bGx5VXBsb2FkZWQoXHJcbiAgdXBsb2FkOiBVcGxvYWRGaWxlSXRlbVxyXG4pOiB1cGxvYWQgaXMgU3VjY2Vzc2Z1bGx5VXBsb2FkZWRGaWxlSXRlbSB7XHJcbiAgcmV0dXJuICEhdXBsb2FkLnJlc3VsdD8uYmxvYklkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbml0aWF0ZSBhIGJyb3dzZXIgZmlsZSBkb3dubG9hZCBvZiB0aGUgc3BlY2lmaWVkIGJsb2JcclxuICogQHBhcmFtIGJsb2JJZFxyXG4gKiBAcGFyYW0gZmlsZU5hbWUgRG93bmxvYWQgZmlsZW5hbWVcclxuICogQHBhcmFtIHByaW5jaXBhbCBPd25lciBvZiB0aGUgYmxvYlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQmxvYldpdGhVcmwocGFyYW1zOiB7XHJcbiAgYmxvYklkOiBzdHJpbmdcclxuICBmaWxlTmFtZTogc3RyaW5nXHJcbiAgcHJpbmNpcGFsOiBCbG9iVXBsb2FkUHJpbmNpcGFsXHJcbiAgdG9rZW4/OiBzdHJpbmdcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuXHJcbiAgLy8gQ3JlYXRlIGFuY2hvciB3LyB0YXJnZXQgX2JsYW5rIGFuZCB0cmlnZ2VyIGNsaWNrIHRvIGRvd25sb2FkIHRoZSBmaWxlXHJcbiAgLy8gTm90IHVzaW5nIGZldGNoKCkgaGVyZSBjYXVzZSB0aGF0IHdvdWxkIGRvd25sb2FkIHRoZSBlbnRpcmUgZmlsZSBpbnRvIG1lbW9yeSBiZWZvcmUgZXZlbiBzaG93aW5nIHRoZSBicm93c2VyIGRvd25sb2FkIGRpYWxvZ1xyXG4gIGNvbnN0IGRsVXJsID0gbmV3IFVSTChgL2FwaS9zdHJlYW0vJHtwcmluY2lwYWwuc3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKVxyXG4gIGNvbnN0IGRsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgZGxBbmNob3IuaHJlZiA9IGRsVXJsLnRvU3RyaW5nKClcclxuICBkbEFuY2hvci50YXJnZXQgPSAnX2JsYW5rJ1xyXG4gIGRsQW5jaG9yLnJlbCA9ICdub29wZW5lciBub3JlZmVycmVyJ1xyXG4gIGRsQW5jaG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcclxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRsQW5jaG9yKVxyXG5cclxuICBkbEFuY2hvci5jbGljaygpXHJcbiAgZGxBbmNob3IucmVtb3ZlKClcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBzdHJpbmcgd2l0aCBhIFVSTCByZXByZXNlbnRpbmcgdGhlIGJsb2IuIFVzZSB0byBkaXNwbGF5IGltYWdlIHByZXZpZXdzLCBldGMuXHJcbiAqIEBwYXJhbSBibG9iSWRcclxuICogQHBhcmFtIGZpbGVOYW1lIERvd25sb2FkIGZpbGVuYW1lXHJcbiAqIEBwYXJhbSBwcmluY2lwYWwgT3duZXIgb2YgdGhlIGJsb2JcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCbG9iVXJsKHBhcmFtczoge1xyXG4gIGJsb2JJZDogc3RyaW5nXHJcbiAgcHJpbmNpcGFsOiBCbG9iVXBsb2FkUHJpbmNpcGFsXHJcbiAgdG9rZW4/OiBzdHJpbmdcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgdXJsID0gbmV3IFVSTChgL2FwaS9zdHJlYW0vJHtwcmluY2lwYWwuc3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKVxyXG4gIHJldHVybiB1cmwudG9TdHJpbmcoKVxyXG59XHJcblxyXG4vKipcclxuICogVXBsb2FkIGEgc2luZ2xlIGZpbGUgYW5kIHJldHVybiBhbiBVcGxvYWRGaWxlSXRlbVxyXG4gKiBAcGFyYW0gZmlsZSBGaWxlIGVtaXR0ZWQgZnJvbSBGaWxlVXBsb2FkWm9uZVxyXG4gKiBAcGFyYW0gcHJpbmNpcGFsIFdoYXQgZW50aXR5IHNob3VsZCB0aGUgZmlsZSBiZSBhdHRhY2hlZCB0byBvbiB0aGUgc2VydmVyXHJcbiAqIEByZXR1cm5zIEEgVnVlIE9ic2VydmFibGUgVXBsb2FkRmlsZUl0ZW0sIGl0J3MgcmVhY3RpdmUgc28geW91IGNhbiB3YXRjaCBpdCBldGMuIGluc2lkZVxyXG4gKiB5b3VyIFZ1ZSBjb21wb25lbnRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZShwYXJhbXM6IHtcclxuICBmaWxlOiBVcGxvYWRGaWxlSXRlbVxyXG4gIHByaW5jaXBhbDogQmxvYlVwbG9hZFByaW5jaXBhbFxyXG4gIGFwaU9yaWdpbjogc3RyaW5nXHJcbiAgYXV0aFRva2VuPzogc3RyaW5nXHJcbiAgY2FsbGJhY2s/OiAoZmlsZTogVXBsb2FkRmlsZUl0ZW0pID0+IHZvaWRcclxufSk6IFVwbG9hZEZpbGVJdGVtIHtcclxuICBjb25zdCB7IGZpbGUsIHByaW5jaXBhbCwgYXV0aFRva2VuLCBjYWxsYmFjaywgYXBpT3JpZ2luIH0gPSBwYXJhbXNcclxuICBjb25zdCBjYldyYXBwZXIgPSBjYWxsYmFja1xyXG4gICAgPyAoZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVwbG9hZEZpbGVJdGVtPikgPT4gY2FsbGJhY2soT2JqZWN0LnZhbHVlcyhmaWxlcylbMF0pXHJcbiAgICA6IHVuZGVmaW5lZFxyXG4gIGNvbnN0IHJlc3VsdHMgPSB1cGxvYWRGaWxlcyh7XHJcbiAgICBmaWxlczogW2ZpbGVdLFxyXG4gICAgcHJpbmNpcGFsLFxyXG4gICAgYXV0aFRva2VuLFxyXG4gICAgY2FsbGJhY2s6IGNiV3JhcHBlcixcclxuICAgIGFwaU9yaWdpblxyXG4gIH0pXHJcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0cylbMF1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUG9zdEJsb2JSZXNwb25zZSA9IHtcclxuICB1cGxvYWRSZXN1bHRzOiBCbG9iUG9zdFJlc3VsdEl0ZW1bXVxyXG59XHJcblxyXG4vKipcclxuICogVXBsb2FkIGZpbGVzIGFuZCByZXR1cm4gYW4gVXBsb2FkRmlsZUl0ZW0gZm9yIGVhY2ggZmlsZSAoa2V5ZWQgYnkgZmlsZSBJRClcclxuICogQHBhcmFtIGZpbGVzIEZpbGVzIGVtaXR0ZWQgZnJvbSBGaWxlVXBsb2FkWm9uZVxyXG4gKiBAcGFyYW0gcHJpbmNpcGFsIFdoYXQgZW50aXR5IHNob3VsZCB0aGUgZmlsZSBiZSBhdHRhY2hlZCB0byBvbiB0aGUgc2VydmVyXHJcbiAqIEByZXR1cm5zIEEgbWFwIG9mIFZ1ZSBvYnNlcnZhYmxlIFVwbG9hZEZpbGVJdGVtcyAodGhleSdyZSByZWFjdGl2ZSksIGtleWVkIGJ5XHJcbiAqIGZpbGUuaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRGaWxlcyhwYXJhbXM6IHtcclxuICBmaWxlczogVXBsb2FkYWJsZUZpbGVJdGVtW11cclxuICBwcmluY2lwYWw6IEJsb2JVcGxvYWRQcmluY2lwYWxcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZ1xyXG4gIGNhbGxiYWNrPzogKGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBVcGxvYWRGaWxlSXRlbT4pID0+IHZvaWRcclxufSk6IFJlY29yZDxzdHJpbmcsIFVwbG9hZEZpbGVJdGVtPiB7XHJcbiAgY29uc3QgeyBmaWxlcywgcHJpbmNpcGFsLCBhdXRoVG9rZW4sIGNhbGxiYWNrLCBhcGlPcmlnaW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcclxuICBjb25zdCB1cGxvYWRGaWxlczogUmVjb3JkPHN0cmluZywgVXBsb2FkRmlsZUl0ZW0+ID0ge31cclxuXHJcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAvLyBBY3R1YWxseSB1cGxvYWQgdGhlIGZpbGUgb25seSBpZiBpdCBkb2Vzbid0IGhhdmUgYW4gYXR0YWNoZWQgZXJyb3JcclxuICAgIC8vICYgaWYgaXQgaXNuJ3QgYWxyZWFkeSBhZGRlZFxyXG4gICAgY29uc3QgaGFzRXJyb3IgPSBmaWxlLmVycm9yXHJcbiAgICBpZiAoIWhhc0Vycm9yICYmICF1cGxvYWRGaWxlc1tmaWxlLmlkXSkge1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoZmlsZS5pZCwgZmlsZS5maWxlKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlYWN0aXZlIHNvIHRoYXQgd2hvZXZlciB1c2VzIHRoZSByZXN1bHQgc3RydWN0dXJlcyBjYW4gdHJhY2sgY2hhbmdlcyB0b1xyXG4gICAgLy8gdGhlbSB3L28gY2FsbGJhY2tzIChlLmcuIHByb2dyZXNzIGluY3JlYXNlKVxyXG4gICAgdXBsb2FkRmlsZXNbZmlsZS5pZF0gPSByZWFjdGl2ZSh7XHJcbiAgICAgIC4uLmZpbGUsXHJcbiAgICAgIHJlc3VsdDogdW5kZWZpbmVkLFxyXG4gICAgICBwcm9ncmVzczogMFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIE5vdGhpbmcgdG8gdXBsb2FkLCByZXR1cm5cclxuICBpZiAoIVsuLi5mb3JtRGF0YS5rZXlzKCldLmxlbmd0aCkgcmV0dXJuIHVwbG9hZEZpbGVzXHJcblxyXG4gIC8vIEluaXQgcmVxXHJcbiAgY29uc3QgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcclxuICByZXEub3BlbignUE9TVCcsIG5ldyBVUkwoYC9hcGkvc3RyZWFtLyR7cHJpbmNpcGFsLnN0cmVhbUlkfS9ibG9iYCwgYXBpT3JpZ2luKSlcclxuICByZXEucmVzcG9uc2VUeXBlID0gJ2pzb24nXHJcblxyXG4gIGlmIChhdXRoVG9rZW4pIHtcclxuICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke2F1dGhUb2tlbn1gKVxyXG4gIH1cclxuXHJcbiAgcmVxLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIChlKSA9PiB7XHJcbiAgICBjb25zdCBuZXdQcm9ncmVzcyA9IGNsYW1wKE1hdGguZmxvb3IoKGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDApLCAwLCAxMDApXHJcblxyXG4gICAgZm9yIChjb25zdCByZXN1bHRJdGVtIG9mIE9iamVjdC52YWx1ZXModXBsb2FkRmlsZXMpKSB7XHJcbiAgICAgIGlmIChyZXN1bHRJdGVtLmVycm9yKSBjb250aW51ZVxyXG5cclxuICAgICAgcmVzdWx0SXRlbS5wcm9ncmVzcyA9IG5ld1Byb2dyZXNzXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAocmVxLnJlc3BvbnNlPy5lcnJvciAmJiBpc1N0cmluZyhyZXEucmVzcG9uc2UuZXJyb3IpKSB7XHJcbiAgICAgIHJldHVybiByZXEucmVzcG9uc2UuZXJyb3JcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVxLnN0YXR1cyA9PT0gNDAzKSB7XHJcbiAgICAgIHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIHRoaXMnXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbGxiYWNrTWVzc2FnZVxyXG4gIH1cclxuXHJcbiAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XHJcbiAgICBjb25zdCB1cGxvYWRSZXN1bHRzID1cclxuICAgICAgKHJlcS5yZXNwb25zZSBhcyBPcHRpb25hbDxQb3N0QmxvYlJlc3BvbnNlPik/LnVwbG9hZFJlc3VsdHMgfHwgW11cclxuICAgIGZvciAoY29uc3QgdXBsb2FkRmlsZSBvZiBPYmplY3QudmFsdWVzKHVwbG9hZEZpbGVzKSkge1xyXG4gICAgICBpZiAodXBsb2FkRmlsZS5lcnJvcikgY29udGludWVcclxuXHJcbiAgICAgIHVwbG9hZEZpbGUucHJvZ3Jlc3MgPSAxMDBcclxuICAgICAgdXBsb2FkRmlsZS5yZXN1bHQgPSB1cGxvYWRSZXN1bHRzLmZpbmQoKHIpID0+IHIuZm9ybUtleSA9PT0gdXBsb2FkRmlsZS5pZCkgfHwge1xyXG4gICAgICAgIHVwbG9hZEVycm9yOiBnZXRFcnJvck1lc3NhZ2UoJ1VuYWJsZSB0byByZXNvbHZlIHVwbG9hZCByZXN1bHRzJyksXHJcbiAgICAgICAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzLkVycm9yLFxyXG4gICAgICAgIGZvcm1LZXk6IHVwbG9hZEZpbGUuaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sodXBsb2FkRmlsZXMpXHJcbiAgfSlcclxuXHJcbiAgcmVxLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgY29uc3QgdXBsb2FkUmVzdWx0cyA9XHJcbiAgICAgIChyZXEucmVzcG9uc2UgYXMgT3B0aW9uYWw8UG9zdEJsb2JSZXNwb25zZT4pPy51cGxvYWRSZXN1bHRzIHx8IFtdXHJcbiAgICBmb3IgKGNvbnN0IHVwbG9hZEZpbGUgb2YgT2JqZWN0LnZhbHVlcyh1cGxvYWRGaWxlcykpIHtcclxuICAgICAgaWYgKHVwbG9hZEZpbGUuZXJyb3IpIGNvbnRpbnVlXHJcblxyXG4gICAgICB1cGxvYWRGaWxlLnByb2dyZXNzID0gMTAwXHJcbiAgICAgIHVwbG9hZEZpbGUucmVzdWx0ID0gdXBsb2FkUmVzdWx0cy5maW5kKChyKSA9PiByLmZvcm1LZXkgPT09IHVwbG9hZEZpbGUuaWQpIHx8IHtcclxuICAgICAgICB1cGxvYWRFcnJvcjogZ2V0RXJyb3JNZXNzYWdlKCdVcGxvYWQgcmVxdWVzdCBmYWlsZWQgdW5leHBlY3RlZGx5JyksXHJcbiAgICAgICAgdXBsb2FkU3RhdHVzOiBCbG9iVXBsb2FkU3RhdHVzLkVycm9yLFxyXG4gICAgICAgIGZvcm1LZXk6IHVwbG9hZEZpbGUuaWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sodXBsb2FkRmlsZXMpXHJcbiAgfSlcclxuXHJcbiAgcmVxLnNlbmQoZm9ybURhdGEpXHJcblxyXG4gIHJldHVybiB1cGxvYWRGaWxlc1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQmxvYkRlbGV0ZUZhaWxlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcclxuICBzdGF0aWMgb3ZlcnJpZGUgZGVmYXVsdE1lc3NhZ2UgPSAnVW5hYmxlIHRvIGRlbGV0ZSB0aGUgZmlsZSdcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJsb2IocGFyYW1zOiB7XHJcbiAgYmxvYklkOiBzdHJpbmdcclxuICBwcmluY2lwYWw6IEJsb2JVcGxvYWRQcmluY2lwYWxcclxuICBhcGlPcmlnaW46IHN0cmluZ1xyXG4gIGF1dGhUb2tlbj86IHN0cmluZ1xyXG59KSB7XHJcbiAgY29uc3QgeyBibG9iSWQsIHByaW5jaXBhbCwgYXV0aFRva2VuLCBhcGlPcmlnaW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgc3RyZWFtSWQgfSA9IHByaW5jaXBhbFxyXG5cclxuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcclxuICAgIG5ldyBVUkwoYC9hcGkvc3RyZWFtLyR7c3RyZWFtSWR9L2Jsb2IvJHtibG9iSWR9YCwgYXBpT3JpZ2luKSxcclxuICAgIHtcclxuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIC4uLihhdXRoVG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YCB9IDoge30pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIGlmIChyZXMuc3RhdHVzICE9PSAyMDQpIHtcclxuICAgIHRocm93IG5ldyBCbG9iRGVsZXRlRmFpbGVkRXJyb3IoKVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IHsgQmxvYlVwbG9hZFN0YXR1cyB9XHJcbmV4cG9ydCB0eXBlIHsgQmxvYlBvc3RSZXN1bHRJdGVtIH1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi9jb3JlL2FwaS9ibG9iU3RvcmFnZS50cyJ9 |