gy-foo
Version:
A library that contains all models for the gy-web-project.
208 lines • 23.4 kB
JavaScript
import { Occurrence } from './occurrence.model';
import { ModeFlags } from '../enums/modeFlags.enum';
export class Entity {
constructor(entity, keepModes = true) {
if (entity) {
if (entity instanceof Entity) {
this.structure = entity.getStructure();
this.occs = this.convertOccurences(entity.getOccs(), keepModes) || [];
}
else {
this.structure = entity.structure;
this.occs = this.convertOccurences(entity.occs, keepModes) || [];
}
}
else {
this.structure = {};
this.occs = [];
}
}
/**
* Checks if entity has the structure of an entity
* @param entity entity to check
*/
static isEntity(entity) {
return entity && entity.occs ? true : false;
}
/**
* Gets the number of the Occurrences of this Entity
*/
getOccsLength() {
return this.occs.length;
}
/**
* Get all Occurences of this entity.
*/
getOccs() {
return this.occs;
}
/**
* Sets all Occurrences of the Entity to the given array.
* @param occs array of the new Occurrences
*/
setOccs(occs) {
this.occs = occs;
}
/**
* Checks if the given occurence is in this Entity
* @param pk the pk of the occurrence
*/
hasOcc(pk) {
return this.occs.find((occ) => occ.getPk() === pk) != null;
}
/**
* Sets the given Occurence on the given value. If pk is missing, the first Occurrence is set.
* @param occ the new Occurrence
* @param pk the pk of the Occurrence
*/
setOcc(occ, pk) {
if (pk) {
this.occs = this.occs.map((oldOcc) => {
if (oldOcc.getPk() === pk) {
return occ;
}
else {
return oldOcc;
}
});
}
else {
this.occs[0] = occ;
}
}
/**
* Gets the Occurrence with the given pk, if no pk is given it gets the first Occurence
* @param pk PK of the Occurrence
*/
getOcc(pk) {
if (pk) {
return this.occs.find((occ) => occ.getPk() === pk);
}
else {
let occ;
if (this.occs && this.occs.length > 0) {
occ = this.occs[0];
}
else {
occ = new Occurrence();
this.addOcc(occ);
}
return occ;
}
}
/**
* Gets the structure of the Entity
*/
getStructure() {
return this.structure;
}
/**
* Adds an Occurrence to the Entity
* @param occ the new Occurrence
* @param modeFlag decides, if the add mode should be set for occ
* @param isUserChange is that a User Change
* @returns the pk of the new Occ
*/
addOcc(occ, add, isUserChange) {
const addFlag = add !== undefined && add !== null ? add : true;
if (!occ) {
occ = new Occurrence();
}
occ.setMode({ add: addFlag });
if (isUserChange) {
occ.setModified(true, false);
}
if (!occ.getPk()) {
let pk = 'new_';
let index = 1;
this.occs.forEach((occ) => {
if (occ.getPk().substr(0, 4) === 'new_' && Number(occ.getPk().substr(4)) >= index) {
index = Number(occ.getPk().substr(4)) + 1;
}
});
pk += index;
occ.addPk(pk);
}
if (!occ.getStructure() || !Object.keys(occ.getStructure()).length) {
occ.setStructure(this.structure);
}
const occIndex = this.occs.findIndex((o) => o.getPk() === occ.getPk());
if (occIndex >= 0) {
this.occs[occIndex] = occ;
}
else {
this.occs.push(occ);
}
return occ.getPk();
}
/**
* Copys an Occurrence to the Entity
* @param pk pk of the occurrence that should be copied
* @param modeFlag decides, if the copy mode should be set for the new occ
* @param isUserChange is this a User Change?
* @returns the pk of the new Occ
*/
copyOcc(pk, cpy, isUserChange) {
let cpyFlag = cpy !== undefined && cpy !== null ? cpy : true;
const occ = this.getOcc(pk);
const addFlag = occ.getMode() === 'add';
if (addFlag) {
cpyFlag = false;
}
const copyCount = this.occs.filter((o) => o.getPk().search(new RegExp('^(?:copy_)?' + occ.getPk())) >= 0).length;
const copyOcc = new Occurrence({
pk: 'copy_' + occ.getPk() + '#' + copyCount,
data: Object.assign({}, occ.getData()),
structure: occ.getStructure(),
meta: occ.getMeta(),
}, { add: addFlag, cpy: cpyFlag });
if (isUserChange) {
occ.setModified(true, false);
}
this.occs.push(copyOcc);
return copyOcc.getPk();
}
/**
* Adds the Occurrences of an Entity to this Occurrences
* @param entity the Entity that should be added
*/
addEntity(entity) {
this.occs.push(...this.convertOccurences(entity.occs).filter((occ) => !this.hasOcc(occ.getPk())));
}
convertOccurences(occs, keepModes = true) {
return occs.map((occ) => {
return occ instanceof Occurrence
? occ
: new Occurrence(occ.pk ? occ : { pk: occ._pk, data: occ, structure: this.structure || {} }, keepModes
? {
add: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.ADD,
cpy: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.CPY,
del: (occ.data != null ? occ.data._mode : occ._mode) === ModeFlags.DEL,
}
: null);
});
}
/**
* Sets the modified flag for all occs in the entity
* @param modified occ is modified?
* @param setSubEntites should the modified flag be set also in the subentites? (default: false)
*/
setModified(modified, setSubEntites = false) {
for (const occ of this.getOccs()) {
occ.setModified(modified, setSubEntites);
}
}
/**
* Has the Entity been modified?
* @param checkSubEnt check Subentities (default: true)
*/
isModified(checkSubEnt = true) {
for (const occ of this.getOccs()) {
if (occ.isModified(checkSubEnt)) {
return true;
}
}
return false;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ3ktZm9vLyIsInNvdXJjZXMiOlsibGliL21vZGVscy9lbnRpdHkubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sTUFBTTtJQUlqQixZQUFZLE1BQXFFLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDakcsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLE1BQU0sWUFBWSxNQUFNLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3ZFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDbEU7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFjO1FBQzVCLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxJQUFrQjtRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQWUsRUFBRSxFQUFXO1FBQ2pDLElBQUksRUFBRSxFQUFFO1lBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3pCLE9BQU8sR0FBRyxDQUFDO2lCQUNaO3FCQUFNO29CQUNMLE9BQU8sTUFBTSxDQUFDO2lCQUNmO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEVBQVc7UUFDaEIsSUFBSSxFQUFFLEVBQUU7WUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNMLElBQUksR0FBRyxDQUFDO1lBQ1IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDckMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsR0FBRyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDbEI7WUFDRCxPQUFPLEdBQUcsQ0FBQztTQUNaO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEdBQWdCLEVBQUUsR0FBYSxFQUFFLFlBQXNCO1FBQzVELE1BQU0sT0FBTyxHQUFHLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0QsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1NBQ3hCO1FBQ0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksWUFBWSxFQUFFO1lBQ2hCLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFDaEIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUU7b0JBQ2pGLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDM0M7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILEVBQUUsSUFBSSxLQUFLLENBQUM7WUFDWixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2Y7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDbEUsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbEM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckI7UUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLEVBQVUsRUFBRSxHQUFhLEVBQUUsWUFBc0I7UUFDdkQsSUFBSSxPQUFPLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxLQUFLLENBQUM7UUFDeEMsSUFBSSxPQUFPLEVBQUU7WUFDWCxPQUFPLEdBQUcsS0FBSyxDQUFDO1NBQ2pCO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRWpILE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUM1QjtZQUNFLEVBQUUsRUFBRSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEdBQUcsR0FBRyxTQUFTO1lBQzNDLElBQUksb0JBQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFFO1lBQzFCLFNBQVMsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFO1lBQzdCLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFO1NBQ3BCLEVBQ0QsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FDL0IsQ0FBQztRQUNGLElBQUksWUFBWSxFQUFFO1lBQ2hCLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUVPLGlCQUFpQixDQUN2QixJQUFzRixFQUN0RixTQUFTLEdBQUcsSUFBSTtRQUVoQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QixPQUFPLEdBQUcsWUFBWSxVQUFVO2dCQUM5QixDQUFDLENBQUMsR0FBRztnQkFDTCxDQUFDLENBQUMsSUFBSSxVQUFVLENBQ1osR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLEVBQzFFLFNBQVM7b0JBQ1AsQ0FBQyxDQUFDO3dCQUNFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHO3dCQUN0RSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxTQUFTLENBQUMsR0FBRzt3QkFDdEUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLEdBQUc7cUJBQ3ZFO29CQUNILENBQUMsQ0FBQyxJQUFJLENBQ1QsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsUUFBaUIsRUFBRSxnQkFBeUIsS0FBSztRQUMzRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsY0FBdUIsSUFBSTtRQUNwQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNoQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2NjdXJyZW5jZSB9IGZyb20gJy4vb2NjdXJyZW5jZS5tb2RlbCc7XG5pbXBvcnQgeyBFbnRpdHlTdHJ1Y3R1cmUgfSBmcm9tICcuL2VudGl0eVN0cnVjdHVyZS5tb2RlbCc7XG5pbXBvcnQgeyBNb2RlRmxhZ3MgfSBmcm9tICcuLi9lbnVtcy9tb2RlRmxhZ3MuZW51bSc7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBwcml2YXRlIG9jY3M6IE9jY3VycmVuY2VbXTtcbiAgcHJpdmF0ZSBzdHJ1Y3R1cmU6IEVudGl0eVN0cnVjdHVyZTtcblxuICBjb25zdHJ1Y3RvcihlbnRpdHk/OiB7IHN0cnVjdHVyZTogRW50aXR5U3RydWN0dXJlOyBvY2NzPzogT2NjdXJyZW5jZVtdIH0gfCBFbnRpdHksIGtlZXBNb2RlcyA9IHRydWUpIHtcbiAgICBpZiAoZW50aXR5KSB7XG4gICAgICBpZiAoZW50aXR5IGluc3RhbmNlb2YgRW50aXR5KSB7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlID0gZW50aXR5LmdldFN0cnVjdHVyZSgpO1xuICAgICAgICB0aGlzLm9jY3MgPSB0aGlzLmNvbnZlcnRPY2N1cmVuY2VzKGVudGl0eS5nZXRPY2NzKCksIGtlZXBNb2RlcykgfHwgW107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IGVudGl0eS5zdHJ1Y3R1cmU7XG4gICAgICAgIHRoaXMub2NjcyA9IHRoaXMuY29udmVydE9jY3VyZW5jZXMoZW50aXR5Lm9jY3MsIGtlZXBNb2RlcykgfHwgW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlID0ge307XG4gICAgICB0aGlzLm9jY3MgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGVudGl0eSBoYXMgdGhlIHN0cnVjdHVyZSBvZiBhbiBlbnRpdHlcbiAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgdG8gY2hlY2tcbiAgICovXG4gIHN0YXRpYyBpc0VudGl0eShlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiBlbnRpdHkgJiYgZW50aXR5Lm9jY3MgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRoZSBPY2N1cnJlbmNlcyBvZiB0aGlzIEVudGl0eVxuICAgKi9cbiAgZ2V0T2Njc0xlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5vY2NzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIE9jY3VyZW5jZXMgb2YgdGhpcyBlbnRpdHkuXG4gICAqL1xuICBnZXRPY2NzKCkge1xuICAgIHJldHVybiB0aGlzLm9jY3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhbGwgT2NjdXJyZW5jZXMgb2YgdGhlIEVudGl0eSB0byB0aGUgZ2l2ZW4gYXJyYXkuXG4gICAqIEBwYXJhbSBvY2NzIGFycmF5IG9mIHRoZSBuZXcgT2NjdXJyZW5jZXNcbiAgICovXG4gIHNldE9jY3Mob2NjczogT2NjdXJyZW5jZVtdKSB7XG4gICAgdGhpcy5vY2NzID0gb2NjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9jY3VyZW5jZSBpcyBpbiB0aGlzIEVudGl0eVxuICAgKiBAcGFyYW0gcGsgdGhlIHBrIG9mIHRoZSBvY2N1cnJlbmNlXG4gICAqL1xuICBoYXNPY2MocGs6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9jY3MuZmluZCgob2NjKSA9PiBvY2MuZ2V0UGsoKSA9PT0gcGspICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ2l2ZW4gT2NjdXJlbmNlIG9uIHRoZSBnaXZlbiB2YWx1ZS4gSWYgcGsgaXMgbWlzc2luZywgdGhlIGZpcnN0IE9jY3VycmVuY2UgaXMgc2V0LlxuICAgKiBAcGFyYW0gb2NjIHRoZSBuZXcgT2NjdXJyZW5jZVxuICAgKiBAcGFyYW0gcGsgdGhlIHBrIG9mIHRoZSBPY2N1cnJlbmNlXG4gICAqL1xuICBzZXRPY2Mob2NjOiBPY2N1cnJlbmNlLCBwaz86IHN0cmluZykge1xuICAgIGlmIChwaykge1xuICAgICAgdGhpcy5vY2NzID0gdGhpcy5vY2NzLm1hcCgob2xkT2NjKSA9PiB7XG4gICAgICAgIGlmIChvbGRPY2MuZ2V0UGsoKSA9PT0gcGspIHtcbiAgICAgICAgICByZXR1cm4gb2NjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvbGRPY2M7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9jY3NbMF0gPSBvY2M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIE9jY3VycmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGssIGlmIG5vIHBrIGlzIGdpdmVuIGl0IGdldHMgdGhlIGZpcnN0IE9jY3VyZW5jZVxuICAgKiBAcGFyYW0gcGsgUEsgb2YgdGhlIE9jY3VycmVuY2VcbiAgICovXG4gIGdldE9jYyhwaz86IHN0cmluZyk6IE9jY3VycmVuY2Uge1xuICAgIGlmIChwaykge1xuICAgICAgcmV0dXJuIHRoaXMub2Njcy5maW5kKChvY2MpID0+IG9jYy5nZXRQaygpID09PSBwayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBvY2M7XG4gICAgICBpZiAodGhpcy5vY2NzICYmIHRoaXMub2Njcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9jYyA9IHRoaXMub2Njc1swXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9jYyA9IG5ldyBPY2N1cnJlbmNlKCk7XG4gICAgICAgIHRoaXMuYWRkT2NjKG9jYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2NjO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIEVudGl0eVxuICAgKi9cbiAgZ2V0U3RydWN0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIE9jY3VycmVuY2UgdG8gdGhlIEVudGl0eVxuICAgKiBAcGFyYW0gb2NjIHRoZSBuZXcgT2NjdXJyZW5jZVxuICAgKiBAcGFyYW0gbW9kZUZsYWcgZGVjaWRlcywgaWYgdGhlIGFkZCBtb2RlIHNob3VsZCBiZSBzZXQgZm9yIG9jY1xuICAgKiBAcGFyYW0gaXNVc2VyQ2hhbmdlIGlzIHRoYXQgYSBVc2VyIENoYW5nZVxuICAgKiBAcmV0dXJucyB0aGUgcGsgb2YgdGhlIG5ldyBPY2NcbiAgICovXG4gIGFkZE9jYyhvY2M/OiBPY2N1cnJlbmNlLCBhZGQ/OiBib29sZWFuLCBpc1VzZXJDaGFuZ2U/OiBib29sZWFuKSB7XG4gICAgY29uc3QgYWRkRmxhZyA9IGFkZCAhPT0gdW5kZWZpbmVkICYmIGFkZCAhPT0gbnVsbCA/IGFkZCA6IHRydWU7XG4gICAgaWYgKCFvY2MpIHtcbiAgICAgIG9jYyA9IG5ldyBPY2N1cnJlbmNlKCk7XG4gICAgfVxuICAgIG9jYy5zZXRNb2RlKHsgYWRkOiBhZGRGbGFnIH0pO1xuICAgIGlmIChpc1VzZXJDaGFuZ2UpIHtcbiAgICAgIG9jYy5zZXRNb2RpZmllZCh0cnVlLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmICghb2NjLmdldFBrKCkpIHtcbiAgICAgIGxldCBwayA9ICduZXdfJztcbiAgICAgIGxldCBpbmRleCA9IDE7XG4gICAgICB0aGlzLm9jY3MuZm9yRWFjaCgob2NjKSA9PiB7XG4gICAgICAgIGlmIChvY2MuZ2V0UGsoKS5zdWJzdHIoMCwgNCkgPT09ICduZXdfJyAmJiBOdW1iZXIob2NjLmdldFBrKCkuc3Vic3RyKDQpKSA+PSBpbmRleCkge1xuICAgICAgICAgIGluZGV4ID0gTnVtYmVyKG9jYy5nZXRQaygpLnN1YnN0cig0KSkgKyAxO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHBrICs9IGluZGV4O1xuICAgICAgb2NjLmFkZFBrKHBrKTtcbiAgICB9XG5cbiAgICBpZiAoIW9jYy5nZXRTdHJ1Y3R1cmUoKSB8fCAhT2JqZWN0LmtleXMob2NjLmdldFN0cnVjdHVyZSgpKS5sZW5ndGgpIHtcbiAgICAgIG9jYy5zZXRTdHJ1Y3R1cmUodGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cblxuICAgIGNvbnN0IG9jY0luZGV4ID0gdGhpcy5vY2NzLmZpbmRJbmRleCgobykgPT4gby5nZXRQaygpID09PSBvY2MuZ2V0UGsoKSk7XG4gICAgaWYgKG9jY0luZGV4ID49IDApIHtcbiAgICAgIHRoaXMub2Njc1tvY2NJbmRleF0gPSBvY2M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2Njcy5wdXNoKG9jYyk7XG4gICAgfVxuICAgIHJldHVybiBvY2MuZ2V0UGsoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5cyBhbiBPY2N1cnJlbmNlIHRvIHRoZSBFbnRpdHlcbiAgICogQHBhcmFtIHBrIHBrIG9mIHRoZSBvY2N1cnJlbmNlIHRoYXQgc2hvdWxkIGJlIGNvcGllZFxuICAgKiBAcGFyYW0gbW9kZUZsYWcgZGVjaWRlcywgaWYgdGhlIGNvcHkgbW9kZSBzaG91bGQgYmUgc2V0IGZvciB0aGUgbmV3IG9jY1xuICAgKiBAcGFyYW0gaXNVc2VyQ2hhbmdlIGlzIHRoaXMgYSBVc2VyIENoYW5nZT9cbiAgICogQHJldHVybnMgdGhlIHBrIG9mIHRoZSBuZXcgT2NjXG4gICAqL1xuICBjb3B5T2NjKHBrOiBzdHJpbmcsIGNweT86IGJvb2xlYW4sIGlzVXNlckNoYW5nZT86IGJvb2xlYW4pIHtcbiAgICBsZXQgY3B5RmxhZyA9IGNweSAhPT0gdW5kZWZpbmVkICYmIGNweSAhPT0gbnVsbCA/IGNweSA6IHRydWU7XG4gICAgY29uc3Qgb2NjID0gdGhpcy5nZXRPY2MocGspO1xuICAgIGNvbnN0IGFkZEZsYWcgPSBvY2MuZ2V0TW9kZSgpID09PSAnYWRkJztcbiAgICBpZiAoYWRkRmxhZykge1xuICAgICAgY3B5RmxhZyA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb3B5Q291bnQgPSB0aGlzLm9jY3MuZmlsdGVyKChvKSA9PiBvLmdldFBrKCkuc2VhcmNoKG5ldyBSZWdFeHAoJ14oPzpjb3B5Xyk/JyArIG9jYy5nZXRQaygpKSkgPj0gMCkubGVuZ3RoO1xuXG4gICAgY29uc3QgY29weU9jYyA9IG5ldyBPY2N1cnJlbmNlKFxuICAgICAge1xuICAgICAgICBwazogJ2NvcHlfJyArIG9jYy5nZXRQaygpICsgJyMnICsgY29weUNvdW50LFxuICAgICAgICBkYXRhOiB7IC4uLm9jYy5nZXREYXRhKCkgfSxcbiAgICAgICAgc3RydWN0dXJlOiBvY2MuZ2V0U3RydWN0dXJlKCksXG4gICAgICAgIG1ldGE6IG9jYy5nZXRNZXRhKCksXG4gICAgICB9LFxuICAgICAgeyBhZGQ6IGFkZEZsYWcsIGNweTogY3B5RmxhZyB9XG4gICAgKTtcbiAgICBpZiAoaXNVc2VyQ2hhbmdlKSB7XG4gICAgICBvY2Muc2V0TW9kaWZpZWQodHJ1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLm9jY3MucHVzaChjb3B5T2NjKTtcbiAgICByZXR1cm4gY29weU9jYy5nZXRQaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIE9jY3VycmVuY2VzIG9mIGFuIEVudGl0eSB0byB0aGlzIE9jY3VycmVuY2VzXG4gICAqIEBwYXJhbSBlbnRpdHkgdGhlIEVudGl0eSB0aGF0IHNob3VsZCBiZSBhZGRlZFxuICAgKi9cbiAgYWRkRW50aXR5KGVudGl0eTogRW50aXR5KSB7XG4gICAgdGhpcy5vY2NzLnB1c2goLi4udGhpcy5jb252ZXJ0T2NjdXJlbmNlcyhlbnRpdHkub2NjcykuZmlsdGVyKChvY2MpID0+ICF0aGlzLmhhc09jYyhvY2MuZ2V0UGsoKSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydE9jY3VyZW5jZXMoXG4gICAgb2NjczogKE9jY3VycmVuY2UgfCB7IHBrOiBzdHJpbmc7IHN0cnVjdHVyZTogRW50aXR5U3RydWN0dXJlOyBkYXRhPzogb2JqZWN0IH0gfCBhbnkpW10sXG4gICAga2VlcE1vZGVzID0gdHJ1ZVxuICApOiBPY2N1cnJlbmNlW10ge1xuICAgIHJldHVybiBvY2NzLm1hcCgob2NjKSA9PiB7XG4gICAgICByZXR1cm4gb2NjIGluc3RhbmNlb2YgT2NjdXJyZW5jZVxuICAgICAgICA/IG9jY1xuICAgICAgICA6IG5ldyBPY2N1cnJlbmNlKFxuICAgICAgICAgICAgb2NjLnBrID8gb2NjIDogeyBwazogb2NjLl9waywgZGF0YTogb2NjLCBzdHJ1Y3R1cmU6IHRoaXMuc3RydWN0dXJlIHx8IHt9IH0sXG4gICAgICAgICAgICBrZWVwTW9kZXNcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBhZGQ6IChvY2MuZGF0YSAhPSBudWxsID8gb2NjLmRhdGEuX21vZGUgOiBvY2MuX21vZGUpID09PSBNb2RlRmxhZ3MuQURELFxuICAgICAgICAgICAgICAgICAgY3B5OiAob2NjLmRhdGEgIT0gbnVsbCA/IG9jYy5kYXRhLl9tb2RlIDogb2NjLl9tb2RlKSA9PT0gTW9kZUZsYWdzLkNQWSxcbiAgICAgICAgICAgICAgICAgIGRlbDogKG9jYy5kYXRhICE9IG51bGwgPyBvY2MuZGF0YS5fbW9kZSA6IG9jYy5fbW9kZSkgPT09IE1vZGVGbGFncy5ERUwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG1vZGlmaWVkIGZsYWcgZm9yIGFsbCBvY2NzIGluIHRoZSBlbnRpdHlcbiAgICogQHBhcmFtIG1vZGlmaWVkIG9jYyBpcyBtb2RpZmllZD9cbiAgICogQHBhcmFtIHNldFN1YkVudGl0ZXMgc2hvdWxkIHRoZSBtb2RpZmllZCBmbGFnIGJlIHNldCBhbHNvIGluIHRoZSBzdWJlbnRpdGVzPyAoZGVmYXVsdDogZmFsc2UpXG4gICAqL1xuICBzZXRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbiwgc2V0U3ViRW50aXRlczogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvY2Mgb2YgdGhpcy5nZXRPY2NzKCkpIHtcbiAgICAgIG9jYy5zZXRNb2RpZmllZChtb2RpZmllZCwgc2V0U3ViRW50aXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhcyB0aGUgRW50aXR5IGJlZW4gbW9kaWZpZWQ/XG4gICAqIEBwYXJhbSBjaGVja1N1YkVudCBjaGVjayBTdWJlbnRpdGllcyAoZGVmYXVsdDogdHJ1ZSlcbiAgICovXG4gIGlzTW9kaWZpZWQoY2hlY2tTdWJFbnQ6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBvY2Mgb2YgdGhpcy5nZXRPY2NzKCkpIHtcbiAgICAgIGlmIChvY2MuaXNNb2RpZmllZChjaGVja1N1YkVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19