UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

163 lines 19 kB
import { Tuple } from "../Tuple"; export class TupleDataLoaderTupleABC extends Tuple { constructor(tupleName) { super(tupleName); } /** * Creates a new instance of FormGroup to enable ReactiveForms validation. * * * @return {FormGroup} - The newly created FormGroup * instance, or null of formGroup validation is * not required. */ createFormGroup() { return null; } /** * Update the form group with the given changes. * * If createFormGroup returns null, this method * will never be called. * * @param {object} changes - The changes to apply to the form group. * @return {boolean} - Returns a boolean value indicating if * there were differences to update. */ updateFromFormGroup(changes) { return null; } /** * Update the validation of a form group. * * This will be called when data in the form group changes, and after those * changes have been synchronised to this data tuple. * * Updates of any kind must be made to the formGroup controls. * * Value reads may be performed on either this tuple or the formGroyp as * both values should be identical. If they arn't then there is a bug in * your updateTupleFromFormGroup call. * * Example: Disable one control based on the value of another control * being null. * * ``` * if (formGroup.get('control_1').value == null) { * formGroup.get('control_2').disable(); * } else { * formGroup.get('control_2').enable(); * } * ``` * * @param {FormGroup} formGroup - The form group to update validation for. * * @return {void} */ updateValidation(formGroup) { } /** * Updates the values of a FormGroup with the values from a given tuple. * * This method is unused at present. * * @param {FormGroup} formGroup - The FormGroup to be updated. * @param {any} tuple - The tuple containing the updated values. * * @return {void} */ static updateTupleToFormGroup(formGroup, tuple) { formGroup.patchValue(tuple); } /** * Updates the values of a tuple based on the provided changes object. * Recursively updates nested objects. * * Example: * ``` * return TupleDataLoaderTupleABC.updateTupleFromFormGroup( * changes, * this.step, * { * parameterMap: StepParameterMappingUiTuple, * links: StepGroupSubStepLinkUiTuple, * makoFileNames: null, * makoParameters: StepPushDesignFileCompiledParamUiTuple, * }, * ); * ``` * * @param changes - The changes object containing a deep stricture of the * updated values. * @param tuple - The tuple to be updated. * @param TupleTypeByFieldName - The dictionary mapping field names to * tuple types. * @return {boolean} - Returns true if any changes were found and * applied, false otherwise. * @throws {Error} - Throws an error if no TupleTypeByFieldName entry is * found for an array. */ static updateTupleFromFormGroup(changes, tuple, TupleTypeByFieldName = {}) { if (tuple == null) { return; } let changesFound = false; for (const key of Object.keys(changes)) { if (Array.isArray(changes[key])) { const changesArray = changes[key]; let tupleArray = tuple[key]; if (tupleArray?.length !== changesArray.length) { changesFound = true; console.log(`updateTupleFromFormGroup: Key '${key}', ` + ` found different array sizes` + ` tuple=${tupleArray?.length}` + ` form=${changesArray?.length}`); } const TupleType = TupleTypeByFieldName[key]; if (TupleType === undefined) { throw new Error(`No TupleTypeByFieldName entry for` + ` field ${key}`); } // null means just use the value, like string[] if (TupleType === null) { if (JSON.stringify(tupleArray) !== JSON.stringify(changesArray)) { changesFound = true; console.log(`updateTupleFromFormGroup: Key '${key}', ` + ` found different values in scalar array` + ` tuple=${JSON.stringify(tupleArray)}` + ` form=${JSON.stringify(changesArray)}`); } tuple[key] = changes[key]; continue; } if (!Array.isArray(tupleArray)) { tupleArray = []; tuple[key] = tupleArray; } while (tupleArray.length > changesArray.length) { tupleArray.pop(); } while (tupleArray.length < changesArray.length) { tupleArray.push(new TupleType()); } for (let i = 0; i < changesArray.length; i++) { changesFound = changesFound || this.updateTupleFromFormGroup(changesArray[i], tupleArray[i], TupleTypeByFieldName); } continue; } if (tuple[key] !== changes[key]) { changesFound = true; console.log(`updateTupleFromFormGroup: Key '${key}', ` + ` found different values ` + ` tuple=${tuple[key]}` + ` form=${changes[key]}`); tuple[key] = changes[key]; // noinspection UnnecessaryContinueJS continue; } } return changesFound; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHVwbGVEYXRhTG9hZGVyVHVwbGVBQkMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdm9ydGV4L2RhdGEtbG9hZGVyL1R1cGxlRGF0YUxvYWRlclR1cGxlQUJDLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHakMsTUFBTSxPQUFnQix1QkFBd0IsU0FBUSxLQUFLO0lBQ3ZELFlBQXNCLFNBQWlCO1FBQ25DLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGVBQWU7UUFDWCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsbUJBQW1CLENBQUMsT0FBVztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BMEJHO0lBQ0gsZ0JBQWdCLENBQUMsU0FBb0IsSUFBUyxDQUFDO0lBRS9DOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxTQUFvQixFQUFFLEtBQVU7UUFDMUQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNILE1BQU0sQ0FBQyx3QkFBd0IsQ0FDM0IsT0FBVyxFQUNYLEtBQVksRUFDWix1QkFBMkIsRUFBRTtRQUU3QixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFDRCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3BDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENB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cG9ydCB7IFR1cGxlIH0gZnJvbSBcIi4uL1R1cGxlXCI7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFR1cGxlRGF0YUxvYWRlclR1cGxlQUJDIGV4dGVuZHMgVHVwbGUge1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih0dXBsZU5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcih0dXBsZU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRm9ybUdyb3VwIHRvIGVuYWJsZSBSZWFjdGl2ZUZvcm1zIHZhbGlkYXRpb24uXG4gICAgICpcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0Zvcm1Hcm91cH0gLSBUaGUgbmV3bHkgY3JlYXRlZCBGb3JtR3JvdXBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIG9yIG51bGwgb2YgZm9ybUdyb3VwIHZhbGlkYXRpb24gaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbm90IHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGNyZWF0ZUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBmb3JtIGdyb3VwIHdpdGggdGhlIGdpdmVuIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBJZiBjcmVhdGVGb3JtR3JvdXAgcmV0dXJucyBudWxsLCB0aGlzIG1ldGhvZFxuICAgICAqIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZXMgLSBUaGUgY2hhbmdlcyB0byBhcHBseSB0byB0aGUgZm9ybSBncm91cC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIFJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWZcbiAgICAgKiB0aGVyZSB3ZXJlIGRpZmZlcmVuY2VzIHRvIHVwZGF0ZS5cbiAgICAgKi9cbiAgICB1cGRhdGVGcm9tRm9ybUdyb3VwKGNoYW5nZXM6IHt9KTogYm9vbGVhbiB8IG51bGwge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHZhbGlkYXRpb24gb2YgYSBmb3JtIGdyb3VwLlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIGRhdGEgaW4gdGhlIGZvcm0gZ3JvdXAgY2hhbmdlcywgYW5kIGFmdGVyIHRob3NlXG4gICAgICogY2hhbmdlcyBoYXZlIGJlZW4gc3luY2hyb25pc2VkIHRvIHRoaXMgZGF0YSB0dXBsZS5cbiAgICAgKlxuICAgICAqIFVwZGF0ZXMgb2YgYW55IGtpbmQgbXVzdCBiZSBtYWRlIHRvIHRoZSBmb3JtR3JvdXAgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBWYWx1ZSByZWFkcyBtYXkgYmUgcGVyZm9ybWVkIG9uIGVpdGhlciB0aGlzIHR1cGxlIG9yIHRoZSBmb3JtR3JveXAgYXNcbiAgICAgKiBib3RoIHZhbHVlcyBzaG91bGQgYmUgaWRlbnRpY2FsLiBJZiB0aGV5IGFybid0IHRoZW4gdGhlcmUgaXMgYSBidWcgaW5cbiAgICAgKiB5b3VyIHVwZGF0ZVR1cGxlRnJvbUZvcm1Hcm91cCBjYWxsLlxuICAgICAqXG4gICAgICogRXhhbXBsZTogRGlzYWJsZSBvbmUgY29udHJvbCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgYW5vdGhlciBjb250cm9sXG4gICAgICogIGJlaW5nIG51bGwuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBpZiAoZm9ybUdyb3VwLmdldCgnY29udHJvbF8xJykudmFsdWUgPT0gbnVsbCkge1xuICAgICAqICAgZm9ybUdyb3VwLmdldCgnY29udHJvbF8yJykuZGlzYWJsZSgpO1xuICAgICAqIH0gZWxzZSB7XG4gICAgICogICBmb3JtR3JvdXAuZ2V0KCdjb250cm9sXzInKS5lbmFibGUoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Zvcm1Hcm91cH0gZm9ybUdyb3VwIC0gVGhlIGZvcm0gZ3JvdXAgdG8gdXBkYXRlIHZhbGlkYXRpb24gZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICB1cGRhdGVWYWxpZGF0aW9uKGZvcm1Hcm91cDogRm9ybUdyb3VwKTogdm9pZCB7fVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIGEgRm9ybUdyb3VwIHdpdGggdGhlIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gdHVwbGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1bnVzZWQgYXQgcHJlc2VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgRm9ybUdyb3VwIHRvIGJlIHVwZGF0ZWQuXG4gICAgICogQHBhcmFtIHthbnl9IHR1cGxlIC0gVGhlIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHVwZGF0ZWQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dm9pZH1cbiAgICAgKi9cbiAgICBzdGF0aWMgdXBkYXRlVHVwbGVUb0Zvcm1Hcm91cChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgdHVwbGU6IGFueSk6IHZvaWQge1xuICAgICAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZSh0dXBsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgdmFsdWVzIG9mIGEgdHVwbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNoYW5nZXMgb2JqZWN0LlxuICAgICAqIFJlY3Vyc2l2ZWx5IHVwZGF0ZXMgbmVzdGVkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIGBgYFxuICAgICAqICAgICAgICAgcmV0dXJuIFR1cGxlRGF0YUxvYWRlclR1cGxlQUJDLnVwZGF0ZVR1cGxlRnJvbUZvcm1Hcm91cChcbiAgICAgKiAgICAgICAgICAgICBjaGFuZ2VzLFxuICAgICAqICAgICAgICAgICAgIHRoaXMuc3RlcCxcbiAgICAgKiAgICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlck1hcDogU3RlcFBhcmFtZXRlck1hcHBpbmdVaVR1cGxlLFxuICAgICAqICAgICAgICAgICAgICAgICBsaW5rczogU3RlcEdyb3VwU3ViU3RlcExpbmtVaVR1cGxlLFxuICAgICAqICAgICAgICAgICAgICAgICBtYWtvRmlsZU5hbWVzOiBudWxsLFxuICAgICAqICAgICAgICAgICAgICAgICBtYWtvUGFyYW1ldGVyczogU3RlcFB1c2hEZXNpZ25GaWxlQ29tcGlsZWRQYXJhbVVpVHVwbGUsXG4gICAgICogICAgICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgICk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyAtIFRoZSBjaGFuZ2VzIG9iamVjdCBjb250YWluaW5nIGEgZGVlcCBzdHJpY3R1cmUgb2YgdGhlXG4gICAgICogdXBkYXRlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHR1cGxlIC0gVGhlIHR1cGxlIHRvIGJlIHVwZGF0ZWQuXG4gICAgICogQHBhcmFtIFR1cGxlVHlwZUJ5RmllbGROYW1lIC0gVGhlIGRpY3Rpb25hcnkgbWFwcGluZyBmaWVsZCBuYW1lcyB0b1xuICAgICAqIHR1cGxlIHR5cGVzLlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gUmV0dXJucyB0cnVlIGlmIGFueSBjaGFuZ2VzIHdlcmUgZm91bmQgYW5kXG4gICAgICogYXBwbGllZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiBubyBUdXBsZVR5cGVCeUZpZWxkTmFtZSBlbnRyeSBpc1xuICAgICAqIGZvdW5kIGZvciBhbiBhcnJheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdXBkYXRlVHVwbGVGcm9tRm9ybUdyb3VwKFxuICAgICAgICBjaGFuZ2VzOiB7fSxcbiAgICAgICAgdHVwbGU6IFR1cGxlLFxuICAgICAgICBUdXBsZVR5cGVCeUZpZWxkTmFtZToge30gPSB7fSxcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR1cGxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hhbmdlc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNoYW5nZXMpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFuZ2VzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc0FycmF5ID0gY2hhbmdlc1trZXldO1xuICAgICAgICAgICAgICAgIGxldCB0dXBsZUFycmF5ID0gdHVwbGVba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHVwbGVBcnJheT8ubGVuZ3RoICE9PSBjaGFuZ2VzQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXNGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZVR1cGxlRnJvbUZvcm1Hcm91cDogS2V5ICcke2tleX0nLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIGZvdW5kIGRpZmZlcmVudCBhcnJheSBzaXplc2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgdHVwbGU9JHt0dXBsZUFycmF5Py5sZW5ndGh9YCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCBmb3JtPSR7Y2hhbmdlc0FycmF5Py5sZW5ndGh9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBUdXBsZVR5cGUgPSBUdXBsZVR5cGVCeUZpZWxkTmFtZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChUdXBsZVR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgTm8gVHVwbGVUeXBlQnlGaWVsZE5hbWUgZW50cnkgZm9yYCArIGAgZmllbGQgJHtrZXl9YCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBudWxsIG1lYW5zIGp1c3QgdXNlIHRoZSB2YWx1ZSwgbGlrZSBzdHJpbmdbXVxuICAgICAgICAgICAgICAgIGlmIChUdXBsZVR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodHVwbGVBcnJheSkgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2VzQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGVUdXBsZUZyb21Gb3JtR3JvdXA6IEtleSAnJHtrZXl9JywgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgZm91bmQgZGlmZmVyZW50IHZhbHVlcyBpbiBzY2FsYXIgYXJyYXlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCB0dXBsZT0ke0pTT04uc3RyaW5naWZ5KHR1cGxlQXJyYXkpfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIGZvcm09JHtKU09OLnN0cmluZ2lmeShjaGFuZ2VzQXJyYXkpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdHVwbGVba2V5XSA9IGNoYW5nZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR1cGxlQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR1cGxlQXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdHVwbGVba2V5XSA9IHR1cGxlQXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHR1cGxlQXJyYXkubGVuZ3RoID4gY2hhbmdlc0FycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0dXBsZUFycmF5LnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAodHVwbGVBcnJheS5sZW5ndGggPCBjaGFuZ2VzQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHR1cGxlQXJyYXkucHVzaChuZXcgVHVwbGVUeXBlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzRm91bmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc0ZvdW5kIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVR1cGxlRnJvbUZvcm1Hcm91cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzQXJyYXlbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVBcnJheVtpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUdXBsZVR5cGVCeUZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHVwbGVba2V5XSAhPT0gY2hhbmdlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYHVwZGF0ZVR1cGxlRnJvbUZvcm1Hcm91cDogS2V5ICcke2tleX0nLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgZm91bmQgZGlmZmVyZW50IHZhbHVlcyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAgdHVwbGU9JHt0dXBsZVtrZXldfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCBmb3JtPSR7Y2hhbmdlc1trZXldfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0dXBsZVtrZXldID0gY2hhbmdlc1trZXldO1xuICAgICAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBVbm5lY2Vzc2FyeUNvbnRpbnVlSlNcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGFuZ2VzRm91bmQ7XG4gICAgfVxufVxuIl19