@mini-rx/signal-store
Version:
Signal Store for Angular
65 lines • 13.9 kB
JavaScript
// Credits go to NgRx
// Typings are taken directly from NgRx with small modifications:
// https://github.com/ngrx/platform/blob/8.6.0/modules/store/src/selector.ts
// The MIT License (MIT)
//
// Copyright (c) 2017 Brandon Roberts, Mike Ryan, Victor Savkin, Rob Wormald
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import { computed } from '@angular/core';
export const SIGNAL_SELECTOR_KEY = '@mini-rx/signalSelector';
export function createSelector(...args) {
const selectors = args.slice(0, args.length - 1);
const projector = args[args.length - 1];
const selector = (state) => {
const signalsFromSelectors = selectors.map((fn) => {
return fn(state); // Pass the state Signal
});
// Return computed Signal which recalculates when one of the `signalsFromSelectors` notifies about changes
return computed(() => {
const results = signalsFromSelectors.map((aSignal) => aSignal());
return projector(...results);
});
};
return addSignalSelectorKey(selector);
}
export function createFeatureStateSelector(featureKey) {
let selector;
if (featureKey) {
selector = createSelector(addSignalSelectorKey((state) => state), (state) => state[featureKey]);
}
else {
selector = (state) => state; // Do not memoize: when used with FeatureStore there is a new state object created for every `setState`
}
return addSignalSelectorKey(selector);
}
export function createComponentStateSelector() {
return addSignalSelectorKey((state) => state);
}
// Exported for testing
export function addSignalSelectorKey(s) {
Object.defineProperty(s, SIGNAL_SELECTOR_KEY, {
value: true,
});
return s;
}
export function isSignalSelector(v) {
return Object.hasOwn(v, SIGNAL_SELECTOR_KEY);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXNlbGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9zaWduYWwtc3RvcmUvc3JjL2xpYi9zaWduYWwtc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCO0FBQ3JCLGlFQUFpRTtBQUNqRSw0RUFBNEU7QUFFNUUsd0JBQXdCO0FBQ3hCLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSx3RUFBd0U7QUFDeEUsMkRBQTJEO0FBQzNELEVBQUU7QUFDRixpRkFBaUY7QUFDakYsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixZQUFZO0FBRVosT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUdqRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyx5QkFBeUIsQ0FBQztBQTZFN0QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFHLElBQVc7SUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV4QyxNQUFNLFFBQVEsR0FBdUIsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMzQyxNQUFNLG9CQUFvQixHQUFrQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDN0QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCwwR0FBMEc7UUFDMUcsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2pCLE1BQU0sT0FBTyxHQUFVLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RSxPQUFPLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDO0lBRUYsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBSUQsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFVBQWdCO0lBQ3ZELElBQUksUUFBNEIsQ0FBQztJQUNqQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2IsUUFBUSxHQUFHLGNBQWMsQ0FDckIsb0JBQW9CLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFDbkQsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FDekMsQ0FBQztJQUNOLENBQUM7U0FBTSxDQUFDO1FBQ0osUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyx1R0FBdUc7SUFDeEksQ0FBQztJQUNELE9BQU8sb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEI7SUFDeEMsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLEtBQWdCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCx1QkFBdUI7QUFDdkIsTUFBTSxVQUFVLG9CQUFvQixDQUFPLENBQWlCO0lBQ3hELE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixFQUFFO1FBQzFDLEtBQUssRUFBRSxJQUFJO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUF5QixDQUFDO0FBQ3JDLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsQ0FBTTtJQUNuQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENyZWRpdHMgZ28gdG8gTmdSeFxuLy8gVHlwaW5ncyBhcmUgdGFrZW4gZGlyZWN0bHkgZnJvbSBOZ1J4IHdpdGggc21hbGwgbW9kaWZpY2F0aW9uczpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3J4L3BsYXRmb3JtL2Jsb2IvOC42LjAvbW9kdWxlcy9zdG9yZS9zcmMvc2VsZWN0b3IudHNcblxuLy8gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDE3IEJyYW5kb24gUm9iZXJ0cywgTWlrZSBSeWFuLCBWaWN0b3IgU2F2a2luLCBSb2IgV29ybWFsZFxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbi8vIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuLy8gU09GVFdBUkUuXG5cbmltcG9ydCB7IGNvbXB1dGVkLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSAnQG1pbmktcngvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IFNJR05BTF9TRUxFQ1RPUl9LRVkgPSAnQG1pbmktcngvc2lnbmFsU2VsZWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhc1NpZ25hbFNlbGVjdG9yS2V5IHtcbiAgICBbU0lHTkFMX1NFTEVDVE9SX0tFWV06IHRydWU7XG59XG5cbnR5cGUgU2VsZWN0b3I8VCwgUj4gPSAoc3RhdGU6IFNpZ25hbDxUPikgPT4gU2lnbmFsPFI+O1xuZXhwb3J0IHR5cGUgU2lnbmFsU2VsZWN0b3I8VCwgUj4gPSBTZWxlY3RvcjxULCBSPiAmIEhhc1NpZ25hbFNlbGVjdG9yS2V5O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3I8U3RhdGUsIFMxLCBSZXN1bHQ+KFxuICAgIHMxOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzE+LFxuICAgIHByb2plY3RvcjogKHMxOiBTMSkgPT4gUmVzdWx0XG4pOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUmVzdWx0PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yPFN0YXRlLCBTMSwgUzIsIFJlc3VsdD4oXG4gICAgczE6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMT4sXG4gICAgczI6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMj4sXG4gICAgcHJvamVjdG9yOiAoczE6IFMxLCBzMjogUzIpID0+IFJlc3VsdFxuKTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFJlc3VsdD47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvcjxTdGF0ZSwgUzEsIFMyLCBTMywgUmVzdWx0PihcbiAgICBzMTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMxPixcbiAgICBzMjogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMyPixcbiAgICBzMzogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMzPixcbiAgICBwcm9qZWN0b3I6IChzMTogUzEsIHMyOiBTMiwgczM6IFMzKSA9PiBSZXN1bHRcbik6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBSZXN1bHQ+O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3I8U3RhdGUsIFMxLCBTMiwgUzMsIFM0LCBSZXN1bHQ+KFxuICAgIHMxOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzE+LFxuICAgIHMyOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzI+LFxuICAgIHMzOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzM+LFxuICAgIHM0OiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzQ+LFxuICAgIHByb2plY3RvcjogKHMxOiBTMSwgczI6IFMyLCBzMzogUzMsIHM0OiBTNCkgPT4gUmVzdWx0XG4pOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUmVzdWx0PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yPFN0YXRlLCBTMSwgUzIsIFMzLCBTNCwgUzUsIFJlc3VsdD4oXG4gICAgczE6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMT4sXG4gICAgczI6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMj4sXG4gICAgczM6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMz4sXG4gICAgczQ6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTND4sXG4gICAgczU6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTNT4sXG4gICAgcHJvamVjdG9yOiAoczE6IFMxLCBzMjogUzIsIHMzOiBTMywgczQ6IFM0LCBzNTogUzUpID0+IFJlc3VsdFxuKTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFJlc3VsdD47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvcjxTdGF0ZSwgUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUmVzdWx0PihcbiAgICBzMTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMxPixcbiAgICBzMjogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMyPixcbiAgICBzMzogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFMzPixcbiAgICBzNDogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFM0PixcbiAgICBzNTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFM1PixcbiAgICBzNjogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFM2PixcbiAgICBwcm9qZWN0b3I6IChzMTogUzEsIHMyOiBTMiwgczM6IFMzLCBzNDogUzQsIHM1OiBTNSwgczY6IFM2KSA9PiBSZXN1bHRcbik6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBSZXN1bHQ+O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3I8U3RhdGUsIFMxLCBTMiwgUzMsIFM0LCBTNSwgUzYsIFM3LCBSZXN1bHQ+KFxuICAgIHMxOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzE+LFxuICAgIHMyOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzI+LFxuICAgIHMzOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzM+LFxuICAgIHM0OiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzQ+LFxuICAgIHM1OiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzU+LFxuICAgIHM2OiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzY+LFxuICAgIHM3OiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUzc+LFxuICAgIHByb2plY3RvcjogKHMxOiBTMSwgczI6IFMyLCBzMzogUzMsIHM0OiBTNCwgczU6IFM1LCBzNjogUzYsIHM3OiBTNykgPT4gUmVzdWx0XG4pOiBTaWduYWxTZWxlY3RvcjxTdGF0ZSwgUmVzdWx0PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yPFN0YXRlLCBTMSwgUzIsIFMzLCBTNCwgUzUsIFM2LCBTNywgUzgsIFJlc3VsdD4oXG4gICAgczE6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMT4sXG4gICAgczI6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMj4sXG4gICAgczM6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTMz4sXG4gICAgczQ6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTND4sXG4gICAgczU6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTNT4sXG4gICAgczY6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTNj4sXG4gICAgczc6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTNz4sXG4gICAgczg6IFNpZ25hbFNlbGVjdG9yPFN0YXRlLCBTOD4sXG4gICAgcHJvamVjdG9yOiAoczE6IFMxLCBzMjogUzIsIHMzOiBTMywgczQ6IFM0LCBzNTogUzUsIHM2OiBTNiwgczc6IFM3LCBzODogUzgpID0+IFJlc3VsdFxuKTogU2lnbmFsU2VsZWN0b3I8U3RhdGUsIFJlc3VsdD47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvciguLi5hcmdzOiBhbnlbXSk6IFNpZ25hbFNlbGVjdG9yPGFueSwgYW55PiB7XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gYXJncy5zbGljZSgwLCBhcmdzLmxlbmd0aCAtIDEpO1xuICAgIGNvbnN0IHByb2plY3RvciA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcblxuICAgIGNvbnN0IHNlbGVjdG9yOiBTZWxlY3RvcjxhbnksIGFueT4gPSAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmFsc0Zyb21TZWxlY3RvcnM6IFNpZ25hbDxhbnk+W10gPSBzZWxlY3RvcnMubWFwKChmbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHN0YXRlKTsgLy8gUGFzcyB0aGUgc3RhdGUgU2lnbmFsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldHVybiBjb21wdXRlZCBTaWduYWwgd2hpY2ggcmVjYWxjdWxhdGVzIHdoZW4gb25lIG9mIHRoZSBgc2lnbmFsc0Zyb21TZWxlY3RvcnNgIG5vdGlmaWVzIGFib3V0IGNoYW5nZXNcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gc2lnbmFsc0Zyb21TZWxlY3RvcnMubWFwKChhU2lnbmFsKSA9PiBhU2lnbmFsKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2plY3RvciguLi5yZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBhZGRTaWduYWxTZWxlY3RvcktleShzZWxlY3Rvcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlU3RhdGVTZWxlY3RvcjxUPihmZWF0dXJlS2V5Pzogc3RyaW5nKTogU2lnbmFsU2VsZWN0b3I8b2JqZWN0LCBUPjtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlU3RhdGVTZWxlY3RvcjxULCBWPihmZWF0dXJlS2V5OiBrZXlvZiBUKTogU2lnbmFsU2VsZWN0b3I8VCwgVj47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmVhdHVyZVN0YXRlU2VsZWN0b3IoZmVhdHVyZUtleT86IGFueSk6IFNpZ25hbFNlbGVjdG9yPGFueSwgYW55PiB7XG4gICAgbGV0IHNlbGVjdG9yOiBTZWxlY3RvcjxhbnksIGFueT47XG4gICAgaWYgKGZlYXR1cmVLZXkpIHtcbiAgICAgICAgc2VsZWN0b3IgPSBjcmVhdGVTZWxlY3RvcihcbiAgICAgICAgICAgIGFkZFNpZ25hbFNlbGVjdG9yS2V5KChzdGF0ZTogU2lnbmFsPGFueT4pID0+IHN0YXRlKSxcbiAgICAgICAgICAgIChzdGF0ZTogQXBwU3RhdGUpID0+IHN0YXRlW2ZlYXR1cmVLZXldXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0b3IgPSAoc3RhdGUpID0+IHN0YXRlOyAvLyBEbyBub3QgbWVtb2l6ZTogd2hlbiB1c2VkIHdpdGggRmVhdHVyZVN0b3JlIHRoZXJlIGlzIGEgbmV3IHN0YXRlIG9iamVjdCBjcmVhdGVkIGZvciBldmVyeSBgc2V0U3RhdGVgXG4gICAgfVxuICAgIHJldHVybiBhZGRTaWduYWxTZWxlY3RvcktleShzZWxlY3Rvcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnRTdGF0ZVNlbGVjdG9yPFQ+KCk6IFNpZ25hbFNlbGVjdG9yPFQsIFQ+IHtcbiAgICByZXR1cm4gYWRkU2lnbmFsU2VsZWN0b3JLZXkoKHN0YXRlOiBTaWduYWw8VD4pID0+IHN0YXRlKTtcbn1cblxuLy8gRXhwb3J0ZWQgZm9yIHRlc3RpbmdcbmV4cG9ydCBmdW5jdGlvbiBhZGRTaWduYWxTZWxlY3RvcktleTxULCBSPihzOiBTZWxlY3RvcjxULCBSPik6IFNpZ25hbFNlbGVjdG9yPFQsIFI+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgU0lHTkFMX1NFTEVDVE9SX0tFWSwge1xuICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzIGFzIFNpZ25hbFNlbGVjdG9yPFQsIFI+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaWduYWxTZWxlY3Rvcih2OiBhbnkpOiB2IGlzIFNpZ25hbFNlbGVjdG9yPGFueSwgYW55PiB7XG4gICAgcmV0dXJuIE9iamVjdC5oYXNPd24odiwgU0lHTkFMX1NFTEVDVE9SX0tFWSk7XG59XG4iXX0=