ngx-amplify
Version:
An angular library for integration AWS cloud services (cognito, s3)
321 lines • 25 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { AuthService } from './auth.service';
import { NGX_AMPLIFY_CONFIG } from '../common/interfaces/ngx-amplify.config';
import * as AWS from 'aws-sdk';
import * as S3 from 'aws-sdk/clients/s3';
import moment from 'moment';
import { CognitoException } from '../common/common.resource';
import * as i0 from "@angular/core";
import * as i1 from "../common/interfaces/ngx-amplify.config";
import * as i2 from "./auth.service";
export class StorageService {
/**
* @param {?} config
* @param {?} auth
*/
constructor(config, auth) {
this.config = config;
this.auth = auth;
if (!config.storage) {
throw new TypeError('NgxAmplify:Storage options are not found. Please refer to the README for usage.');
}
}
/**
* @private
* @return {?}
*/
get storage() {
AWS.config.update({
region: this.config.storage.bucketRegion
});
return new S3({
params: {
'Bucket': this.config.storage.bucketName,
},
region: this.config.storage.bucketRegion
});
}
/**
* @private
* @param {?} url
* @return {?}
*/
isExpired(url) {
/** @type {?} */
let result;
/** @type {?} */
let _url = new URL(url);
if (_url.search === '') {
result = true;
}
else {
/** @type {?} */
let param = _url.searchParams.get('Expires');
if (param) {
result = moment().isAfter(moment.unix(parseInt(param)));
}
else {
result = false;
}
}
return result;
}
/**
* @param {?} url
* @return {?}
*/
getFileByUrl(url) {
/** @type {?} */
let self = this;
/** @type {?} */
let baseUrl = `https://${self.config.storage.bucketName}.s3.amazonaws.com/`;
/** @type {?} */
let fileKey = url.replace(baseUrl, '');
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
try {
if (fileKey === '') {
resolve(url);
}
else if (self.isExpired(url)) {
self.storage.getSignedUrl('getObject', { Key: fileKey }, (/**
* @param {?} err
* @param {?} url
* @return {?}
*/
(err, url) => {
if (err) {
reject(self.handleError(err, 'getSignedUrl'));
}
else {
resolve(url);
}
}));
}
else {
resolve(url);
}
}
catch (error) {
reject(self.handleError(error, 'try/catch getSignedUrl'));
}
}));
}
/**
* @param {?} filename
* @param {?=} folder
* @return {?}
*/
getFile(filename, folder) {
/** @type {?} */
let self = this;
// File Access Level = "protected" - this prevents unautheticated access to the file.
/** @type {?} */
let directory = `${self.config.storage.folderLevel}/`;
if (folder) {
directory += `${folder}/`;
}
/** @type {?} */
let fileKey = `${directory}${filename}`;
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
try {
self.storage.getSignedUrl('getObject', { Key: fileKey }, (/**
* @param {?} err
* @param {?} url
* @return {?}
*/
(err, url) => {
if (err) {
reject(self.handleError(err, 'getSignedUrl'));
}
else {
// self.cognitoService.user.cognitoProfile.picture = url;
resolve(url);
}
}));
}
catch (error) {
reject(self.handleError(error, 'try/catch getSignedUrl'));
}
}));
}
/**
* @param {?} file
* @param {?} filename
* @param {?=} folder
* @param {?=} accessLevel
* @return {?}
*/
upload(file, filename, folder, accessLevel) {
/** @type {?} */
let self = this;
// self.config.folderLevel = "protected" - this prevents unautheticated access to the file.
/** @type {?} */
let directory = '';
if (accessLevel) {
directory = `${accessLevel}/`;
}
else {
directory = `${self.config.storage.defaultLevel}/`;
}
if (folder) {
directory += `${folder}/`;
}
filename = filename.toLowerCase().replace(/\s+/g, "-");
if (file.type === 'image/jpeg') {
filename += '.jpg';
}
if (file.type === 'image/png') {
filename += '.png';
}
if (file.type === 'image/tiff') {
filename += '.tiff';
}
/** @type {?} */
let fileKey = `${directory}${filename}`;
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
try {
self.storage.upload({
Bucket: self.config.storage.bucketName,
Key: fileKey,
ContentType: file.type,
ContentEncoding: 'base64',
Body: file,
StorageClass: 'STANDARD',
}, (/**
* @param {?} err
* @param {?} data
* @return {?}
*/
(err, data) => {
if (err) {
self.handleError(err, 'error during upload.');
reject(err);
}
else {
console.log('successful upload.');
resolve(data);
}
}));
}
catch (error) {
reject(self.handleError(error, 'try/catch upload'));
}
}));
}
/**
* @param {?=} directory
* @return {?}
*/
list(directory) {
/** @type {?} */
let self = this;
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
if (directory) {
// let directoryKey = encodeURIComponent(directory);
/** @type {?} */
let param = { Prefix: directory, Delimiter: '/', Bucket: self.config.storage.bucketName };
self.storage.listObjectsV2(param, (/**
* @param {?} err
* @param {?} data
* @return {?}
*/
(err, data) => {
if (err) {
reject(self.handleError(err, 'list'));
}
resolve(data);
}));
}
else {
self.storage.listObjectsV2((/**
* @param {?} err
* @param {?} data
* @return {?}
*/
(err, data) => {
if (err) {
reject(self.handleError(err, 'list'));
}
resolve(data);
}));
}
}));
}
/**
* @param {?} dataURI
* @param {?} type
* @return {?}
*/
static dataURItoBlob(dataURI, type) {
/** @type {?} */
let binary = atob(dataURI.split(',')[1]);
/** @type {?} */
let array = [];
for (let i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
/** @type {?} */
let blob = new Blob([new Uint8Array(array)], { type: type });
return blob;
}
/**
* @private
* @param {?} error
* @param {?} caller
* @return {?}
*/
handleError(error, caller) {
/** @type {?} */
let exception = new CognitoException(error);
console.error(`NgxAmplifyStorageSevice::handleError calledBy::${caller}`, exception);
return exception;
}
}
StorageService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
StorageService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [NGX_AMPLIFY_CONFIG,] }] },
{ type: AuthService }
];
/** @nocollapse */ StorageService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function StorageService_Factory() { return new StorageService(i0.ɵɵinject(i1.NGX_AMPLIFY_CONFIG), i0.ɵɵinject(i2.AuthService)); }, token: StorageService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
StorageService.prototype.config;
/**
* @type {?}
* @private
*/
StorageService.prototype.auth;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFtcGxpZnkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFxQixrQkFBa0IsRUFBbUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqSCxPQUFPLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQUs3RCxNQUFNLE9BQU8sY0FBYzs7Ozs7SUFFekIsWUFDc0MsTUFBd0IsRUFDcEQsSUFBaUI7UUFEVyxXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUNwRCxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxTQUFTLENBQUMsaUZBQWlGLENBQUMsQ0FBQztTQUN4RztJQUNILENBQUM7Ozs7O0lBRUQsSUFBWSxPQUFPO1FBQ2pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1NBQ3pDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVU7YUFDekM7WUFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFP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QUssQ0FBQztRQUM5RCxPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxNQUFNLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyRixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDOzs7WUE1TEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7OzRDQUlJLE1BQU0sU0FBQyxrQkFBa0I7WUFkckIsV0FBVzs7Ozs7Ozs7SUFjaEIsZ0NBQTREOzs7OztJQUM1RCw4QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgIE5neEFtcGxpZnlDb25maWcsIE5HWF9BTVBMSUZZX0NPTkZJRywgQWNjZXNzTGV2ZWxUeXBlIH0gZnJvbSAnLi4vY29tbW9uL2ludGVyZmFjZXMvbmd4LWFtcGxpZnkuY29uZmlnJztcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCAqIGFzIFMzIGZyb20gJ2F3cy1zZGsvY2xpZW50cy9zMyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJQ29nbml0b0V4Y2VwdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29nbml0b0V4Y2VwdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9jb21tb24ucmVzb3VyY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOR1hfQU1QTElGWV9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBOZ3hBbXBsaWZ5Q29uZmlnLFxuICAgIHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UpIHsgXG4gICAgaWYgKCFjb25maWcuc3RvcmFnZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTmd4QW1wbGlmeTpTdG9yYWdlIG9wdGlvbnMgYXJlIG5vdCBmb3VuZC4gUGxlYXNlIHJlZmVyIHRvIHRoZSBSRUFETUUgZm9yIHVzYWdlLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHN0b3JhZ2UoKSB7XG4gICAgQVdTLmNvbmZpZy51cGRhdGUoe1xuICAgICAgcmVnaW9uOiB0aGlzLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldFJlZ2lvblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTMyh7XG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgJ0J1Y2tldCc6IHRoaXMuY29uZmlnLnN0b3JhZ2UuYnVja2V0TmFtZSxcbiAgICAgIH0sXG4gICAgICByZWdpb246IHRoaXMuY29uZmlnLnN0b3JhZ2UuYnVja2V0UmVnaW9uXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzRXhwaXJlZCh1cmw6c3RyaW5nKSB7XG5cbiAgICBsZXQgcmVzdWx0OmJvb2xlYW47XG4gICAgbGV0IF91cmwgPSBuZXcgVVJMKHVybCk7XG5cbiAgICBpZiAoX3VybC5zZWFyY2ggPT09ICcnKXtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcGFyYW06IHN0cmluZyA9IF91cmwuc2VhcmNoUGFyYW1zLmdldCgnRXhwaXJlcycpO1xuICAgICAgICBpZiAocGFyYW0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG1vbWVudCgpLmlzQWZ0ZXIobW9tZW50LnVuaXgocGFyc2VJbnQocGFyYW0pKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbiAgZ2V0RmlsZUJ5VXJsKHVybDogc3RyaW5nKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBiYXNlVXJsID0gYGh0dHBzOi8vJHtzZWxmLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldE5hbWV9LnMzLmFtYXpvbmF3cy5jb20vYDtcbiAgICBsZXQgZmlsZUtleSA9IHVybC5yZXBsYWNlKGJhc2VVcmwsICcnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZmlsZUtleSA9PT0gJycpIHtcbiAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsZi5pc0V4cGlyZWQodXJsKSkge1xuICAgICAgICAgIHNlbGYuc3RvcmFnZS5nZXRTaWduZWRVcmwoJ2dldE9iamVjdCcsIHsgS2V5OiBmaWxlS2V5IH0sIChlcnIsIHVybCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICByZWplY3Qoc2VsZi5oYW5kbGVFcnJvcihlcnIsICdnZXRTaWduZWRVcmwnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh1cmwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3Qoc2VsZi5oYW5kbGVFcnJvcihlcnJvciwgJ3RyeS9jYXRjaCBnZXRTaWduZWRVcmwnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gRmlsZSBBY2Nlc3MgTGV2ZWwgPSBcInByb3RlY3RlZFwiIC0gdGhpcyBwcmV2ZW50cyB1bmF1dGhldGljYXRlZCBhY2Nlc3MgdG8gdGhlIGZpbGUuXG4gICAgbGV0IGRpcmVjdG9yeSA9IGAke3NlbGYuY29uZmlnLnN0b3JhZ2UuZm9sZGVyTGV2ZWx9L2A7XG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgZGlyZWN0b3J5ICs9IGAke2ZvbGRlcn0vYDtcbiAgICB9XG4gICAgbGV0IGZpbGVLZXkgPSBgJHtkaXJlY3Rvcnl9JHtmaWxlbmFtZX1gO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbGYuc3RvcmFnZS5nZXRTaWduZWRVcmwoJ2dldE9iamVjdCcsIHsgS2V5OiBmaWxlS2V5IH0sIChlcnIsIHVybCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVyciwgJ2dldFNpZ25lZFVybCcpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2VsZi5jb2duaXRvU2VydmljZS51c2VyLmNvZ25pdG9Qcm9maWxlLnBpY3R1cmUgPSB1cmw7XG4gICAgICAgICAgICByZXNvbHZlKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVycm9yLCAndHJ5L2NhdGNoIGdldFNpZ25lZFVybCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwbG9hZChmaWxlOiBCbG9iLCBmaWxlbmFtZTogc3RyaW5nLCBmb2xkZXI/OiBzdHJpbmcsIGFjY2Vzc0xldmVsPzpBY2Nlc3NMZXZlbFR5cGUpIHtcbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBzZWxmLmNvbmZpZy5mb2xkZXJMZXZlbCA9IFwicHJvdGVjdGVkXCIgLSB0aGlzIHByZXZlbnRzIHVuYXV0aGV0aWNhdGVkIGFjY2VzcyB0byB0aGUgZmlsZS5cbiAgICBsZXQgZGlyZWN0b3J5ID0gJyc7XG4gICAgaWYgKGFjY2Vzc0xldmVsKSB7XG4gICAgICBkaXJlY3RvcnkgPSBgJHthY2Nlc3NMZXZlbH0vYFxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSBgJHtzZWxmLmNvbmZpZy5zdG9yYWdlLmRlZmF1bHRMZXZlbH0vYDtcbiAgICB9XG4gICAgaWYgKGZvbGRlcikge1xuICAgICAgZGlyZWN0b3J5ICs9IGAke2ZvbGRlcn0vYDtcbiAgICB9XG5cbiAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIi1cIilcbiAgICBpZiAoZmlsZS50eXBlID09PSAnaW1hZ2UvanBlZycpIHtcbiAgICAgIGZpbGVuYW1lICs9ICcuanBnJztcbiAgICB9XG4gICAgaWYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL3BuZycpIHtcbiAgICAgIGZpbGVuYW1lICs9ICcucG5nJztcbiAgICB9XG4gICAgaWYgKGZpbGUudHlwZSA9PT0gJ2ltYWdlL3RpZmYnKSB7XG4gICAgICBmaWxlbmFtZSArPSAnLnRpZmYnO1xuICAgIH1cblxuICAgIGxldCBmaWxlS2V5ID0gYCR7ZGlyZWN0b3J5fSR7ZmlsZW5hbWV9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzZWxmLnN0b3JhZ2UudXBsb2FkKHtcbiAgICAgICAgICBCdWNrZXQ6IHNlbGYuY29uZmlnLnN0b3JhZ2UuYnVja2V0TmFtZSxcbiAgICAgICAgICBLZXk6IGZpbGVLZXksXG4gICAgICAgICAgQ29udGVudFR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICBDb250ZW50RW5jb2Rpbmc6ICdiYXNlNjQnLFxuICAgICAgICAgIEJvZHk6IGZpbGUsXG4gICAgICAgICAgU3RvcmFnZUNsYXNzOiAnU1RBTkRBUkQnLFxuICAgICAgICB9LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnIsICdlcnJvciBkdXJpbmcgdXBsb2FkLicpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzZnVsIHVwbG9hZC4nKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVycm9yLCAndHJ5L2NhdGNoIHVwbG9hZCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxpc3QoZGlyZWN0b3J5Pzogc3RyaW5nKSB7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChkaXJlY3RvcnkpIHtcbiAgICAgICAgLy8gbGV0IGRpcmVjdG9yeUtleSA9IGVuY29kZVVSSUNvbXBvbmVudChkaXJlY3RvcnkpO1xuICAgICAgICBsZXQgcGFyYW0gPSB7IFByZWZpeDogZGlyZWN0b3J5LCBEZWxpbWl0ZXI6ICcvJywgQnVja2V0OiBzZWxmLmNvbmZpZy5zdG9yYWdlLmJ1Y2tldE5hbWUgfTtcblxuICAgICAgICBzZWxmLnN0b3JhZ2UubGlzdE9iamVjdHNWMihwYXJhbSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChzZWxmLmhhbmRsZUVycm9yKGVyciwgJ2xpc3QnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnN0b3JhZ2UubGlzdE9iamVjdHNWMigoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KHNlbGYuaGFuZGxlRXJyb3IoZXJyLCAnbGlzdCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVVJJdG9CbG9iKGRhdGFVUkksIHR5cGU6c3RyaW5nKSB7XG4gICAgbGV0IGJpbmFyeSA9IGF0b2IoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcbiAgICBsZXQgYXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJheS5wdXNoKGJpbmFyeS5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gICAgbGV0IGJsb2IgPSBuZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXSwgeyB0eXBlOiB0eXBlIH0pO1xuICAgIHJldHVybiBibG9iO1xufVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSwgY2FsbGVyOiBzdHJpbmcpIHtcbiAgICBsZXQgZXhjZXB0aW9uOiBJQ29nbml0b0V4Y2VwdGlvbiA9IG5ldyBDb2duaXRvRXhjZXB0aW9uKGVycm9yKTtcbiAgICBjb25zb2xlLmVycm9yKGBOZ3hBbXBsaWZ5U3RvcmFnZVNldmljZTo6aGFuZGxlRXJyb3IgY2FsbGVkQnk6OiR7Y2FsbGVyfWAsIGV4Y2VwdGlvbik7XG4gICAgcmV0dXJuIGV4Y2VwdGlvbjtcbiAgfVxufVxuIl19