UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

313 lines 21.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { AttributeMetadata, BelongsToMetadata, HasManyMetadata } from './decorators/symboles'; /** @type {?} */ let getIncludedKeys; export class ResourceMetadataWrapper { /** * @param {?} model */ constructor(model) { this.model = model; } /** * @param {?=} options * @return {?} */ allKeys(options) { return [ ...this.attributesKeys(options), ...this.relationshipKeys(options), ]; } /** * @param {?=} options * @return {?} */ relationshipKeys(options) { return [ ...this.belongsToKeys(options), ...this.hasManyKeys(options) ]; } /** * @param {?=} options * @return {?} */ attributesKeys(options) { /** @type {?} */ let keys = this.retrieveKeys(AttributeMetadata); if (options && options.defined) { keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.model[key] !== undefined)); // FIXME: quick fix to delete null values when it's a create if (!this.model.id) { keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.model[key] !== null)); } } return keys; } /** * @param {?=} options * @return {?} */ belongsToKeys(options) { return this.retrieveKeys(BelongsToMetadata, options); } /** * @param {?=} options * @return {?} */ hasManyKeys(options) { return this.retrieveKeys(HasManyMetadata, options); } /** * @return {?} */ allMetadata() { return [ ...this.attributesMetadata(), ...this.relationshipMetadata(), ]; } /** * @return {?} */ relationshipMetadata() { return [ ...this.belongsToMetadata(), ...this.hasManyMetadata() ]; } /** * @return {?} */ attributesMetadata() { return this.retrieveMetadata(AttributeMetadata); } /** * @return {?} */ belongsToMetadata() { return this.retrieveMetadata(BelongsToMetadata); } /** * @return {?} */ hasManyMetadata() { return this.retrieveMetadata(HasManyMetadata); } /** * @param {?} propertyName * @return {?} */ isSidepostable(propertyName) { /** @type {?} */ let metadata = Reflect.getMetadata(BelongsToMetadata, this.model); /** @type {?} */ let found = metadata && metadata.find((/** * @param {?} rel * @return {?} */ rel => rel.propertyName === propertyName)); if (found) { return found.sidepostable; } metadata = Reflect.getMetadata(HasManyMetadata, this.model); found = metadata && metadata.find((/** * @param {?} rel * @return {?} */ rel => rel.propertyName === propertyName)); if (found) { return found.sidepostable; } } /** * @param {?} propertyName * @return {?} */ isWritable(propertyName) { /** @type {?} */ const allMetadata = this.allMetadata(); /** @type {?} */ const found = allMetadata.find((/** * @param {?} pname * @return {?} */ pname => pname.propertyName === propertyName)); if (found) { return !found.readonly; } } /** * @param {?} propertyName * @return {?} */ backendPropName(propertyName) { /** @type {?} */ const allMetadata = this.allMetadata(); /** @type {?} */ const found = allMetadata.find((/** * @param {?} pname * @return {?} */ pname => pname.propertyName === propertyName)); if (found) { return found.backendName; } } /** * @param {?} propertyName * @return {?} */ frontendPropName(propertyName) { /** @type {?} */ const allMetadata = this.allMetadata(); // search in backend /** @type {?} */ let found = allMetadata.find((/** * @param {?} pname * @return {?} */ pname => pname.backendName === propertyName)); if (found) { return found.propertyName; } // search in frontend found = allMetadata.find((/** * @param {?} pname * @return {?} */ pname => pname.propertyName === propertyName)); if (found) { return propertyName; } } /** * @private * @param {?} symbol * @param {?=} options * @return {?} */ retrieveKeys(symbol, options) { this.model.modelSerialization = true; /** @type {?} */ const metadata = this.retrieveMetadata(symbol); /** @type {?} */ let keys = metadata.map((/** * @param {?} btm * @return {?} */ btm => btm.propertyName)); if (options && options.defined) { keys = keys.filter((/** * @param {?} key * @return {?} */ key => this.model[key])); } this.model.modelSerialization = false; return keys; } /** * @private * @param {?} symbol * @return {?} */ retrieveMetadata(symbol) { return Reflect.getMetadata(symbol, this.model) || []; } /** * @param {?=} options * @return {?} */ getIncludedKeys(options) { options = (options || {}) && Object.assign({ forBackend: true }, options); return getIncludedKeys(this.model, this, options); } } if (false) { /** * @type {?} * @private */ ResourceMetadataWrapper.prototype.model; } getIncludedKeys = (/** * @param {?} model * @param {?} wrapper * @param {?=} options * @return {?} */ (model, wrapper, options) => { /** @type {?} */ const keyTranslator = options.forBackend ? 'backendPropName' : 'frontendPropName'; /** @type {?} */ let localKeys = wrapper.relationshipKeys({ defined: true }).filter((/** * @param {?} key * @return {?} */ key => wrapper.isSidepostable(key))); /** @type {?} */ const childKeys = []; localKeys.forEach((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const resource = model[key]; /** @type {?} */ let cKeys = []; if (Array.isArray(resource)) { resource.forEach((/** * @param {?} elt * @return {?} */ elt => { /** @type {?} */ const wrap = new ResourceMetadataWrapper(elt); /** @type {?} */ const keys = getIncludedKeys(elt, wrap, options); cKeys.push(...keys); })); } else { /** @type {?} */ const wrap = new ResourceMetadataWrapper(resource); /** @type {?} */ const keys = getIncludedKeys(resource, wrap, options); cKeys.push(...keys); } cKeys = cKeys.map((/** * @param {?} ckey * @return {?} */ ckey => `${wrapper[keyTranslator](key)}.${ckey}`)); // remove duplicates cKeys = cKeys.filter((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => cKeys.indexOf(item) >= index)); childKeys.push(...cKeys); })); localKeys = localKeys.map((/** * @param {?} lkey * @return {?} */ lkey => wrapper[keyTranslator](lkey))); return [...localKeys, ...childKeys]; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtbWV0YWRhdGEud3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1haXJicnVzaC8iLCJzb3VyY2VzIjpbImxpYi9yZXNvdXJjZS1tZXRhZGF0YS53cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0lBRzFGLGVBQXdIO0FBRTVILE1BQU0sT0FBTyx1QkFBdUI7Ozs7SUFFbEMsWUFBb0IsS0FBbUI7UUFBbkIsVUFBSyxHQUFMLEtBQUssQ0FBYztJQUFHLENBQUM7Ozs7O0lBRXBDLE9BQU8sQ0FBQyxPQUErQjtRQUM1QyxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUMvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7U0FDbEMsQ0FBQztJQUNKLENBQUM7Ozs7O0lBRU0sZ0JBQWdCLENBQUMsT0FBK0I7UUFDckQsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDOUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQztTQUM3QixDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFTSxjQUFjLENBQUMsT0FBK0I7O1lBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDO1FBQy9DLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNOzs7O1lBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBQyxDQUFDO1lBQ3pELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNOzs7O2dCQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUMsQ0FBQzthQUFFO1NBQzdFO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7OztJQUVNLGFBQWEsQ0FBQyxPQUErQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7Ozs7SUFFTSxXQUFXLENBQUMsT0FBK0I7UUFDaEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDOzs7O0lBRU0sV0FBVztRQUNoQixPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7U0FDL0IsQ0FBQztJQUNKLENBQUM7Ozs7SUFFTSxvQkFBb0I7UUFDekIsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtTQUMxQixDQUFDO0lBQ0osQ0FBQzs7OztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7SUFFTSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7O0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDOzs7OztJQUVNLGNBQWMsQ0FBQyxZQUFvQjs7WUFDcEMsUUFBUSxHQUFVLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzs7WUFDcEUsS0FBSyxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSTs7OztRQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxZQUFZLEVBQUM7UUFDL0UsSUFBSSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FBRTtRQUV6QyxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELEtBQUssR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUk7Ozs7UUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssWUFBWSxFQUFDLENBQUM7UUFDNUUsSUFBSSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FBRTtJQUMzQyxDQUFDOzs7OztJQUVNLFVBQVUsQ0FBQyxZQUFvQjs7Y0FDOUIsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7O2NBRWhDLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSTs7OztRQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxZQUFZLEVBQUM7UUFDNUUsSUFBSSxLQUFLLEVBQUU7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztTQUFFO0lBQ3hDLENBQUM7Ozs7O0lBRU0sZUFBZSxDQUFDLFlBQTZCOztjQUM1QyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTs7Y0FFaEMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFlBQVksRUFBQztRQUM1RSxJQUFJLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQztTQUFFO0lBQzFDLENBQUM7Ozs7O0lBRU0sZ0JBQWdCLENBQUMsWUFBb0I7O2NBQ3BDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFOzs7WUFHbEMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxLQUFLLFlBQVksRUFBQztRQUN6RSxJQUFJLEtBQUssRUFBRTtZQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQztTQUFFO1FBQ3pDLHFCQUFxQjtRQUNyQixLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUk7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssWUFBWSxFQUFDLENBQUM7UUFDdkUsSUFBSSxLQUFLLEVBQUU7WUFBRSxPQUFPLFlBQVksQ0FBQztTQUFFO0lBQ3JDLENBQUM7Ozs7Ozs7SUFFTyxZQUFZLENBQUMsTUFBVyxFQUFFLE9BQStCO1FBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOztjQUMvQixRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQzs7WUFFMUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHOzs7O1FBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFDO1FBQ2hELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU07Ozs7WUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQztTQUFFO1FBQy9FLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRU8sZ0JBQWdCLENBQUMsTUFBVztRQUNsQyxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkQsQ0FBQzs7Ozs7SUFFTSxlQUFlLENBQUMsT0FBa0M7UUFDdkQsT0FBTyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxvQkFBTSxVQUFVLEVBQUUsSUFBSSxJQUFLLE9BQU8sQ0FBRSxDQUFDO1FBQzlELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjs7Ozs7O0lBakhhLHdDQUEyQjs7QUFtSHpDLGVBQWU7Ozs7OztBQUFHLENBQUMsS0FBbUIsRUFBRSxPQUFnQyxFQUFFLE9BQWtDLEVBQVksRUFBRTs7VUFDbEgsYUFBYSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxrQkFBa0I7O1FBQzdFLFNBQVMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNOzs7O0lBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFDOztVQUVoRyxTQUFTLEdBQWEsRUFBRTtJQUM5QixTQUFTLENBQUMsT0FBTzs7OztJQUFDLEdBQUcsQ0FBQyxFQUFFOztjQUNoQixRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQzs7WUFDdkIsS0FBSyxHQUFHLEVBQUU7UUFDZCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0IsUUFBUSxDQUFDLE9BQU87Ozs7WUFBQyxHQUFHLENBQUMsRUFBRTs7c0JBQ2YsSUFBSSxHQUFHLElBQUksdUJBQXVCLENBQUMsR0FBRyxDQUFDOztzQkFDdkMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztnQkFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFBQyxDQUFDO1NBQ0o7YUFBTTs7a0JBQ0MsSUFBSSxHQUFHLElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDOztrQkFDNUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDckI7UUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUc7Ozs7UUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFDLENBQUM7UUFDcEUsb0JBQW9CO1FBQ3BCLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTTs7Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxFQUFDLENBQUM7UUFDcEUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUMsRUFBQyxDQUFDO0lBQ0gsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHOzs7O0lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQztJQUNoRSxPQUFPLENBQUMsR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlQmFzZSB9IGZyb20gJy4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVNZXRhZGF0YSwgQmVsb25nc1RvTWV0YWRhdGEsIEhhc01hbnlNZXRhZGF0YSB9IGZyb20gJy4vZGVjb3JhdG9ycy9zeW1ib2xlcyc7XG5cblxubGV0IGdldEluY2x1ZGVkS2V5czogKG1vZGVsOiBSZXNvdXJjZUJhc2UsIHdyYXBwZXI6IFJlc291cmNlTWV0YWRhdGFXcmFwcGVyLCBvcHRpb25zPzogeyBmb3JCYWNrZW5kPzogYm9vbGVhbiB9KSA9PiBzdHJpbmdbXTtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTWV0YWRhdGFXcmFwcGVyIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZGVsOiBSZXNvdXJjZUJhc2UpIHt9XG5cbiAgcHVibGljIGFsbEtleXMob3B0aW9ucz86IHsgZGVmaW5lZD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5hdHRyaWJ1dGVzS2V5cyhvcHRpb25zKSxcbiAgICAgIC4uLnRoaXMucmVsYXRpb25zaGlwS2V5cyhvcHRpb25zKSxcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIHJlbGF0aW9uc2hpcEtleXMob3B0aW9ucz86IHsgZGVmaW5lZD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5iZWxvbmdzVG9LZXlzKG9wdGlvbnMpLFxuICAgICAgLi4udGhpcy5oYXNNYW55S2V5cyhvcHRpb25zKVxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgYXR0cmlidXRlc0tleXMob3B0aW9ucz86IHsgZGVmaW5lZD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgICBsZXQga2V5cyA9IHRoaXMucmV0cmlldmVLZXlzKEF0dHJpYnV0ZU1ldGFkYXRhKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmluZWQpIHtcbiAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrZXkgPT4gdGhpcy5tb2RlbFtrZXldICE9PSB1bmRlZmluZWQpO1xuICAgICAgLy8gRklYTUU6IHF1aWNrIGZpeCB0byBkZWxldGUgbnVsbCB2YWx1ZXMgd2hlbiBpdCdzIGEgY3JlYXRlXG4gICAgICBpZiAoIXRoaXMubW9kZWwuaWQpIHsga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1vZGVsW2tleV0gIT09IG51bGwpOyB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgcHVibGljIGJlbG9uZ3NUb0tleXMob3B0aW9ucz86IHsgZGVmaW5lZD86IGJvb2xlYW4gfSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZXRyaWV2ZUtleXMoQmVsb25nc1RvTWV0YWRhdGEsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGhhc01hbnlLZXlzKG9wdGlvbnM/OiB7IGRlZmluZWQ/OiBib29sZWFuIH0pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmV0cmlldmVLZXlzKEhhc01hbnlNZXRhZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYWxsTWV0YWRhdGEoKTogYW55W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLmF0dHJpYnV0ZXNNZXRhZGF0YSgpLFxuICAgICAgLi4udGhpcy5yZWxhdGlvbnNoaXBNZXRhZGF0YSgpLFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgcmVsYXRpb25zaGlwTWV0YWRhdGEoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi50aGlzLmJlbG9uZ3NUb01ldGFkYXRhKCksXG4gICAgICAuLi50aGlzLmhhc01hbnlNZXRhZGF0YSgpXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhdHRyaWJ1dGVzTWV0YWRhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnJldHJpZXZlTWV0YWRhdGEoQXR0cmlidXRlTWV0YWRhdGEpO1xuICB9XG5cbiAgcHVibGljIGJlbG9uZ3NUb01ldGFkYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXRyaWV2ZU1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNNYW55TWV0YWRhdGEoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnJldHJpZXZlTWV0YWRhdGEoSGFzTWFueU1ldGFkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1NpZGVwb3N0YWJsZShwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGxldCBtZXRhZGF0YTogYW55W10gPSBSZWZsZWN0LmdldE1ldGFkYXRhKEJlbG9uZ3NUb01ldGFkYXRhLCB0aGlzLm1vZGVsKTtcbiAgICBsZXQgZm91bmQgPSBtZXRhZGF0YSAmJiBtZXRhZGF0YS5maW5kKHJlbCA9PiByZWwucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWUpO1xuICAgIGlmIChmb3VuZCkgeyByZXR1cm4gZm91bmQuc2lkZXBvc3RhYmxlOyB9XG5cbiAgICBtZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoSGFzTWFueU1ldGFkYXRhLCB0aGlzLm1vZGVsKTtcbiAgICBmb3VuZCA9IG1ldGFkYXRhICYmIG1ldGFkYXRhLmZpbmQocmVsID0+IHJlbC5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZC5zaWRlcG9zdGFibGU7IH1cbiAgfVxuXG4gIHB1YmxpYyBpc1dyaXRhYmxlKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWxsTWV0YWRhdGEgPSB0aGlzLmFsbE1ldGFkYXRhKCk7XG5cbiAgICBjb25zdCBmb3VuZCA9IGFsbE1ldGFkYXRhLmZpbmQocG5hbWUgPT4gcG5hbWUucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eU5hbWUpO1xuICAgIGlmIChmb3VuZCkgeyByZXR1cm4gIWZvdW5kLnJlYWRvbmx5OyB9XG4gIH1cblxuICBwdWJsaWMgYmFja2VuZFByb3BOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nIHwgc3ltYm9sKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGxNZXRhZGF0YSA9IHRoaXMuYWxsTWV0YWRhdGEoKTtcblxuICAgIGNvbnN0IGZvdW5kID0gYWxsTWV0YWRhdGEuZmluZChwbmFtZSA9PiBwbmFtZS5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKGZvdW5kKSB7IHJldHVybiBmb3VuZC5iYWNrZW5kTmFtZTsgfVxuICB9XG5cbiAgcHVibGljIGZyb250ZW5kUHJvcE5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFsbE1ldGFkYXRhID0gdGhpcy5hbGxNZXRhZGF0YSgpO1xuXG4gICAgLy8gc2VhcmNoIGluIGJhY2tlbmRcbiAgICBsZXQgZm91bmQgPSBhbGxNZXRhZGF0YS5maW5kKHBuYW1lID0+IHBuYW1lLmJhY2tlbmROYW1lID09PSBwcm9wZXJ0eU5hbWUpO1xuICAgIGlmIChmb3VuZCkgeyByZXR1cm4gZm91bmQucHJvcGVydHlOYW1lOyB9XG4gICAgLy8gc2VhcmNoIGluIGZyb250ZW5kXG4gICAgZm91bmQgPSBhbGxNZXRhZGF0YS5maW5kKHBuYW1lID0+IHBuYW1lLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlOYW1lKTtcbiAgICBpZiAoZm91bmQpIHsgcmV0dXJuIHByb3BlcnR5TmFtZTsgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXRyaWV2ZUtleXMoc3ltYm9sOiBhbnksIG9wdGlvbnM/OiB7IGRlZmluZWQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLm1vZGVsLm1vZGVsU2VyaWFsaXphdGlvbiA9IHRydWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnJldHJpZXZlTWV0YWRhdGEoc3ltYm9sKTtcblxuICAgIGxldCBrZXlzID0gbWV0YWRhdGEubWFwKGJ0bSA9PiBidG0ucHJvcGVydHlOYW1lKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmluZWQpIHsga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1vZGVsW2tleV0pOyB9XG4gICAgdGhpcy5tb2RlbC5tb2RlbFNlcmlhbGl6YXRpb24gPSBmYWxzZTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIHByaXZhdGUgcmV0cmlldmVNZXRhZGF0YShzeW1ib2w6IGFueSk6IGFueVtdIHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXRNZXRhZGF0YShzeW1ib2wsIHRoaXMubW9kZWwpIHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGdldEluY2x1ZGVkS2V5cyhvcHRpb25zPzogeyBmb3JCYWNrZW5kPzogYm9vbGVhbiB9KTogc3RyaW5nW10ge1xuICAgIG9wdGlvbnMgPSAob3B0aW9ucyB8fCB7fSkgJiYgeyBmb3JCYWNrZW5kOiB0cnVlLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIGdldEluY2x1ZGVkS2V5cyh0aGlzLm1vZGVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufVxuXG5nZXRJbmNsdWRlZEtleXMgPSAobW9kZWw6IFJlc291cmNlQmFzZSwgd3JhcHBlcjogUmVzb3VyY2VNZXRhZGF0YVdyYXBwZXIsIG9wdGlvbnM/OiB7IGZvckJhY2tlbmQ/OiBib29sZWFuIH0pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGtleVRyYW5zbGF0b3IgPSBvcHRpb25zLmZvckJhY2tlbmQgPyAnYmFja2VuZFByb3BOYW1lJyA6ICdmcm9udGVuZFByb3BOYW1lJztcbiAgbGV0IGxvY2FsS2V5cyA9IHdyYXBwZXIucmVsYXRpb25zaGlwS2V5cyh7IGRlZmluZWQ6IHRydWUgfSkuZmlsdGVyKGtleSA9PiB3cmFwcGVyLmlzU2lkZXBvc3RhYmxlKGtleSkpO1xuXG4gIGNvbnN0IGNoaWxkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgbG9jYWxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IG1vZGVsW2tleV07XG4gICAgbGV0IGNLZXlzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzb3VyY2UpKSB7XG4gICAgICByZXNvdXJjZS5mb3JFYWNoKGVsdCA9PiB7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YVdyYXBwZXIoZWx0KTtcbiAgICAgICAgY29uc3Qga2V5cyA9IGdldEluY2x1ZGVkS2V5cyhlbHQsIHdyYXAsIG9wdGlvbnMpO1xuICAgICAgICBjS2V5cy5wdXNoKC4uLmtleXMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHdyYXAgPSBuZXcgUmVzb3VyY2VNZXRhZGF0YVdyYXBwZXIocmVzb3VyY2UpO1xuICAgICAgY29uc3Qga2V5cyA9IGdldEluY2x1ZGVkS2V5cyhyZXNvdXJjZSwgd3JhcCwgb3B0aW9ucyk7XG4gICAgICBjS2V5cy5wdXNoKC4uLmtleXMpO1xuICAgIH1cbiAgICBjS2V5cyA9IGNLZXlzLm1hcChja2V5ID0+IGAke3dyYXBwZXJba2V5VHJhbnNsYXRvcl0oa2V5KX0uJHtja2V5fWApO1xuICAgIC8vIHJlbW92ZSBkdXBsaWNhdGVzXG4gICAgY0tleXMgPSBjS2V5cy5maWx0ZXIoKGl0ZW0sIGluZGV4KSA9PiBjS2V5cy5pbmRleE9mKGl0ZW0pID49IGluZGV4KTtcbiAgICBjaGlsZEtleXMucHVzaCguLi5jS2V5cyk7XG4gIH0pO1xuICBsb2NhbEtleXMgPSBsb2NhbEtleXMubWFwKGxrZXkgPT4gd3JhcHBlcltrZXlUcmFuc2xhdG9yXShsa2V5KSk7XG4gIHJldHVybiBbLi4ubG9jYWxLZXlzLCAuLi5jaGlsZEtleXNdO1xufTtcbiJdfQ==