@redux-multipurpose/core
Version:
## Installation Redux Multipurpose core is available as a package on NPM:
223 lines • 34.8 kB
JavaScript
import { Observable, BehaviorSubject } from 'rxjs';
import { map, distinctUntilChanged, switchMap } from 'rxjs/operators';
import { configureStore, createSelector, getDefaultMiddleware, combineReducers } from '@reduxjs/toolkit';
import { createEpicMiddleware } from 'redux-observable-es6-compat';
import createSagaMiddleware from 'redux-saga';
import { persistStore, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist';
import { createResponsiveStateReducer, responsiveStateReducer, responsiveStoreEnhancer, calculateResponsiveState } from 'redux-responsive';
import { createLogger } from 'redux-logger';
const genericSelector = (paths) => {
return createSelector([state => {
let nestedState = state;
for (let path of paths)
if (nestedState[path] != null && nestedState[path] != undefined)
nestedState = nestedState[path];
else {
nestedState = null;
break;
}
return nestedState;
}], items => items);
};
const ɵ0 = genericSelector;
const initializeWithDefaultMiddleware = (options) => {
return options ?
[...getDefaultMiddleware(options)] :
[...getDefaultMiddleware()];
};
const ɵ1 = initializeWithDefaultMiddleware;
//Store instance
var reduxStore;
var staticReducers = {};
var dynamicReducers = {};
var epics$;
export const initializeStore = (options) => {
if (reduxStore)
throw Error("A redux store is initialized yet. Cannot initialize another one");
const { reducers, devTools, middlewares, enhancers, preloadedState, defaultMiddlewareOptions, sagas, epics, enablePersistence, enableResponsiveness, router, logLevel } = options;
let enhancer = enhancers;
let middleware = [];
let sagaMiddleware;
let epicMiddleware;
let middlewareOptions = defaultMiddlewareOptions;
if (enablePersistence) {
if (!middlewareOptions)
middlewareOptions = {};
if (!middlewareOptions.serializableCheck || typeof middlewareOptions === 'boolean')
middlewareOptions.serializableCheck = {};
if (typeof middlewareOptions.serializableCheck === 'object') {
if (!middlewareOptions.serializableCheck.ignoredActions)
middlewareOptions.serializableCheck.ignoredActions = [];
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(FLUSH) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(FLUSH);
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(REHYDRATE) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(REHYDRATE);
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PAUSE) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(PAUSE);
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PERSIST) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(PERSIST);
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PURGE) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(PURGE);
if (middlewareOptions.serializableCheck.ignoredActions.indexOf(REGISTER) < 0)
middlewareOptions.serializableCheck.ignoredActions.push(REGISTER);
}
}
if (enableResponsiveness) {
if (!middlewareOptions)
middlewareOptions = {};
if (!middlewareOptions.serializableCheck || typeof middlewareOptions === 'boolean')
middlewareOptions.serializableCheck = {};
if (typeof middlewareOptions.serializableCheck === 'object') {
if (!middlewareOptions.serializableCheck.ignoredActions)
middlewareOptions.serializableCheck.ignoredActions = [];
if (middlewareOptions.serializableCheck.ignoredActions.indexOf("redux-responsive/CALCULATE_RESPONSIVE_STATE") < 0)
middlewareOptions.serializableCheck.ignoredActions.push("redux-responsive/CALCULATE_RESPONSIVE_STATE");
}
}
middleware = initializeWithDefaultMiddleware(middlewareOptions);
if (middleware)
middleware = [...middleware, ...middlewares];
if (epics) {
epicMiddleware = createEpicMiddleware();
middleware = [...middleware, epicMiddleware];
}
if (sagas) {
sagaMiddleware = createSagaMiddleware();
middleware = [...middleware, sagaMiddleware];
}
if (logLevel) {
const loggerMiddleware = createLogger({ level: logLevel });
middleware = [...middleware, loggerMiddleware];
}
if (enableResponsiveness) {
let browserReducer;
if (typeof enableResponsiveness === 'object' && enableResponsiveness.breakpoints)
browserReducer = createResponsiveStateReducer(enableResponsiveness.breakpoints, enableResponsiveness.options);
else
browserReducer = responsiveStateReducer;
if (!reducers['browser'])
reducers['browser'] = browserReducer;
else
throw ("A browser reducer already exists. Cannot enable redux-responsive module");
if (!enhancer)
enhancer = [responsiveStoreEnhancer];
else
enhancer = [...enhancer, responsiveStoreEnhancer];
}
staticReducers = reducers;
const newStore = configureStore({
reducer: combineReducers(reducers),
devTools,
preloadedState,
middleware,
enhancers: enhancer
});
epics$ = new BehaviorSubject(epics);
const hotReloadingEpics = (action$, state$, dependencies) => epics$.pipe(switchMap((epic) => epic(action$, state$, dependencies)));
//Executing epics
if (epicMiddleware)
epicMiddleware.run(hotReloadingEpics);
//Executing sagas
if (sagaMiddleware)
sagaMiddleware.run(sagas);
if (enablePersistence)
persistStore(newStore);
//Finally save store instance
reduxStore = newStore;
if (router) {
store.addReducer(router.key, router.reducer);
router.service.init();
}
if (enableResponsiveness)
window.addEventListener('resize', () => store.dispatch(calculateResponsiveState(window)));
};
const ɵ2 = () => {
return new Observable(function (observer) {
observer.next(reduxStore.getState());
const unsubscribe = reduxStore.subscribe(function () {
observer.next(reduxStore.getState());
});
return unsubscribe;
});
}, ɵ3 = () => {
return reduxStore.getState();
}, ɵ4 = (selector) => {
return new Observable(subscriber => {
const state$ = store.getState$();
const unsubscribe = state$.pipe(map(state => selector(state)), distinctUntilChanged()).subscribe(data => subscriber.next(data));
return unsubscribe;
});
}, ɵ5 = (selector) => {
return selector(reduxStore.getState());
}, ɵ6 = (action) => {
reduxStore.dispatch(action);
}, ɵ7 = (key, reducer) => {
if (!key || dynamicReducers[key])
throw (`A reducer with key '${key}' is already injected. Injection aborted`);
dynamicReducers[key] = reducer;
reduxStore.replaceReducer(combineReducers(Object.assign(Object.assign({}, staticReducers), dynamicReducers)));
}, ɵ8 = (key) => {
if (!key || !dynamicReducers[key])
throw (`No reducer with key '${key}' found. Remove aborted`);
delete dynamicReducers[key];
reduxStore.replaceReducer(combineReducers(Object.assign(Object.assign({}, staticReducers), dynamicReducers)));
}, ɵ9 = (newRootEpic) => {
epics$.next(newRootEpic);
};
export const store = {
getState$: ɵ2,
getState: ɵ3,
select: ɵ4,
selectSync: ɵ5,
dispatch: ɵ6,
addReducer: ɵ7,
removeReducer: ɵ8,
replaceEpics: ɵ9
};
export const select = (selector) => {
if (selector)
return (target, key) => {
Object.defineProperty(target, key, {
get: () => selector instanceof Array ? store.select(genericSelector(selector)) : store.select(selector),
enumerable: true,
configurable: true,
});
};
};
export const get = (selector) => {
if (selector)
return (target, key) => {
Object.defineProperty(target, key, {
get: () => selector instanceof Array ? store.selectSync(genericSelector(selector)) : store.selectSync(selector),
enumerable: true,
configurable: true,
});
};
};
export const dispatch = () => {
return (target, key, descriptor) => {
let originalMethod;
const wrapped = (...args) => {
const result = originalMethod.apply(this, args);
if (result !== undefined && store)
store.dispatch(result);
return result;
};
descriptor = descriptor || Object.getOwnPropertyDescriptor(target, key);
if (descriptor === undefined) {
const dispatchDescriptor = {
get: () => wrapped,
set: setMethod => (originalMethod = setMethod),
};
Object.defineProperty(target, key, dispatchDescriptor);
return dispatchDescriptor;
}
else {
originalMethod = descriptor.value;
descriptor.value = wrapped;
return descriptor;
}
};
};
export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZWR1eC1tdWx0aXB1cnBvc2UvY29yZS9zcmMvbGliL3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFvQixjQUFjLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzNILE9BQU8sRUFBRSxvQkFBb0IsRUFBUSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sb0JBQW9CLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFDSCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0ksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUk1QyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3hDLE9BQU8sY0FBYyxDQUNqQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ0wsSUFBSSxXQUFXLEdBQVEsS0FBSyxDQUFDO1lBRTdCLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztnQkFDbEIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO29CQUMzRCxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxD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QVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2FBQ2pELENBQUM7WUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV2RCxPQUFPLGtCQUFrQixDQUFDO1NBQzdCO2FBRUQ7WUFDSSxjQUFjLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNsQyxVQUFVLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUMzQixPQUFPLFVBQVUsQ0FBQztTQUNyQjtJQUNMLENBQUMsQ0FBQTtBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RvciwgQWN0aW9uLCBjb25maWd1cmVTdG9yZSwgY3JlYXRlU2VsZWN0b3IsIGdldERlZmF1bHRNaWRkbGV3YXJlLCBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcbmltcG9ydCB7IFN0b3JlLCBSZWR1Y2VyLCBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgeyBGbHV4U3RhbmRhcmRBY3Rpb24gfSBmcm9tICdmbHV4LXN0YW5kYXJkLWFjdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVFcGljTWlkZGxld2FyZSwgRXBpYyB9IGZyb20gJ3JlZHV4LW9ic2VydmFibGUtZXM2LWNvbXBhdCc7XG5pbXBvcnQgY3JlYXRlU2FnYU1pZGRsZXdhcmUgZnJvbSAncmVkdXgtc2FnYSc7XG5pbXBvcnQge1xuICAgIHBlcnNpc3RTdG9yZSxcbiAgICBGTFVTSCxcbiAgICBSRUhZRFJBVEUsXG4gICAgUEFVU0UsXG4gICAgUEVSU0lTVCxcbiAgICBQVVJHRSxcbiAgICBSRUdJU1RFUlxufSBmcm9tICdyZWR1eC1wZXJzaXN0JztcbmltcG9ydCB7IGNyZWF0ZVJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIsIHJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIsIHJlc3BvbnNpdmVTdG9yZUVuaGFuY2VyLCBjYWxjdWxhdGVSZXNwb25zaXZlU3RhdGUgfSBmcm9tICdyZWR1eC1yZXNwb25zaXZlJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ3JlZHV4LWxvZ2dlcic7XG5cbmltcG9ydCB7IE11bHRpcHVycG9zZVN0b3JlT3B0aW9ucyB9IGZyb20gJy4vZW50aXRpZXMvc3RvcmUtb3B0aW9ucyc7XG5cbmNvbnN0IGdlbmVyaWNTZWxlY3RvciA9IChwYXRoczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIFtzdGF0ZSA9PiB7XG4gICAgICAgICAgICBsZXQgbmVzdGVkU3RhdGU6IGFueSA9IHN0YXRlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBwYXRoIG9mIHBhdGhzKVxuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRTdGF0ZVtwYXRoXSAhPSBudWxsICYmIG5lc3RlZFN0YXRlW3BhdGhdICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkU3RhdGUgPSBuZXN0ZWRTdGF0ZVtwYXRoXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5lc3RlZFN0YXRlO1xuICAgICAgICB9XSxcbiAgICAgICAgaXRlbXMgPT4gaXRlbXNcbiAgICApO1xufTtcblxuY29uc3QgaW5pdGlhbGl6ZVdpdGhEZWZhdWx0TWlkZGxld2FyZSA9IChvcHRpb25zPykgPT4ge1xuICAgIHJldHVybiBvcHRpb25zP1xuICAgICAgICBbLi4uZ2V0RGVmYXVsdE1pZGRsZXdhcmUob3B0aW9ucyldIDpcbiAgICAgICAgWy4uLmdldERlZmF1bHRNaWRkbGV3YXJlKCldO1xufTtcblxuLy9TdG9yZSBpbnN0YW5jZVxudmFyIHJlZHV4U3RvcmU6IFN0b3JlO1xuXG52YXIgc3RhdGljUmVkdWNlcnMgPSB7fTtcbnZhciBkeW5hbWljUmVkdWNlcnMgPSB7fTtcblxudmFyIGVwaWNzJDtcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVTdG9yZSA9IChvcHRpb25zOiBNdWx0aXB1cnBvc2VTdG9yZU9wdGlvbnMpID0+IHtcbiAgICBpZiAocmVkdXhTdG9yZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJBIHJlZHV4IHN0b3JlIGlzIGluaXRpYWxpemVkIHlldC4gQ2Fubm90IGluaXRpYWxpemUgYW5vdGhlciBvbmVcIik7XG5cbiAgICBjb25zdCB7XG4gICAgICAgIHJlZHVjZXJzLFxuICAgICAgICBkZXZUb29scyxcbiAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgIGVuaGFuY2VycyxcbiAgICAgICAgcHJlbG9hZGVkU3RhdGUsXG4gICAgICAgIGRlZmF1bHRNaWRkbGV3YXJlT3B0aW9ucyxcbiAgICAgICAgc2FnYXMsXG4gICAgICAgIGVwaWNzLFxuICAgICAgICBlbmFibGVQZXJzaXN0ZW5jZSxcbiAgICAgICAgZW5hYmxlUmVzcG9uc2l2ZW5lc3MsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgbG9nTGV2ZWxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGxldCBlbmhhbmNlciA9IGVuaGFuY2VycztcbiAgICBsZXQgbWlkZGxld2FyZSA9IFtdO1xuICAgIGxldCBzYWdhTWlkZGxld2FyZTtcbiAgICBsZXQgZXBpY01pZGRsZXdhcmU7XG5cbiAgICBsZXQgbWlkZGxld2FyZU9wdGlvbnMgPSBkZWZhdWx0TWlkZGxld2FyZU9wdGlvbnM7XG4gICAgaWYgKGVuYWJsZVBlcnNpc3RlbmNlKVxuICAgIHtcbiAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucylcbiAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zID0ge307XG4gICAgICAgIGlmICghbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2sgfHwgdHlwZW9mIG1pZGRsZXdhcmVPcHRpb25zID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjayA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrID09PSAnb2JqZWN0JylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucylcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMuaW5kZXhPZihGTFVTSCkgPCAwKVxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLnB1c2goRkxVU0gpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUkVIWURSQVRFKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChSRUhZRFJBVEUpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUEFVU0UpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBBVVNFKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFBFUlNJU1QpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBFUlNJU1QpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUFVSR0UpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBVUkdFKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFJFR0lTVEVSKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChSRUdJU1RFUik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5hYmxlUmVzcG9uc2l2ZW5lc3MpXG4gICAge1xuICAgICAgICBpZiAoIW1pZGRsZXdhcmVPcHRpb25zKVxuICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjayB8fCB0eXBlb2YgbWlkZGxld2FyZU9wdGlvbnMgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2sgPT09ICdvYmplY3QnKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIW1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zKVxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFwicmVkdXgtcmVzcG9uc2l2ZS9DQUxDVUxBVEVfUkVTUE9OU0lWRV9TVEFURVwiKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChcInJlZHV4LXJlc3BvbnNpdmUvQ0FMQ1VMQVRFX1JFU1BPTlNJVkVfU1RBVEVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtaWRkbGV3YXJlID0gaW5pdGlhbGl6ZVdpdGhEZWZhdWx0TWlkZGxld2FyZShtaWRkbGV3YXJlT3B0aW9ucyk7XG5cbiAgICBpZiAobWlkZGxld2FyZSlcbiAgICAgICAgbWlkZGxld2FyZSA9IFsuLi5taWRkbGV3YXJlLCAuLi5taWRkbGV3YXJlc107XG5cbiAgICBpZiAoZXBpY3MpXG4gICAge1xuICAgICAgICBlcGljTWlkZGxld2FyZSA9IGNyZWF0ZUVwaWNNaWRkbGV3YXJlPEZsdXhTdGFuZGFyZEFjdGlvbjxhbnksIGFueT4sIEZsdXhTdGFuZGFyZEFjdGlvbjxhbnksIGFueT4sIGFueT4oKTtcbiAgICAgICAgbWlkZGxld2FyZSA9IFsuLi5taWRkbGV3YXJlLCBlcGljTWlkZGxld2FyZV07XG4gICAgfVxuXG4gICAgaWYgKHNhZ2FzKVxuICAgIHtcbiAgICAgICAgc2FnYU1pZGRsZXdhcmUgPSBjcmVhdGVTYWdhTWlkZGxld2FyZSgpO1xuICAgICAgICBtaWRkbGV3YXJlID0gWy4uLm1pZGRsZXdhcmUsIHNhZ2FNaWRkbGV3YXJlXTtcbiAgICB9XG5cbiAgICBpZiAobG9nTGV2ZWwpXG4gICAge1xuICAgICAgICBjb25zdCBsb2dnZXJNaWRkbGV3YXJlID0gY3JlYXRlTG9nZ2VyKHsgbGV2ZWw6IGxvZ0xldmVsIH0pO1xuICAgICAgICBtaWRkbGV3YXJlID0gWy4uLm1pZGRsZXdhcmUsIGxvZ2dlck1pZGRsZXdhcmUgXTtcbiAgICB9XG5cbiAgICBpZiAoZW5hYmxlUmVzcG9uc2l2ZW5lc3MpXG4gICAge1xuICAgICAgICBsZXQgYnJvd3NlclJlZHVjZXI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVSZXNwb25zaXZlbmVzcyA9PT0gJ29iamVjdCcgJiYgZW5hYmxlUmVzcG9uc2l2ZW5lc3MuYnJlYWtwb2ludHMpXG4gICAgICAgICAgICBicm93c2VyUmVkdWNlciA9IGNyZWF0ZVJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIoZW5hYmxlUmVzcG9uc2l2ZW5lc3MuYnJlYWtwb2ludHMsIGVuYWJsZVJlc3BvbnNpdmVuZXNzLm9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicm93c2VyUmVkdWNlciA9IHJlc3BvbnNpdmVTdGF0ZVJlZHVjZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgaWYgKCFyZWR1Y2Vyc1snYnJvd3NlciddKVxuICAgICAgICAgICAgcmVkdWNlcnNbJ2Jyb3dzZXInXSA9IGJyb3dzZXJSZWR1Y2VyO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyhcIkEgYnJvd3NlciByZWR1Y2VyIGFscmVhZHkgZXhpc3RzLiBDYW5ub3QgZW5hYmxlIHJlZHV4LXJlc3BvbnNpdmUgbW9kdWxlXCIpO1xuXG4gICAgICAgIGlmICghZW5oYW5jZXIpXG4gICAgICAgICAgICBlbmhhbmNlciA9IFsgcmVzcG9uc2l2ZVN0b3JlRW5oYW5jZXIgXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZW5oYW5jZXIgPSBbIC4uLmVuaGFuY2VyLCByZXNwb25zaXZlU3RvcmVFbmhhbmNlciBdO1xuICAgIH1cblxuICAgIHN0YXRpY1JlZHVjZXJzID0gcmVkdWNlcnM7XG5cbiAgICBjb25zdCBuZXdTdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICAgICAgZGV2VG9vbHMsXG4gICAgICAgIHByZWxvYWRlZFN0YXRlLFxuICAgICAgICBtaWRkbGV3YXJlLFxuICAgICAgICBlbmhhbmNlcnM6IGVuaGFuY2VyXG4gICAgfSk7XG5cbiAgICBlcGljcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGVwaWNzKTtcbiAgICBjb25zdCBob3RSZWxvYWRpbmdFcGljcyA9IChhY3Rpb24kLCBzdGF0ZSQsIGRlcGVuZGVuY2llcykgPT5cbiAgICAgICAgZXBpY3MkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGVwaWM6IEVwaWMpID0+IGVwaWMoYWN0aW9uJCwgc3RhdGUkLCBkZXBlbmRlbmNpZXMpKVxuICAgICAgICApO1xuXG4gICAgLy9FeGVjdXRpbmcgZXBpY3NcbiAgICBpZiAoZXBpY01pZGRsZXdhcmUpXG4gICAgICAgIGVwaWNNaWRkbGV3YXJlLnJ1bihob3RSZWxvYWRpbmdFcGljcyk7XG5cbiAgICAvL0V4ZWN1dGluZyBzYWdhc1xuICAgIGlmIChzYWdhTWlkZGxld2FyZSlcbiAgICAgICAgc2FnYU1pZGRsZXdhcmUucnVuKHNhZ2FzKTtcblxuICAgIGlmIChlbmFibGVQZXJzaXN0ZW5jZSlcbiAgICAgICAgcGVyc2lzdFN0b3JlKG5ld1N0b3JlKTtcblxuICAgIC8vRmluYWxseSBzYXZlIHN0b3JlIGluc3RhbmNlXG4gICAgcmVkdXhTdG9yZSA9IG5ld1N0b3JlO1xuXG4gICAgaWYgKHJvdXRlcilcbiAgICB7XG4gICAgICAgIHN0b3JlLmFkZFJlZHVjZXIocm91dGVyLmtleSwgcm91dGVyLnJlZHVjZXIpO1xuICAgICAgICByb3V0ZXIuc2VydmljZS5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGVuYWJsZVJlc3BvbnNpdmVuZXNzKVxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gc3RvcmUuZGlzcGF0Y2goY2FsY3VsYXRlUmVzcG9uc2l2ZVN0YXRlKHdpbmRvdykpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdG9yZSA9IHtcbiAgICBnZXRTdGF0ZSQ6ICgpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlZHV4U3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gcmVkdXhTdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVkdXhTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0U3RhdGU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZHV4U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICB9LFxuICAgIHNlbGVjdDogPFIsIFQ+KHNlbGVjdG9yOiBTZWxlY3RvcjxSLCBUPik6IE9ic2VydmFibGU8VD4gPT57XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUPihzdWJzY3JpYmVyID0+IHsgIFxuICAgICAgICAgICAgY29uc3Qgc3RhdGUkID0gc3RvcmUuZ2V0U3RhdGUkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHN0YXRlID0+IHNlbGVjdG9yKHN0YXRlKSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoZGF0YSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgICAgIH0pXG4gICAgfSxcbiAgICBzZWxlY3RTeW5jOiA8UiwgVD4oc2VsZWN0b3I6IFNlbGVjdG9yPFIsIFQ+KSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RvcihyZWR1eFN0b3JlLmdldFN0YXRlKCkpO1xuICAgIH0sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IEFjdGlvbiB8IGFueSkgPT4ge1xuICAgICAgICByZWR1eFN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgfSxcbiAgICBhZGRSZWR1Y2VyOiA8UyA9IGFueSwgQSBleHRlbmRzIEFjdGlvbiA9IEFueUFjdGlvbj4oa2V5OiBzdHJpbmcsIHJlZHVjZXI6IFJlZHVjZXI8UywgQT4pID0+IHtcbiAgICAgICAgaWYgKCFrZXkgfHwgZHluYW1pY1JlZHVjZXJzW2tleV0pXG4gICAgICAgICAgICB0aHJvdyAoYEEgcmVkdWNlciB3aXRoIGtleSAnJHtrZXl9JyBpcyBhbHJlYWR5IGluamVjdGVkLiBJbmplY3Rpb24gYWJvcnRlZGApO1xuICAgICAgICBcbiAgICAgICAgZHluYW1pY1JlZHVjZXJzW2tleV0gPSByZWR1Y2VyO1xuICAgICAgICByZWR1eFN0b3JlLnJlcGxhY2VSZWR1Y2VyKGNvbWJpbmVSZWR1Y2Vycyh7IC4uLnN0YXRpY1JlZHVjZXJzLCAuLi5keW5hbWljUmVkdWNlcnMgfSkpO1xuICAgIH0sXG4gICAgcmVtb3ZlUmVkdWNlcjogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgha2V5IHx8ICFkeW5hbWljUmVkdWNlcnNba2V5XSlcbiAgICAgICAgICAgIHRocm93IChgTm8gcmVkdWNlciB3aXRoIGtleSAnJHtrZXl9JyBmb3VuZC4gUmVtb3ZlIGFib3J0ZWRgKTtcblxuICAgICAgICBkZWxldGUgZHluYW1pY1JlZHVjZXJzW2tleV07XG4gICAgICAgIHJlZHV4U3RvcmUucmVwbGFjZVJlZHVjZXIoY29tYmluZVJlZHVjZXJzKHsgLi4uc3RhdGljUmVkdWNlcnMsIC4uLmR5bmFtaWNSZWR1Y2VycyB9KSk7XG4gICAgfSxcbiAgICByZXBsYWNlRXBpY3M6IChuZXdSb290RXBpYykgPT4ge1xuICAgICAgICBlcGljcyQubmV4dChuZXdSb290RXBpYyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGlmIChzZWxlY3RvcilcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBzZWxlY3RvciBpbnN0YW5jZW9mIEFycmF5ID8gc3RvcmUuc2VsZWN0KGdlbmVyaWNTZWxlY3RvcihzZWxlY3RvcikpIDogc3RvcmUuc2VsZWN0KHNlbGVjdG9yKSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0ID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgaWYgKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHNlbGVjdG9yIGluc3RhbmNlb2YgQXJyYXkgPyBzdG9yZS5zZWxlY3RTeW5jKGdlbmVyaWNTZWxlY3RvcihzZWxlY3RvcikpIDogc3RvcmUuc2VsZWN0U3luYyhzZWxlY3RvciksXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgIHJldHVybiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3I/KSA9PiB7XG4gICAgICAgIGxldCBvcmlnaW5hbE1ldGhvZDtcbiAgICAgICAgY29uc3Qgd3JhcHBlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHN0b3JlKVxuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3IgfHwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gd3JhcHBlZCxcbiAgICAgICAgICAgICAgICBzZXQ6IHNldE1ldGhvZCA9PiAob3JpZ2luYWxNZXRob2QgPSBzZXRNZXRob2QpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGlzcGF0Y2hEZXNjcmlwdG9yKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSB3cmFwcGVkO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICB9XG59OyJdfQ==