UNPKG

@tricoteuses/assemblee

Version:

Retrieve, clean up & handle French Assemblée nationale's open data

337 lines (335 loc) 50 kB
function insertActeLegislatifReferences(acte, data, visitedUids) { if (!visitedUids.has(acte.uid)) { visitedUids.add(acte.uid); if (data.documentByUid !== undefined && acte.depotInitialLectureDefinitiveRef !== undefined) { const document = data.documentByUid[acte.depotInitialLectureDefinitiveRef]; if (document !== undefined) { acte.depotInitialLectureDefinitive = document; insertDocumentReferences(document, data, visitedUids); } } if (data.organeByUid !== undefined && acte.organeRef !== undefined) { const organe = data.organeByUid[acte.organeRef]; if (organe !== undefined) { acte.organe = organe; insertOrganeReferences(organe, data, visitedUids); } } if (data.organeByUid !== undefined && acte.provenanceRef !== undefined) { const organe = data.organeByUid[acte.provenanceRef]; if (organe !== undefined) { acte.provenance = organe; insertOrganeReferences(organe, data, visitedUids); } } if (data.acteurByUid !== undefined && acte.rapporteurs !== undefined) { for (const rapporteur of acte.rapporteurs) { const acteur = data.acteurByUid[rapporteur.acteurRef]; if (acteur !== undefined) { rapporteur.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } } if (data.reunionByUid !== undefined && acte.reunionRef !== undefined) { const reunion = data.reunionByUid[acte.reunionRef]; if (reunion !== undefined) { acte.reunion = reunion; insertReunionReferences(reunion, data, visitedUids); if (acte.odjRef !== undefined) { const odj = reunion.odj; if (odj !== undefined && odj.pointsOdj !== undefined) { for (const pointOdj of odj.pointsOdj) { if (pointOdj.uid === acte.odjRef) { acte.odj = pointOdj; break; } } } } } } if (data.documentByUid !== undefined && acte.texteAdopteRef !== undefined) { const document = data.documentByUid[acte.texteAdopteRef]; if (document !== undefined) { acte.texteAdopte = document; insertDocumentReferences(document, data, visitedUids); } } if (data.documentByUid !== undefined && acte.texteAssocieRef !== undefined) { const document = data.documentByUid[acte.texteAssocieRef]; if (document !== undefined) { acte.texteAssocie = document; insertDocumentReferences(document, data, visitedUids); } } if (data.documentByUid !== undefined && acte.textesAssocies !== undefined) { for (const texteAssocie of acte.textesAssocies) { const document = data.documentByUid[texteAssocie.texteAssocieRef]; if (document !== undefined) { texteAssocie.texteAssocie = document; insertDocumentReferences(document, data, visitedUids); } } } if (data.scrutinByUid !== undefined && acte.voteRefs !== undefined) { const scrutins = []; for (const voteRef of acte.voteRefs) { const scrutin = data.scrutinByUid[voteRef]; if (scrutin !== undefined) { scrutins.push(scrutin); insertScrutinReferences(scrutin, data, visitedUids); } } acte.votes = scrutins; } for (const childActe of acte.actesLegislatifs || []) { insertActeLegislatifReferences(childActe, data, visitedUids); } } return acte; } export function insertActeurReferences(acteur, data, visitedUids) { if (!visitedUids.has(acteur.uid)) { visitedUids.add(acteur.uid); if (data.organeByUid !== undefined) { for (const mandat of acteur.mandats || []) { const organes = []; for (const organeRef of mandat.organesRefs) { const organe = data.organeByUid[organeRef]; if (organe !== undefined) { organes.push(organe); insertOrganeReferences(organe, data, visitedUids); } } mandat.organes = organes; } } } return acteur; } export function insertAmendementReferences(amendement, data, visitedUids) { if (!visitedUids.has(amendement.uid)) { visitedUids.add(amendement.uid); const signataires = amendement.signataires; const auteur = signataires.auteur; if (data.acteurByUid !== undefined && auteur.acteurRef !== undefined) { const acteur = data.acteurByUid[auteur.acteurRef]; if (acteur !== undefined) { auteur.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } if (data.organeByUid !== undefined && auteur.auteurRapporteurOrganeRef !== undefined) { const auteurRapporteurOrgane = data.organeByUid[auteur.auteurRapporteurOrganeRef]; if (auteurRapporteurOrgane !== undefined) { auteur.auteurRapporteurOrgane = auteurRapporteurOrgane; insertOrganeReferences(auteurRapporteurOrgane, data, visitedUids); } } if (data.organeByUid !== undefined && auteur.gouvernementRef !== undefined) { const gouvernement = data.organeByUid[auteur.gouvernementRef]; if (gouvernement !== undefined) { auteur.gouvernement = gouvernement; insertOrganeReferences(gouvernement, data, visitedUids); } } if (data.organeByUid !== undefined && auteur.groupePolitiqueRef !== undefined) { const organe = data.organeByUid[auteur.groupePolitiqueRef]; if (organe !== undefined) { auteur.groupePolitique = organe; insertOrganeReferences(organe, data, visitedUids); } } if (data.acteurByUid !== undefined) { const cosignatairesRefs = signataires.cosignatairesRefs; if (cosignatairesRefs !== undefined) { const cosignataires = []; for (const cosignataireRef of signataires.cosignatairesRefs || []) { const cosignataire = data.acteurByUid[cosignataireRef]; if (cosignataire !== undefined) { cosignataires.push(cosignataire); insertActeurReferences(cosignataire, data, visitedUids); } } signataires.cosignataires = cosignataires; } } } return amendement; } function insertDivisionReferences(division, data, visitedUids) { for (const auteur of division.auteurs) { const acteurSummary = auteur.acteur; if (data.acteurByUid !== undefined && acteurSummary !== undefined) { const acteur = data.acteurByUid[acteurSummary.acteurRef]; if (acteur !== undefined) { acteurSummary.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } if (data.organeByUid !== undefined && auteur.organeRef !== undefined) { const organe = data.organeByUid[auteur.organeRef]; if (organe !== undefined) { auteur.organe = organe; insertOrganeReferences(organe, data, visitedUids); } } } if (data.dossierByUid !== undefined) { const dossier = data.dossierByUid[division.dossierRef]; if (dossier !== undefined) { division.dossier = dossier; insertDossierReferences(dossier, data, visitedUids); } } for (const childDivision of division.divisions || []) { insertDivisionReferences(childDivision, data, visitedUids); } return division; } export function insertDocumentReferences(document, data, visitedUids) { if (!visitedUids.has(document.uid)) { visitedUids.add(document.uid); for (const auteur of document.auteurs) { const acteurSummary = auteur.acteur; if (data.acteurByUid !== undefined && acteurSummary !== undefined) { const acteur = data.acteurByUid[acteurSummary.acteurRef]; if (acteur !== undefined) { acteurSummary.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } if (data.organeByUid !== undefined && auteur.organeRef !== undefined) { const organe = data.organeByUid[auteur.organeRef]; if (organe !== undefined) { auteur.organe = organe; insertOrganeReferences(organe, data, visitedUids); } } } if (data.dossierByUid !== undefined) { const dossier = data.dossierByUid[document.dossierRef]; if (dossier !== undefined) { document.dossier = dossier; insertDossierReferences(dossier, data, visitedUids); } } for (const division of document.divisions || []) { insertDivisionReferences(division, data, visitedUids); } } return document; } export function insertDossierReferences(dossier, data, visitedUids) { if (!visitedUids.has(dossier.uid)) { visitedUids.add(dossier.uid); for (const acte of dossier.actesLegislatifs ?? []) { insertActeLegislatifReferences(acte, data, visitedUids); } const initiateur = dossier.initiateur; if (initiateur !== undefined) { if (data.acteurByUid !== undefined) { for (const acteurSummary of initiateur.acteurs || []) { const acteur = data.acteurByUid[acteurSummary.acteurRef]; if (acteur !== undefined) { acteurSummary.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } if (acteur !== undefined && acteurSummary.mandatRef !== undefined) { for (const mandat of acteur.mandats || []) { if (mandat.uid === acteurSummary.mandatRef) { acteurSummary.mandat = mandat; break; } } } } } if (data.organeByUid !== undefined && initiateur.organeRef !== undefined) { const organe = data.organeByUid[initiateur.organeRef]; if (organe !== undefined) { initiateur.organe = organe; insertOrganeReferences(organe, data, visitedUids); } } } } return dossier; } export function insertOrganeReferences(organe, data, visitedUids) { if (!visitedUids.has(organe.uid)) { visitedUids.add(organe.uid); if (data.organeByUid !== undefined && organe.organeParentRef !== undefined) { const organeParent = data.organeByUid[organe.organeParentRef]; if (organeParent !== undefined) { organe.organeParent = organeParent; insertOrganeReferences(organeParent, data, visitedUids); } } if (data.organeByUid !== undefined && organe.organePrecedentRef !== undefined) { const organePrecedent = data.organeByUid[organe.organePrecedentRef]; if (organePrecedent !== undefined) { organe.organePrecedent = organePrecedent; insertOrganeReferences(organePrecedent, data, visitedUids); } } // TODO } return organe; } export function insertReunionReferences(reunion, data, visitedUids) { if (!visitedUids.has(reunion.uid)) { visitedUids.add(reunion.uid); const demandeurs = reunion.demandeurs; if (demandeurs !== undefined) { if (data.acteurByUid !== undefined) { for (const acteurSummary of demandeurs.acteurs || []) { const acteur = data.acteurByUid[acteurSummary.acteurRef]; if (acteur !== undefined) { acteurSummary.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } } if (data.organeByUid !== undefined) { const organeSummary = demandeurs.organe; if (organeSummary !== undefined) { const organe = data.organeByUid[organeSummary.organeRef]; if (organe !== undefined) { organeSummary.organe = organe; insertOrganeReferences(organe, data, visitedUids); } } } } if (data.organeByUid !== undefined && reunion.organeReuniRef !== undefined) { const organeReuni = data.organeByUid[reunion.organeReuniRef]; if (organeReuni !== undefined) { reunion.organeReuni = organeReuni; insertOrganeReferences(organeReuni, data, visitedUids); } } if (data.acteurByUid !== undefined) { const participants = reunion.participants; if (participants !== undefined) { for (const participantInterne of participants.participantsInternes || []) { const acteur = data.acteurByUid[participantInterne.acteurRef]; if (acteur !== undefined) { participantInterne.acteur = acteur; insertActeurReferences(acteur, data, visitedUids); } } } } } return reunion; } export function insertScrutinReferences(scrutin, _data, visitedUids) { if (!visitedUids.has(scrutin.uid)) { visitedUids.add(scrutin.uid); // TODO } return scrutin; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbnNlcnRBY3RlTGVnaXNsYXRpZlJlZmVyZW5jZXMiLCJhY3RlIiwiZGF0YSIsInZpc2l0ZWRVaWRzIiwiaGFzIiwidWlkIiwiYWRkIiwiZG9jdW1lbnRCeVVpZCIsInVuZGVmaW5lZCIsImRlcG90SW5pdGlhbExlY3R1cmVEZWZpbml0aXZlUmVmIiwiZG9jdW1lbnQiLCJkZXBvdEluaXRpYWxMZWN0dXJlRGVmaW5pdGl2ZSIsImluc2VydERvY3VtZW50UmVmZXJlbmNlcyIsIm9yZ2FuZUJ5VWlkIiwib3JnYW5lUmVmIiwib3JnYW5lIiwiaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyIsInByb3ZlbmFuY2VSZWYiLCJwcm92ZW5hbmNlIiwiYWN0ZXVyQnlVaWQiLCJyYXBwb3J0ZXVycyIsInJhcHBvcnRldXIiLCJhY3RldXIiLCJhY3RldXJSZWYiLCJpbnNlcnRBY3RldXJSZWZlcmVuY2VzIiwicmV1bmlvbkJ5VWlkIiwicmV1bmlvblJlZiIsInJldW5pb24iLCJpbnNlcnRSZXVuaW9uUmVmZXJlbmNlcyIsIm9kalJlZiIsIm9kaiIsInBvaW50c09kaiIsInBvaW50T2RqIiwidGV4dGVBZG9wdGVSZWYiLCJ0ZXh0ZUFkb3B0ZSIsInRleHRlQXNzb2NpZVJlZiIsInRleHRlQXNzb2NpZSIsInRleHRlc0Fzc29jaWVzIiwic2NydXRpbkJ5VWlkIiwidm90ZVJlZnMiLCJzY3J1dGlucyIsInZvdGVSZWYiLCJzY3J1dGluIiwicHVzaCIsImluc2VydFNjcnV0aW5SZWZlcmVuY2VzIiwidm90ZXMiLCJjaGlsZEFjdGUiLCJhY3Rlc0xlZ2lzbGF0aWZzIiwibWFuZGF0IiwibWFuZGF0cyIsIm9yZ2FuZXMiLCJvcmdhbmVzUmVmcyIsImluc2VydEFtZW5kZW1lbnRSZWZlcmVuY2VzIiwiYW1lbmRlbWVudCIsInNpZ25hdGFpcmVzIiwiYXV0ZXVyIiwiYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZVJlZiIsImF1dGV1clJhcHBvcnRldXJPcmdhbmUiLCJnb3V2ZXJuZW1lbnRSZWYiLCJnb3V2ZXJuZW1lbnQiLCJncm91cGVQb2xpdGlxdWVSZWYiLCJncm91cGVQb2xpdGlxdWUiLCJjb3NpZ25hdGFpcmVzUmVmcyIsImNvc2lnbmF0YWlyZXMiLCJjb3NpZ25hdGFpcmVSZWYiLCJjb3NpZ25hdGFpcmUiLCJpbnNlcnREaXZpc2lvblJlZmVyZW5jZXMiLCJkaXZpc2lvbiIsImF1dGV1cnMiLCJhY3RldXJTdW1tYXJ5IiwiZG9zc2llckJ5VWlkIiwiZG9zc2llciIsImRvc3NpZXJSZWYiLCJpbnNlcnREb3NzaWVyUmVmZXJlbmNlcyIsImNoaWxkRGl2aXNpb24iLCJkaXZpc2lvbnMiLCJpbml0aWF0ZXVyIiwiYWN0ZXVycyIsIm1hbmRhdFJlZiIsIm9yZ2FuZVBhcmVudFJlZiIsIm9yZ2FuZVBhcmVudCIsIm9yZ2FuZVByZWNlZGVudFJlZiIsIm9yZ2FuZVByZWNlZGVudCIsImRlbWFuZGV1cnMiLCJvcmdhbmVTdW1tYXJ5Iiwib3JnYW5lUmV1bmlSZWYiLCJvcmdhbmVSZXVuaSIsInBhcnRpY2lwYW50cyIsInBhcnRpY2lwYW50SW50ZXJuZSIsInBhcnRpY2lwYW50c0ludGVybmVzIiwiX2RhdGEiXSwic291cmNlcyI6WyIuLi9zcmMvaW5zZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGV1ciwgT3JnYW5lIH0gZnJvbSBcIi4vdHlwZXMvYWN0ZXVyc19ldF9vcmdhbmVzXCJcbmltcG9ydCB7IFJldW5pb24gfSBmcm9tIFwiLi90eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IEFtZW5kZW1lbnQgfSBmcm9tIFwiLi90eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQge1xuICBBY3RlTGVnaXNsYXRpZixcbiAgRGl2aXNpb24sXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgU2NydXRpbiB9IGZyb20gXCIuL3R5cGVzL3NjcnV0aW5zXCJcblxuZXhwb3J0IGludGVyZmFjZSBPdXRwdXREYXRhIHtcbiAgcmVhZG9ubHkgYWN0ZXVyQnlVaWQ/OiB7IFt1aWQ6IHN0cmluZ106IEFjdGV1ciB9XG4gIHJlYWRvbmx5IGFtZW5kZW1lbnRCeVVpZD86IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9XG4gIHJlYWRvbmx5IGRvY3VtZW50QnlVaWQ/OiB7IFt1aWQ6IHN0cmluZ106IERvY3VtZW50IH1cbiAgcmVhZG9ubHkgZG9zc2llckJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9XG4gIHJlYWRvbmx5IG9yZ2FuZUJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBPcmdhbmUgfVxuICByZWFkb25seSByZXVuaW9uQnlVaWQ/OiB7IFt1aWQ6IHN0cmluZ106IFJldW5pb24gfVxuICByZWFkb25seSBzY3J1dGluQnlVaWQ/OiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRBY3RlTGVnaXNsYXRpZlJlZmVyZW5jZXMoXG4gIGFjdGU6IEFjdGVMZWdpc2xhdGlmLFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoYWN0ZS51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKGFjdGUudWlkKVxuXG4gICAgaWYgKFxuICAgICAgZGF0YS5kb2N1bWVudEJ5VWlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGFjdGUuZGVwb3RJbml0aWFsTGVjdHVyZURlZmluaXRpdmVSZWYgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBkYXRhLmRvY3VtZW50QnlVaWRbYWN0ZS5kZXBvdEluaXRpYWxMZWN0dXJlRGVmaW5pdGl2ZVJlZl1cbiAgICAgIGlmIChkb2N1bWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGUuZGVwb3RJbml0aWFsTGVjdHVyZURlZmluaXRpdmUgPSBkb2N1bWVudFxuICAgICAgICBpbnNlcnREb2N1bWVudFJlZmVyZW5jZXMoZG9jdW1lbnQsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUub3JnYW5lUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG9yZ2FuZSA9IGRhdGEub3JnYW5lQnlVaWRbYWN0ZS5vcmdhbmVSZWZdXG4gICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0ZS5vcmdhbmUgPSBvcmdhbmVcbiAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUucHJvdmVuYW5jZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2FjdGUucHJvdmVuYW5jZVJlZl1cbiAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY3RlLnByb3ZlbmFuY2UgPSBvcmdhbmVcbiAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUucmFwcG9ydGV1cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCByYXBwb3J0ZXVyIG9mIGFjdGUucmFwcG9ydGV1cnMpIHtcbiAgICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFtyYXBwb3J0ZXVyLmFjdGV1clJlZl1cbiAgICAgICAgaWYgKGFjdGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmFwcG9ydGV1ci5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgICBpbnNlcnRBY3RldXJSZWZlcmVuY2VzKGFjdGV1ciwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEucmV1bmlvbkJ5VWlkICE9PSB1bmRlZmluZWQgJiYgYWN0ZS5yZXVuaW9uUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJldW5pb24gPSBkYXRhLnJldW5pb25CeVVpZFthY3RlLnJldW5pb25SZWZdXG4gICAgICBpZiAocmV1bmlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGUucmV1bmlvbiA9IHJldW5pb25cbiAgICAgICAgaW5zZXJ0UmV1bmlvblJlZmVyZW5jZXMocmV1bmlvbiwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIGlmIChhY3RlLm9kalJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb2RqID0gcmV1bmlvbi5vZGpcbiAgICAgICAgICBpZiAob2RqICE9PSB1bmRlZmluZWQgJiYgb2RqLnBvaW50c09kaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50T2RqIG9mIG9kai5wb2ludHNPZGopIHtcbiAgICAgICAgICAgICAgaWYgKHBvaW50T2RqLnVpZCA9PT0gYWN0ZS5vZGpSZWYpIHtcbiAgICAgICAgICAgICAgICBhY3RlLm9kaiA9IHBvaW50T2RqXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5kb2N1bWVudEJ5VWlkICE9PSB1bmRlZmluZWQgJiYgYWN0ZS50ZXh0ZUFkb3B0ZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkb2N1bWVudCA9IGRhdGEuZG9jdW1lbnRCeVVpZFthY3RlLnRleHRlQWRvcHRlUmVmXVxuICAgICAgaWYgKGRvY3VtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0ZS50ZXh0ZUFkb3B0ZSA9IGRvY3VtZW50XG4gICAgICAgIGluc2VydERvY3VtZW50UmVmZXJlbmNlcyhkb2N1bWVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRhdGEuZG9jdW1lbnRCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhY3RlLnRleHRlQXNzb2NpZVJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBkb2N1bWVudCA9IGRhdGEuZG9jdW1lbnRCeVVpZFthY3RlLnRleHRlQXNzb2NpZVJlZl1cbiAgICAgIGlmIChkb2N1bWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGUudGV4dGVBc3NvY2llID0gZG9jdW1lbnRcbiAgICAgICAgaW5zZXJ0RG9jdW1lbnRSZWZlcmVuY2VzKGRvY3VtZW50LCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuZG9jdW1lbnRCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUudGV4dGVzQXNzb2NpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCB0ZXh0ZUFzc29jaWUgb2YgYWN0ZS50ZXh0ZXNBc3NvY2llcykge1xuICAgICAgICBjb25zdCBkb2N1bWVudCA9IGRhdGEuZG9jdW1lbnRCeVVpZFt0ZXh0ZUFzc29jaWUudGV4dGVBc3NvY2llUmVmXVxuICAgICAgICBpZiAoZG9jdW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRleHRlQXNzb2NpZS50ZXh0ZUFzc29jaWUgPSBkb2N1bWVudFxuICAgICAgICAgIGluc2VydERvY3VtZW50UmVmZXJlbmNlcyhkb2N1bWVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuc2NydXRpbkJ5VWlkICE9PSB1bmRlZmluZWQgJiYgYWN0ZS52b3RlUmVmcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzY3J1dGlucyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IHZvdGVSZWYgb2YgYWN0ZS52b3RlUmVmcykge1xuICAgICAgICBjb25zdCBzY3J1dGluID0gZGF0YS5zY3J1dGluQnlVaWRbdm90ZVJlZl1cbiAgICAgICAgaWYgKHNjcnV0aW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5zLnB1c2goc2NydXRpbilcbiAgICAgICAgICBpbnNlcnRTY3J1dGluUmVmZXJlbmNlcyhzY3J1dGluLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYWN0ZS52b3RlcyA9IHNjcnV0aW5zXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZEFjdGUgb2YgYWN0ZS5hY3Rlc0xlZ2lzbGF0aWZzIHx8IFtdKSB7XG4gICAgICBpbnNlcnRBY3RlTGVnaXNsYXRpZlJlZmVyZW5jZXMoY2hpbGRBY3RlLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWN0ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhcbiAgYWN0ZXVyOiBBY3RldXIsXG4gIGRhdGE6IE91dHB1dERhdGEsXG4gIHZpc2l0ZWRVaWRzOiBTZXQ8c3RyaW5nPixcbikge1xuICBpZiAoIXZpc2l0ZWRVaWRzLmhhcyhhY3RldXIudWlkKSkge1xuICAgIHZpc2l0ZWRVaWRzLmFkZChhY3RldXIudWlkKVxuXG4gICAgaWYgKGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBtYW5kYXQgb2YgYWN0ZXVyLm1hbmRhdHMgfHwgW10pIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lcyA9IFtdXG4gICAgICAgIGZvciAoY29uc3Qgb3JnYW5lUmVmIG9mIG1hbmRhdC5vcmdhbmVzUmVmcykge1xuICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IGRhdGEub3JnYW5lQnlVaWRbb3JnYW5lUmVmXVxuICAgICAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3JnYW5lcy5wdXNoKG9yZ2FuZSlcbiAgICAgICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFuZGF0Lm9yZ2FuZXMgPSBvcmdhbmVzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFjdGV1clxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QW1lbmRlbWVudFJlZmVyZW5jZXMoXG4gIGFtZW5kZW1lbnQ6IEFtZW5kZW1lbnQsXG4gIGRhdGE6IE91dHB1dERhdGEsXG4gIHZpc2l0ZWRVaWRzOiBTZXQ8c3RyaW5nPixcbikge1xuICBpZiAoIXZpc2l0ZWRVaWRzLmhhcyhhbWVuZGVtZW50LnVpZCkpIHtcbiAgICB2aXNpdGVkVWlkcy5hZGQoYW1lbmRlbWVudC51aWQpXG5cbiAgICBjb25zdCBzaWduYXRhaXJlcyA9IGFtZW5kZW1lbnQuc2lnbmF0YWlyZXNcbiAgICBjb25zdCBhdXRldXIgPSBzaWduYXRhaXJlcy5hdXRldXJcbiAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGF1dGV1ci5hY3RldXJSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFthdXRldXIuYWN0ZXVyUmVmXVxuICAgICAgaWYgKGFjdGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF1dGV1ci5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhhY3RldXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGF1dGV1ci5hdXRldXJSYXBwb3J0ZXVyT3JnYW5lUmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGF1dGV1clJhcHBvcnRldXJPcmdhbmUgPVxuICAgICAgICBkYXRhLm9yZ2FuZUJ5VWlkW2F1dGV1ci5hdXRldXJSYXBwb3J0ZXVyT3JnYW5lUmVmXVxuICAgICAgaWYgKGF1dGV1clJhcHBvcnRldXJPcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhdXRldXIuYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZSA9IGF1dGV1clJhcHBvcnRldXJPcmdhbmVcbiAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhhdXRldXJSYXBwb3J0ZXVyT3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhdXRldXIuZ291dmVybmVtZW50UmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGdvdXZlcm5lbWVudCA9IGRhdGEub3JnYW5lQnlVaWRbYXV0ZXVyLmdvdXZlcm5lbWVudFJlZl1cbiAgICAgIGlmIChnb3V2ZXJuZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhdXRldXIuZ291dmVybmVtZW50ID0gZ291dmVybmVtZW50XG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMoZ291dmVybmVtZW50LCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhdXRldXIuZ3JvdXBlUG9saXRpcXVlUmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yZ2FuZSA9IGRhdGEub3JnYW5lQnlVaWRbYXV0ZXVyLmdyb3VwZVBvbGl0aXF1ZVJlZl1cbiAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhdXRldXIuZ3JvdXBlUG9saXRpcXVlID0gb3JnYW5lXG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY29zaWduYXRhaXJlc1JlZnMgPSBzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzUmVmc1xuICAgICAgaWYgKGNvc2lnbmF0YWlyZXNSZWZzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgY29zaWduYXRhaXJlcyA9IFtdXG4gICAgICAgIGZvciAoY29uc3QgY29zaWduYXRhaXJlUmVmIG9mIHNpZ25hdGFpcmVzLmNvc2lnbmF0YWlyZXNSZWZzIHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgY29zaWduYXRhaXJlID0gZGF0YS5hY3RldXJCeVVpZFtjb3NpZ25hdGFpcmVSZWZdXG4gICAgICAgICAgaWYgKGNvc2lnbmF0YWlyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb3NpZ25hdGFpcmVzLnB1c2goY29zaWduYXRhaXJlKVxuICAgICAgICAgICAgaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhjb3NpZ25hdGFpcmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzID0gY29zaWduYXRhaXJlc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbWVuZGVtZW50XG59XG5cbmZ1bmN0aW9uIGluc2VydERpdmlzaW9uUmVmZXJlbmNlcyhcbiAgZGl2aXNpb246IERpdmlzaW9uLFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgZm9yIChjb25zdCBhdXRldXIgb2YgZGl2aXNpb24uYXV0ZXVycykge1xuICAgIGNvbnN0IGFjdGV1clN1bW1hcnkgPSBhdXRldXIuYWN0ZXVyXG4gICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RldXJTdW1tYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGV1ciA9IGRhdGEuYWN0ZXVyQnlVaWRbYWN0ZXVyU3VtbWFyeS5hY3RldXJSZWZdXG4gICAgICBpZiAoYWN0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0ZXVyU3VtbWFyeS5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhhY3RldXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQgJiYgYXV0ZXVyLm9yZ2FuZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2F1dGV1ci5vcmdhbmVSZWZdXG4gICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXV0ZXVyLm9yZ2FuZSA9IG9yZ2FuZVxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGRhdGEuZG9zc2llckJ5VWlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkb3NzaWVyID0gZGF0YS5kb3NzaWVyQnlVaWRbZGl2aXNpb24uZG9zc2llclJlZl1cbiAgICBpZiAoZG9zc2llciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkaXZpc2lvbi5kb3NzaWVyID0gZG9zc2llclxuICAgICAgaW5zZXJ0RG9zc2llclJlZmVyZW5jZXMoZG9zc2llciwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBjaGlsZERpdmlzaW9uIG9mIGRpdmlzaW9uLmRpdmlzaW9ucyB8fCBbXSkge1xuICAgIGluc2VydERpdmlzaW9uUmVmZXJlbmNlcyhjaGlsZERpdmlzaW9uLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgfVxuXG4gIHJldHVybiBkaXZpc2lvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0RG9jdW1lbnRSZWZlcmVuY2VzKFxuICBkb2N1bWVudDogRG9jdW1lbnQsXG4gIGRhdGE6IE91dHB1dERhdGEsXG4gIHZpc2l0ZWRVaWRzOiBTZXQ8c3RyaW5nPixcbikge1xuICBpZiAoIXZpc2l0ZWRVaWRzLmhhcyhkb2N1bWVudC51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKGRvY3VtZW50LnVpZClcblxuICAgIGZvciAoY29uc3QgYXV0ZXVyIG9mIGRvY3VtZW50LmF1dGV1cnMpIHtcbiAgICAgIGNvbnN0IGFjdGV1clN1bW1hcnkgPSBhdXRldXIuYWN0ZXVyXG4gICAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGV1clN1bW1hcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBhY3RldXIgPSBkYXRhLmFjdGV1ckJ5VWlkW2FjdGV1clN1bW1hcnkuYWN0ZXVyUmVmXVxuICAgICAgICBpZiAoYWN0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhY3RldXJTdW1tYXJ5LmFjdGV1ciA9IGFjdGV1clxuICAgICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGF1dGV1ci5vcmdhbmVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2F1dGV1ci5vcmdhbmVSZWZdXG4gICAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGF1dGV1ci5vcmdhbmUgPSBvcmdhbmVcbiAgICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YS5kb3NzaWVyQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZG9zc2llciA9IGRhdGEuZG9zc2llckJ5VWlkW2RvY3VtZW50LmRvc3NpZXJSZWZdXG4gICAgICBpZiAoZG9zc2llciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRvY3VtZW50LmRvc3NpZXIgPSBkb3NzaWVyXG4gICAgICAgIGluc2VydERvc3NpZXJSZWZlcmVuY2VzKGRvc3NpZXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGl2aXNpb24gb2YgZG9jdW1lbnQuZGl2aXNpb25zIHx8IFtdKSB7XG4gICAgICBpbnNlcnREaXZpc2lvblJlZmVyZW5jZXMoZGl2aXNpb24sIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb2N1bWVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0RG9zc2llclJlZmVyZW5jZXMoXG4gIGRvc3NpZXI6IERvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoZG9zc2llci51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKGRvc3NpZXIudWlkKVxuXG4gICAgZm9yIChjb25zdCBhY3RlIG9mIGRvc3NpZXIuYWN0ZXNMZWdpc2xhdGlmcyA/PyBbXSkge1xuICAgICAgaW5zZXJ0QWN0ZUxlZ2lzbGF0aWZSZWZlcmVuY2VzKGFjdGUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYXRldXIgPSBkb3NzaWVyLmluaXRpYXRldXJcbiAgICBpZiAoaW5pdGlhdGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3VtbWFyeSBvZiBpbml0aWF0ZXVyLmFjdGV1cnMgfHwgW10pIHtcbiAgICAgICAgICBjb25zdCBhY3RldXIgPSBkYXRhLmFjdGV1ckJ5VWlkW2FjdGV1clN1bW1hcnkuYWN0ZXVyUmVmXVxuICAgICAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWN0ZXVyU3VtbWFyeS5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFjdGV1ciAhPT0gdW5kZWZpbmVkICYmIGFjdGV1clN1bW1hcnkubWFuZGF0UmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWFuZGF0IG9mIGFjdGV1ci5tYW5kYXRzIHx8IFtdKSB7XG4gICAgICAgICAgICAgIGlmIChtYW5kYXQudWlkID09PSBhY3RldXJTdW1tYXJ5Lm1hbmRhdFJlZikge1xuICAgICAgICAgICAgICAgIGFjdGV1clN1bW1hcnkubWFuZGF0ID0gbWFuZGF0XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgaW5pdGlhdGV1ci5vcmdhbmVSZWYgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG9yZ2FuZSA9IGRhdGEub3JnYW5lQnlVaWRbaW5pdGlhdGV1ci5vcmdhbmVSZWZdXG4gICAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluaXRpYXRldXIub3JnYW5lID0gb3JnYW5lXG4gICAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRvc3NpZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMoXG4gIG9yZ2FuZTogT3JnYW5lLFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMob3JnYW5lLnVpZCkpIHtcbiAgICB2aXNpdGVkVWlkcy5hZGQob3JnYW5lLnVpZClcblxuICAgIGlmIChcbiAgICAgIGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3JnYW5lLm9yZ2FuZVBhcmVudFJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBvcmdhbmVQYXJlbnQgPSBkYXRhLm9yZ2FuZUJ5VWlkW29yZ2FuZS5vcmdhbmVQYXJlbnRSZWZdXG4gICAgICBpZiAob3JnYW5lUGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3JnYW5lLm9yZ2FuZVBhcmVudCA9IG9yZ2FuZVBhcmVudFxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZVBhcmVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvcmdhbmUub3JnYW5lUHJlY2VkZW50UmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yZ2FuZVByZWNlZGVudCA9IGRhdGEub3JnYW5lQnlVaWRbb3JnYW5lLm9yZ2FuZVByZWNlZGVudFJlZl1cbiAgICAgIGlmIChvcmdhbmVQcmVjZWRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcmdhbmUub3JnYW5lUHJlY2VkZW50ID0gb3JnYW5lUHJlY2VkZW50XG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lUHJlY2VkZW50LCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPXG4gIH1cblxuICByZXR1cm4gb3JnYW5lXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRSZXVuaW9uUmVmZXJlbmNlcyhcbiAgcmV1bmlvbjogUmV1bmlvbixcbiAgZGF0YTogT3V0cHV0RGF0YSxcbiAgdmlzaXRlZFVpZHM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGlmICghdmlzaXRlZFVpZHMuaGFzKHJldW5pb24udWlkKSkge1xuICAgIHZpc2l0ZWRVaWRzLmFkZChyZXVuaW9uLnVpZClcblxuICAgIGNvbnN0IGRlbWFuZGV1cnMgPSByZXVuaW9uLmRlbWFuZGV1cnNcbiAgICBpZiAoZGVtYW5kZXVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3VtbWFyeSBvZiBkZW1hbmRldXJzLmFjdGV1cnMgfHwgW10pIHtcbiAgICAgICAgICBjb25zdCBhY3RldXIgPSBkYXRhLmFjdGV1ckJ5VWlkW2FjdGV1clN1bW1hcnkuYWN0ZXVyUmVmXVxuICAgICAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYWN0ZXVyU3VtbWFyeS5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lU3VtbWFyeSA9IGRlbWFuZGV1cnMub3JnYW5lXG4gICAgICAgIGlmIChvcmdhbmVTdW1tYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW29yZ2FuZVN1bW1hcnkub3JnYW5lUmVmXVxuICAgICAgICAgIGlmIChvcmdhbmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3JnYW5lU3VtbWFyeS5vcmdhbmUgPSBvcmdhbmVcbiAgICAgICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZXVuaW9uLm9yZ2FuZVJldW5pUmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yZ2FuZVJldW5pID0gZGF0YS5vcmdhbmVCeVVpZFtyZXVuaW9uLm9yZ2FuZVJldW5pUmVmXVxuICAgICAgaWYgKG9yZ2FuZVJldW5pICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV1bmlvbi5vcmdhbmVSZXVuaSA9IG9yZ2FuZVJldW5pXG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lUmV1bmksIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5hY3RldXJCeVVpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSByZXVuaW9uLnBhcnRpY2lwYW50c1xuICAgICAgaWYgKHBhcnRpY2lwYW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGFydGljaXBhbnRJbnRlcm5lIG9mIHBhcnRpY2lwYW50cy5wYXJ0aWNpcGFudHNJbnRlcm5lcyB8fFxuICAgICAgICAgIFtdKSB7XG4gICAgICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFtwYXJ0aWNpcGFudEludGVybmUuYWN0ZXVyUmVmXVxuICAgICAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFydGljaXBhbnRJbnRlcm5lLmFjdGV1ciA9IGFjdGV1clxuICAgICAgICAgICAgaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhhY3RldXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXVuaW9uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTY3J1dGluUmVmZXJlbmNlcyhcbiAgc2NydXRpbjogU2NydXRpbixcbiAgX2RhdGE6IE91dHB1dERhdGEsXG4gIHZpc2l0ZWRVaWRzOiBTZXQ8c3RyaW5nPixcbikge1xuICBpZiAoIXZpc2l0ZWRVaWRzLmhhcyhzY3J1dGluLnVpZCkpIHtcbiAgICB2aXNpdGVkVWlkcy5hZGQoc2NydXRpbi51aWQpXG5cbiAgICAvLyBUT0RPXG4gIH1cblxuICByZXR1cm4gc2NydXRpblxufVxuIl0sIm1hcHBpbmdzIjoiQUFxQkEsU0FBU0EsOEJBQThCQSxDQUNyQ0MsSUFBb0IsRUFDcEJDLElBQWdCLEVBQ2hCQyxXQUF3QixFQUN4QjtFQUNBLElBQUksQ0FBQ0EsV0FBVyxDQUFDQyxHQUFHLENBQUNILElBQUksQ0FBQ0ksR0FBRyxDQUFDLEVBQUU7SUFDOUJGLFdBQVcsQ0FBQ0csR0FBRyxDQUFDTCxJQUFJLENBQUNJLEdBQUcsQ0FBQztJQUV6QixJQUNFSCxJQUFJLENBQUNLLGFBQWEsS0FBS0MsU0FBUyxJQUNoQ1AsSUFBSSxDQUFDUSxnQ0FBZ0MsS0FBS0QsU0FBUyxFQUNuRDtNQUNBLE1BQU1FLFFBQVEsR0FBR1IsSUFBSSxDQUFDSyxhQUFhLENBQUNOLElBQUksQ0FBQ1EsZ0NBQWdDLENBQUM7TUFDMUUsSUFBSUMsUUFBUSxLQUFLRixTQUFTLEVBQUU7UUFDMUJQLElBQUks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