@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
163 lines • 19 kB
JavaScript
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