@ngrx/effects
Version:
Side effect model for @ngrx/store
55 lines • 12.7 kB
JavaScript
import { defer, merge, Subject } from 'rxjs';
import { concatMap, dematerialize, filter, finalize, map, materialize, } from 'rxjs/operators';
/**
* Wraps project fn with error handling making it safe to use in Effects.
* Takes either a config with named properties that represent different possible
* callbacks or project/error callbacks that are required.
*/
export function act(
/** Allow to take either config object or project/error functions */
configOrProject, errorFn) {
const { project, error, complete, operator, unsubscribe } = typeof configOrProject === 'function'
? {
project: configOrProject,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
error: errorFn,
operator: concatMap,
complete: undefined,
unsubscribe: undefined,
}
: { ...configOrProject, operator: configOrProject.operator || concatMap };
return (source) => defer(() => {
const subject = new Subject();
return merge(source.pipe(operator((input, index) => defer(() => {
let completed = false;
let errored = false;
let projectedCount = 0;
return project(input, index).pipe(materialize(), map((notification) => {
switch (notification.kind) {
case 'E':
errored = true;
return {
kind: 'N',
value: error(notification.error, input),
};
case 'C':
completed = true;
return complete
? {
kind: 'N',
value: complete(projectedCount, input),
}
: undefined;
default:
++projectedCount;
return notification;
}
}), filter((n) => n != null), dematerialize(), finalize(() => {
if (!completed && !errored && unsubscribe) {
subject.next(unsubscribe(projectedCount, input));
}
}));
}))), subject);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9lZmZlY3RzL3NyYy9hY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQWdDLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFDSCxXQUFXLEdBQ1osTUFBTSxnQkFBZ0IsQ0FBQztBQWtFeEI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxHQUFHO0FBT2pCLG9FQUFvRTtBQUNwRSxlQVErRCxFQUMvRCxPQUFtRDtJQU1uRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUN2RCxPQUFPLGVBQWUsS0FBSyxVQUFVO1FBQ25DLENBQUMsQ0FBQztZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLG9FQUFvRTtZQUNwRSxLQUFLLEVBQUUsT0FBUTtZQUNmLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFdBQVcsRUFBRSxTQUFTO1NBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsR0FBRyxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7SUFPOUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2hCLEtBQUssQ0FBQyxHQUE2QixFQUFFO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO1FBQ2pELE9BQU8sS0FBSyxDQUNWLE1BQU0sQ0FBQyxJQUFJLENBQ1QsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3hCLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDVCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUMvQixXQUFXLEVBQUUsRUFDYixHQUFHLENBQ0QsQ0FDRSxZQUFZLEVBS0EsRUFBRTtnQkFDZCxRQUFRLFlBQVksQ0FBQyxJQUFJLEVBQUU7b0JBQ3pCLEtBQUssR0FBRzt3QkFDTixPQUFPLEdBQUcsSUFBSSxDQUFDO3dCQUNmLE9BQU87NEJBQ0wsSUFBSSxFQUFFLEdBQUc7NEJBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQzt5QkFDeEMsQ0FBQztvQkFDSixLQUFLLEdBQUc7d0JBQ04sU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFDakIsT0FBTyxRQUFROzRCQUNiLENBQUMsQ0FBQztnQ0FDRSxJQUFJLEVBQUUsR0FBRztnQ0FDVCxLQUFLLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUM7NkJBQ3ZDOzRCQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ2hCO3dCQUNFLEVBQUUsY0FBYyxDQUFDO3dCQUNqQixPQUFPLFlBQW9ELENBQUM7aUJBQy9EO1lBQ0gsQ0FBQyxDQUNGLEVBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUE4QixFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUNwRCxhQUFhLEVBQUUsRUFDZixRQUFRLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPLElBQUksV0FBVyxFQUFFO29CQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDbEQ7WUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FDRixFQUNELE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgZGVmZXIsIG1lcmdlLCBPYnNlcnZhYmxlLCBPcGVyYXRvckZ1bmN0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjb25jYXRNYXAsXG4gIGRlbWF0ZXJpYWxpemUsXG4gIGZpbHRlcixcbiAgZmluYWxpemUsXG4gIG1hcCxcbiAgbWF0ZXJpYWxpemUsXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGVOb3RpZmljYXRpb24gfSBmcm9tICcuL3V0aWxzJztcblxuLyoqIFJlcHJlc2VudHMgY29uZmlnIHdpdGggbmFtZWQgcGFyYW1ldGVycyBmb3IgYWN0ICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdENvbmZpZzxcbiAgSW5wdXQsXG4gIE91dHB1dEFjdGlvbiBleHRlbmRzIEFjdGlvbixcbiAgRXJyb3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24sXG4gIENvbXBsZXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uLFxuICBVbnN1YnNjcmliZUFjdGlvbiBleHRlbmRzIEFjdGlvblxuPiB7XG4gIC8vIFByb2plY3QgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0IGFjdGlvbnMgaW4gc3VjY2VzcyBjYXNlc1xuICBwcm9qZWN0OiAoaW5wdXQ6IElucHV0LCBpbmRleDogbnVtYmVyKSA9PiBPYnNlcnZhYmxlPE91dHB1dEFjdGlvbj47XG4gIC8vIEVycm9yIGhhbmRsZSBmdW5jdGlvbiBmb3IgcHJvamVjdFxuICAvLyBlcnJvciB0aGF0IGhhcHBlbmVkIGR1cmluZyBwcm9qZWN0IGV4ZWN1dGlvblxuICAvLyBpbnB1dCB2YWx1ZSB0aGF0IHByb2plY3QgZXJyb3JlZCB3aXRoXG4gIGVycm9yOiAoZXJyb3I6IGFueSwgaW5wdXQ6IElucHV0KSA9PiBFcnJvckFjdGlvbjtcbiAgLy8gT3B0aW9uYWwgY29tcGxldGUgYWN0aW9uIHByb3ZpZGVyXG4gIC8vIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwcm9qZWN0IGVtaXR0ZWQgYmVmb3JlIGNvbXBsZXRpb25cbiAgLy8gaW5wdXQgdmFsdWUgdGhhdCBwcm9qZWN0IGNvbXBsZXRlZCB3aXRoXG4gIGNvbXBsZXRlPzogKGNvdW50OiBudW1iZXIsIGlucHV0OiBJbnB1dCkgPT4gQ29tcGxldGVBY3Rpb247XG4gIC8vIE9wdGlvbmFsIGZsYXR0ZW5pbmcgb3BlcmF0b3JcbiAgb3BlcmF0b3I/OiA8SW5wdXQsIE91dHB1dEFjdGlvbj4oXG4gICAgcHJvamVjdDogKGlucHV0OiBJbnB1dCwgaW5kZXg6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxPdXRwdXRBY3Rpb24+XG4gICkgPT4gT3BlcmF0b3JGdW5jdGlvbjxJbnB1dCwgT3V0cHV0QWN0aW9uPjtcbiAgLy8gT3B0aW9uYWwgdW5zdWJzY3JpYmUgYWN0aW9uIHByb3ZpZGVyXG4gIC8vIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwcm9qZWN0IGVtaXR0ZWQgYmVmb3JlIHVuc3Vic2NyaWJpbmdcbiAgLy8gaW5wdXQgdmFsdWUgdGhhdCB3YXMgdW5zdWJzY3JpYmVkIGZyb21cbiAgdW5zdWJzY3JpYmU/OiAoY291bnQ6IG51bWJlciwgaW5wdXQ6IElucHV0KSA9PiBVbnN1YnNjcmliZUFjdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcGxhaW4gUnhKUyBvcGVyYXRvcnMgaW5zdGVhZC5cbiAqIEZvciBtb3JlIGluZm8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vbmdyeC9wbGF0Zm9ybS9pc3N1ZXMvNDA3MlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0PFxuICBJbnB1dCxcbiAgT3V0cHV0QWN0aW9uIGV4dGVuZHMgQWN0aW9uLFxuICBFcnJvckFjdGlvbiBleHRlbmRzIEFjdGlvblxuPihcbiAgcHJvamVjdDogKGlucHV0OiBJbnB1dCwgaW5kZXg6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxPdXRwdXRBY3Rpb24+LFxuICBlcnJvcjogKGVycm9yOiBhbnksIGlucHV0OiBJbnB1dCkgPT4gRXJyb3JBY3Rpb25cbik6IChzb3VyY2U6IE9ic2VydmFibGU8SW5wdXQ+KSA9PiBPYnNlcnZhYmxlPE91dHB1dEFjdGlvbiB8IEVycm9yQWN0aW9uPjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHBsYWluIFJ4SlMgb3BlcmF0b3JzIGluc3RlYWQuXG4gKiBGb3IgbW9yZSBpbmZvIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL25ncngvcGxhdGZvcm0vaXNzdWVzLzQwNzJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdDxcbiAgSW5wdXQsXG4gIE91dHB1dEFjdGlvbiBleHRlbmRzIEFjdGlvbixcbiAgRXJyb3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24sXG4gIENvbXBsZXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uID0gbmV2ZXIsXG4gIFVuc3Vic2NyaWJlQWN0aW9uIGV4dGVuZHMgQWN0aW9uID0gbmV2ZXJcbj4oXG4gIGNvbmZpZzogQWN0Q29uZmlnPFxuICAgIElucHV0LFxuICAgIE91dHB1dEFjdGlvbixcbiAgICBFcnJvckFjdGlvbixcbiAgICBDb21wbGV0ZUFjdGlvbixcbiAgICBVbnN1YnNjcmliZUFjdGlvblxuICA+XG4pOiAoXG4gIHNvdXJjZTogT2JzZXJ2YWJsZTxJbnB1dD5cbikgPT4gT2JzZXJ2YWJsZTxcbiAgT3V0cHV0QWN0aW9uIHwgRXJyb3JBY3Rpb24gfCBDb21wbGV0ZUFjdGlvbiB8IFVuc3Vic2NyaWJlQWN0aW9uXG4+O1xuLyoqXG4gKiBXcmFwcyBwcm9qZWN0IGZuIHdpdGggZXJyb3IgaGFuZGxpbmcgbWFraW5nIGl0IHNhZmUgdG8gdXNlIGluIEVmZmVjdHMuXG4gKiBUYWtlcyBlaXRoZXIgYSBjb25maWcgd2l0aCBuYW1lZCBwcm9wZXJ0aWVzIHRoYXQgcmVwcmVzZW50IGRpZmZlcmVudCBwb3NzaWJsZVxuICogY2FsbGJhY2tzIG9yIHByb2plY3QvZXJyb3IgY2FsbGJhY2tzIHRoYXQgYXJlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0PFxuICBJbnB1dCxcbiAgT3V0cHV0QWN0aW9uIGV4dGVuZHMgQWN0aW9uLFxuICBFcnJvckFjdGlvbiBleHRlbmRzIEFjdGlvbixcbiAgQ29tcGxldGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gPSBuZXZlcixcbiAgVW5zdWJzY3JpYmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gPSBuZXZlclxuPihcbiAgLyoqIEFsbG93IHRvIHRha2UgZWl0aGVyIGNvbmZpZyBvYmplY3Qgb3IgcHJvamVjdC9lcnJvciBmdW5jdGlvbnMgKi9cbiAgY29uZmlnT3JQcm9qZWN0OlxuICAgIHwgQWN0Q29uZmlnPFxuICAgICAgICBJbnB1dCxcbiAgICAgICAgT3V0cHV0QWN0aW9uLFxuICAgICAgICBFcnJvckFjdGlvbixcbiAgICAgICAgQ29tcGxldGVBY3Rpb24sXG4gICAgICAgIFVuc3Vic2NyaWJlQWN0aW9uXG4gICAgICA+XG4gICAgfCAoKGlucHV0OiBJbnB1dCwgaW5kZXg6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxPdXRwdXRBY3Rpb24+KSxcbiAgZXJyb3JGbj86IChlcnJvcjogYW55LCBpbnB1dDogSW5wdXQpID0+IEVycm9yQWN0aW9uXG4pOiAoXG4gIHNvdXJjZTogT2JzZXJ2YWJsZTxJbnB1dD5cbikgPT4gT2JzZXJ2YWJsZTxcbiAgT3V0cHV0QWN0aW9uIHwgRXJyb3JBY3Rpb24gfCBDb21wbGV0ZUFjdGlvbiB8IFVuc3Vic2NyaWJlQWN0aW9uXG4+IHtcbiAgY29uc3QgeyBwcm9qZWN0LCBlcnJvciwgY29tcGxldGUsIG9wZXJhdG9yLCB1bnN1YnNjcmliZSB9ID1cbiAgICB0eXBlb2YgY29uZmlnT3JQcm9qZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHtcbiAgICAgICAgICBwcm9qZWN0OiBjb25maWdPclByb2plY3QsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICBlcnJvcjogZXJyb3JGbiEsXG4gICAgICAgICAgb3BlcmF0b3I6IGNvbmNhdE1hcCxcbiAgICAgICAgICBjb21wbGV0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHVuc3Vic2NyaWJlOiB1bmRlZmluZWQsXG4gICAgICAgIH1cbiAgICAgIDogeyAuLi5jb25maWdPclByb2plY3QsIG9wZXJhdG9yOiBjb25maWdPclByb2plY3Qub3BlcmF0b3IgfHwgY29uY2F0TWFwIH07XG5cbiAgdHlwZSBSZXN1bHRBY3Rpb24gPVxuICAgIHwgT3V0cHV0QWN0aW9uXG4gICAgfCBFcnJvckFjdGlvblxuICAgIHwgQ29tcGxldGVBY3Rpb25cbiAgICB8IFVuc3Vic2NyaWJlQWN0aW9uO1xuICByZXR1cm4gKHNvdXJjZSkgPT5cbiAgICBkZWZlcigoKTogT2JzZXJ2YWJsZTxSZXN1bHRBY3Rpb24+ID0+IHtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBuZXcgU3ViamVjdDxVbnN1YnNjcmliZUFjdGlvbj4oKTtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgc291cmNlLnBpcGUoXG4gICAgICAgICAgb3BlcmF0b3IoKGlucHV0LCBpbmRleCkgPT5cbiAgICAgICAgICAgIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGNvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgZXJyb3JlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICBsZXQgcHJvamVjdGVkQ291bnQgPSAwO1xuICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdChpbnB1dCwgaW5kZXgpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUoKSxcbiAgICAgICAgICAgICAgICBtYXAoXG4gICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgKTpcbiAgICAgICAgICAgICAgICAgICAgfCBPYnNlcnZhYmxlTm90aWZpY2F0aW9uPFxuICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JBY3Rpb24gfCBDb21wbGV0ZUFjdGlvbiB8IE91dHB1dEFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdOJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVycm9yKG5vdGlmaWNhdGlvbi5lcnJvciwgaW5wdXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnTicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29tcGxldGUocHJvamVjdGVkQ291bnQsIGlucHV0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICArK3Byb2plY3RlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbiBhcyBPYnNlcnZhYmxlTm90aWZpY2F0aW9uPE91dHB1dEFjdGlvbj47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbHRlcigobik6IG4gaXMgTm9uTnVsbGFibGU8dHlwZW9mIG4+ID0+IG4gIT0gbnVsbCksXG4gICAgICAgICAgICAgICAgZGVtYXRlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY29tcGxldGVkICYmICFlcnJvcmVkICYmIHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3QubmV4dCh1bnN1YnNjcmliZShwcm9qZWN0ZWRDb3VudCwgaW5wdXQpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHN1YmplY3RcbiAgICAgICk7XG4gICAgfSk7XG59XG4iXX0=