@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
227 lines (226 loc) • 28.8 kB
JavaScript
import assert from "assert";
import { cleanBooleanAttribute, cleanXmlArtefacts } from "./xml.mjs";
import { AvantAApres } from "../types/amendements.mjs";
export function cleanAmendement(amendement) {
cleanXmlArtefacts(amendement);
const signataires = amendement.signataires;
{
cleanXmlArtefacts(signataires);
const auteur = signataires.auteur;
{
cleanXmlArtefacts(auteur);
}
if (signataires.cosignataires !== undefined) {
const acteurRef = signataires.cosignataires.acteurRef;
if (Array.isArray(acteurRef)) {
signataires.cosignatairesRefs = acteurRef;
} else {
assert(acteurRef);
signataires.cosignatairesRefs = [acteurRef];
}
delete signataires.cosignataires;
}
let libelle = signataires.libelle;
if (libelle !== undefined) {
libelle = libelle.split(" ").filter(Boolean).join(" ");
if (libelle) {
signataires.libelle = libelle;
} else {
delete signataires.libelle;
}
}
}
const pointeurFragmentTexte = amendement.pointeurFragmentTexte;
{
cleanXmlArtefacts(pointeurFragmentTexte);
const division = pointeurFragmentTexte.division;
if (division !== undefined) {
cleanXmlArtefacts(division);
let avantAApres = division.avant_A_Apres;
if (avantAApres !== undefined) {
delete division.avant_A_Apres;
if (avantAApres === "Après") {
avantAApres = AvantAApres.Apres;
}
division.avantAApres = avantAApres;
}
}
const amendementStandard = pointeurFragmentTexte.amendementStandard;
if (amendementStandard !== undefined) {
cleanXmlArtefacts(amendementStandard);
const alinea = amendementStandard.alinea;
if (alinea !== undefined) {
cleanXmlArtefacts(alinea);
let avantAApres = alinea.avant_A_Apres;
if (avantAApres !== undefined) {
delete alinea.avant_A_Apres;
if (avantAApres === "Après") {
avantAApres = AvantAApres.Apres;
} else if (![AvantAApres.A, AvantAApres.Apres, AvantAApres.Avant].includes(avantAApres)) {
avantAApres = AvantAApres.A;
}
alinea.avantAApres = avantAApres;
}
pointeurFragmentTexte.alinea = alinea;
}
delete pointeurFragmentTexte.amendementStandard;
}
}
const corps = amendement.corps;
if (corps !== undefined) {
cleanXmlArtefacts(corps);
const contenuAuteur = corps.contenuAuteur;
if (contenuAuteur !== undefined) {
cleanXmlArtefacts(contenuAuteur);
const avantAppel = contenuAuteur.avantAppel;
if (avantAppel !== undefined) {
cleanXmlArtefacts(avantAppel);
cleanDispositifAmdtCreditPLF(avantAppel.dispositifAmdtCreditPLF, {
rectificatif: false
});
cleanDispositifAmdtCreditPLF(avantAppel.dispositifAmdtCreditPLFR, {
rectificatif: true
});
if (Object.keys(avantAppel).length === 0) {
delete contenuAuteur.avantAppel;
}
}
assert.strictEqual(contenuAuteur.annexeExposeSommaire, undefined);
cleanDispositifAmdtCreditPLF(contenuAuteur.dispositifAmdtCreditPLF, {
rectificatif: false
});
cleanDispositifAmdtCreditPLF(contenuAuteur.dispositifAmdtCreditPLFR, {
rectificatif: true
});
}
}
const cycleDeVie = amendement.cycleDeVie;
if (cycleDeVie !== undefined) {
cleanXmlArtefacts(cycleDeVie);
const etatDesTraitements = cycleDeVie.etatDesTraitements;
{
cleanXmlArtefacts(etatDesTraitements);
const etat = etatDesTraitements.etat;
{
cleanXmlArtefacts(etat);
}
const sousEtat = etatDesTraitements.sousEtat;
if (sousEtat !== undefined) {
cleanXmlArtefacts(sousEtat);
}
}
}
if (amendement.representations !== undefined) {
const representation = amendement.representations.representation;
assert(!Array.isArray(representation));
amendement.representation = representation;
delete amendement.representations;
{
cleanXmlArtefacts(representation);
assert.strictEqual(representation.repSource, undefined);
assert.strictEqual(representation.offset, undefined);
assert.strictEqual(representation.dateDispoRepresentation, undefined);
const statutRepresentation = representation.statutRepresentation;
{
cleanBooleanAttribute(statutRepresentation, "canonique");
cleanBooleanAttribute(statutRepresentation, "enregistrement");
cleanBooleanAttribute(statutRepresentation, "officielle");
cleanBooleanAttribute(statutRepresentation, "transcription");
cleanBooleanAttribute(statutRepresentation, "verbatim");
}
}
}
const loiReference = amendement.loiReference;
if (loiReference !== undefined) {
cleanXmlArtefacts(loiReference);
}
const discussionCommune = amendement.discussionCommune;
if (discussionCommune !== undefined) {
cleanXmlArtefacts(discussionCommune);
}
const discussionIdentique = amendement.discussionIdentique;
if (discussionIdentique !== undefined) {
cleanXmlArtefacts(discussionIdentique);
}
}
function cleanDispositifAmdtCreditPLF(dispositifAmdtCreditPLF, {
rectificatif
}) {
if (dispositifAmdtCreditPLF !== undefined) {
const listeProgrammes = dispositifAmdtCreditPLF.listeProgrammes?.programme;
if (listeProgrammes !== undefined) {
if (Array.isArray(listeProgrammes)) {
dispositifAmdtCreditPLF.listeProgrammes = listeProgrammes;
} else {
assert(listeProgrammes);
dispositifAmdtCreditPLF.listeProgrammes = [listeProgrammes];
}
for (const programme of dispositifAmdtCreditPLF.listeProgrammes) {
cleanXmlArtefacts(programme);
if (programme.lignesCredits !== undefined) {
let lignesCredits = programme.lignesCredits.ligneCredit;
if (lignesCredits === undefined) {
delete programme.lignesCredits;
} else {
if (!Array.isArray(lignesCredits)) {
assert(lignesCredits);
lignesCredits = [lignesCredits];
}
programme.lignesCredits = lignesCredits;
}
if (lignesCredits !== undefined) {
for (const ligneCredit of lignesCredits) {
if (rectificatif) {
cleanLigneCreditPLFR(ligneCredit);
} else {
cleanXmlArtefacts(ligneCredit);
}
}
}
}
}
}
}
}
function cleanLigneCreditPLFR(ligneCreditPLFR) {
cleanXmlArtefacts(ligneCreditPLFR);
if (ligneCreditPLFR.lignesCredits !== undefined) {
let lignesCredits = ligneCreditPLFR.lignesCredits.ligneCredit;
if (lignesCredits === undefined) {
delete ligneCreditPLFR.lignesCredits;
} else {
if (!Array.isArray(lignesCredits)) {
assert(lignesCredits);
lignesCredits = [lignesCredits];
}
ligneCreditPLFR.lignesCredits = lignesCredits;
}
if (lignesCredits !== undefined) {
for (const ligneCredit of lignesCredits) {
cleanLigneCreditPLFR(ligneCredit);
}
}
}
}
export function cleanTexteLegislatif(texteLegislatif) {
cleanXmlArtefacts(texteLegislatif);
// Note: The following fields in `texteLegislatif.amendements` are currently ignored:
// * "#text"?: string;
// * offset?: null;
// * nom?: Nom;
// * avant_A_Apres?: DivisionAvantAApres;
// * dateDepot?: Date;
// * documentURI?: string;
// Because it seems they should belong to an "amendement".
let amendement = texteLegislatif.amendements.amendement;
if (Array.isArray(amendement)) {
texteLegislatif.amendements = amendement;
} else {
assert(amendement);
texteLegislatif.amendements = [amendement];
}
for (const amendement of texteLegislatif.amendements) {
cleanAmendement(amendement);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhbkJvb2xlYW5BdHRyaWJ1dGUiLCJjbGVhblhtbEFydGVmYWN0cyIsIkF2YW50QUFwcmVzIiwiY2xlYW5BbWVuZGVtZW50IiwiYW1lbmRlbWVudCIsInNpZ25hdGFpcmVzIiwiYXV0ZXVyIiwiY29zaWduYXRhaXJlcyIsInVuZGVmaW5lZCIsImFjdGV1clJlZiIsIkFycmF5IiwiaXNBcnJheSIsImNvc2lnbmF0YWlyZXNSZWZzIiwibGliZWxsZSIsInNwbGl0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJwb2ludGV1ckZyYWdtZW50VGV4dGUiLCJkaXZpc2lvbiIsImF2YW50QUFwcmVzIiwiYXZhbnRfQV9BcHJlcyIsIkFwcmVzIiwiYW1lbmRlbWVudFN0YW5kYXJkIiwiYWxpbmVhIiwiQSIsIkF2YW50IiwiaW5jbHVkZXMiLCJjb3JwcyIsImNvbnRlbnVBdXRldXIiLCJhdmFudEFwcGVsIiwiY2xlYW5EaXNwb3NpdGlmQW1kdENyZWRpdFBMRiIsImRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGIiwicmVjdGlmaWNhdGlmIiwiZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInN0cmljdEVxdWFsIiwiYW5uZXhlRXhwb3NlU29tbWFpcmUiLCJjeWNsZURlVmllIiwiZXRhdERlc1RyYWl0ZW1lbnRzIiwiZXRhdCIsInNvdXNFdGF0IiwicmVwcmVzZW50YXRpb25zIiwicmVwcmVzZW50YXRpb24iLCJyZXBTb3VyY2UiLCJvZmZzZXQiLCJkYXRlRGlzcG9SZXByZXNlbnRhdGlvbiIsInN0YXR1dFJlcHJlc2VudGF0aW9uIiwibG9pUmVmZXJlbmNlIiwiZGlzY3Vzc2lvbkNvbW11bmUiLCJkaXNjdXNzaW9uSWRlbnRpcXVlIiwibGlzdGVQcm9ncmFtbWVzIiwicHJvZ3JhbW1lIiwibGlnbmVzQ3JlZGl0cyIsImxpZ25lQ3JlZGl0IiwiY2xlYW5MaWduZUNyZWRpdFBMRlIiLCJsaWduZUNyZWRpdFBMRlIiLCJjbGVhblRleHRlTGVnaXNsYXRpZiIsInRleHRlTGVnaXNsYXRpZiIsImFtZW5kZW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsZWFuZXJzL2FtZW5kZW1lbnRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5cbmltcG9ydCB7IGNsZWFuQm9vbGVhbkF0dHJpYnV0ZSwgY2xlYW5YbWxBcnRlZmFjdHMgfSBmcm9tIFwiLi94bWxcIlxuaW1wb3J0IHsgQXZhbnRBQXByZXMgfSBmcm9tIFwiLi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5BbWVuZGVtZW50KGFtZW5kZW1lbnQ6IGFueSk6IHZvaWQge1xuICBjbGVhblhtbEFydGVmYWN0cyhhbWVuZGVtZW50KVxuXG4gIGNvbnN0IHNpZ25hdGFpcmVzID0gYW1lbmRlbWVudC5zaWduYXRhaXJlc1xuICB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoc2lnbmF0YWlyZXMpXG5cbiAgICBjb25zdCBhdXRldXIgPSBzaWduYXRhaXJlcy5hdXRldXJcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhhdXRldXIpXG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdGFpcmVzLmNvc2lnbmF0YWlyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYWN0ZXVyUmVmID0gc2lnbmF0YWlyZXMuY29zaWduYXRhaXJlcy5hY3RldXJSZWZcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFjdGV1clJlZikpIHtcbiAgICAgICAgc2lnbmF0YWlyZXMuY29zaWduYXRhaXJlc1JlZnMgPSBhY3RldXJSZWZcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChhY3RldXJSZWYpXG4gICAgICAgIHNpZ25hdGFpcmVzLmNvc2lnbmF0YWlyZXNSZWZzID0gW2FjdGV1clJlZl1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzXG4gICAgfVxuXG4gICAgbGV0IGxpYmVsbGUgPSBzaWduYXRhaXJlcy5saWJlbGxlXG4gICAgaWYgKGxpYmVsbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGliZWxsZSA9IGxpYmVsbGUuc3BsaXQoXCIgXCIpLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgaWYgKGxpYmVsbGUpIHtcbiAgICAgICAgc2lnbmF0YWlyZXMubGliZWxsZSA9IGxpYmVsbGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBzaWduYXRhaXJlcy5saWJlbGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcG9pbnRldXJGcmFnbWVudFRleHRlID0gYW1lbmRlbWVudC5wb2ludGV1ckZyYWdtZW50VGV4dGVcbiAge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHBvaW50ZXVyRnJhZ21lbnRUZXh0ZSlcblxuICAgIGNvbnN0IGRpdmlzaW9uID0gcG9pbnRldXJGcmFnbWVudFRleHRlLmRpdmlzaW9uXG4gICAgaWYgKGRpdmlzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGRpdmlzaW9uKVxuXG4gICAgICBsZXQgYXZhbnRBQXByZXMgPSBkaXZpc2lvbi5hdmFudF9BX0FwcmVzXG4gICAgICBpZiAoYXZhbnRBQXByZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgZGl2aXNpb24uYXZhbnRfQV9BcHJlc1xuICAgICAgICBpZiAoYXZhbnRBQXByZXMgPT09IFwiQXByw6hzXCIpIHtcbiAgICAgICAgICBhdmFudEFBcHJlcyA9IEF2YW50QUFwcmVzLkFwcmVzXG4gICAgICAgIH1cbiAgICAgICAgZGl2aXNpb24uYXZhbnRBQXByZXMgPSBhdmFudEFBcHJlc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFtZW5kZW1lbnRTdGFuZGFyZCA9IHBvaW50ZXVyRnJhZ21lbnRUZXh0ZS5hbWVuZGVtZW50U3RhbmRhcmRcbiAgICBpZiAoYW1lbmRlbWVudFN0YW5kYXJkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGFtZW5kZW1lbnRTdGFuZGFyZClcblxuICAgICAgY29uc3QgYWxpbmVhID0gYW1lbmRlbWVudFN0YW5kYXJkLmFsaW5lYVxuICAgICAgaWYgKGFsaW5lYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGFsaW5lYSlcblxuICAgICAgICBsZXQgYXZhbnRBQXByZXMgPSBhbGluZWEuYXZhbnRfQV9BcHJlc1xuICAgICAgICBpZiAoYXZhbnRBQXByZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSBhbGluZWEuYXZhbnRfQV9BcHJlc1xuICAgICAgICAgIGlmIChhdmFudEFBcHJlcyA9PT0gXCJBcHLDqHNcIikge1xuICAgICAgICAgICAgYXZhbnRBQXByZXMgPSBBdmFudEFBcHJlcy5BcHJlc1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAhW0F2YW50QUFwcmVzLkEsIEF2YW50QUFwcmVzLkFwcmVzLCBBdmFudEFBcHJlcy5BdmFudF0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIGF2YW50QUFwcmVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXZhbnRBQXByZXMgPSBBdmFudEFBcHJlcy5BXG4gICAgICAgICAgfVxuICAgICAgICAgIGFsaW5lYS5hdmFudEFBcHJlcyA9IGF2YW50QUFwcmVzXG4gICAgICAgIH1cblxuICAgICAgICBwb2ludGV1ckZyYWdtZW50VGV4dGUuYWxpbmVhID0gYWxpbmVhXG4gICAgICB9XG4gICAgICBkZWxldGUgcG9pbnRldXJGcmFnbWVudFRleHRlLmFtZW5kZW1lbnRTdGFuZGFyZFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvcnBzID0gYW1lbmRlbWVudC5jb3Jwc1xuICBpZiAoY29ycHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGNvcnBzKVxuXG4gICAgY29uc3QgY29udGVudUF1dGV1ciA9IGNvcnBzLmNvbnRlbnVBdXRldXJcbiAgICBpZiAoY29udGVudUF1dGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhjb250ZW51QXV0ZXVyKVxuXG4gICAgICBjb25zdCBhdmFudEFwcGVsID0gY29udGVudUF1dGV1ci5hdmFudEFwcGVsXG4gICAgICBpZiAoYXZhbnRBcHBlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKGF2YW50QXBwZWwpXG5cbiAgICAgICAgY2xlYW5EaXNwb3NpdGlmQW1kdENyZWRpdFBMRihhdmFudEFwcGVsLmRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGLCB7XG4gICAgICAgICAgcmVjdGlmaWNhdGlmOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICAgY2xlYW5EaXNwb3NpdGlmQW1kdENyZWRpdFBMRihhdmFudEFwcGVsLmRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGUiwge1xuICAgICAgICAgIHJlY3RpZmljYXRpZjogdHJ1ZSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXZhbnRBcHBlbCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIGNvbnRlbnVBdXRldXIuYXZhbnRBcHBlbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb250ZW51QXV0ZXVyLmFubmV4ZUV4cG9zZVNvbW1haXJlLCB1bmRlZmluZWQpXG5cbiAgICAgIGNsZWFuRGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYoY29udGVudUF1dGV1ci5kaXNwb3NpdGlmQW1kdENyZWRpdFBMRiwge1xuICAgICAgICByZWN0aWZpY2F0aWY6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGNsZWFuRGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYoY29udGVudUF1dGV1ci5kaXNwb3NpdGlmQW1kdENyZWRpdFBMRlIsIHtcbiAgICAgICAgcmVjdGlmaWNhdGlmOiB0cnVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBjeWNsZURlVmllID0gYW1lbmRlbWVudC5jeWNsZURlVmllXG4gIGlmIChjeWNsZURlVmllICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhjeWNsZURlVmllKVxuXG4gICAgY29uc3QgZXRhdERlc1RyYWl0ZW1lbnRzID0gY3ljbGVEZVZpZS5ldGF0RGVzVHJhaXRlbWVudHNcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhldGF0RGVzVHJhaXRlbWVudHMpXG5cbiAgICAgIGNvbnN0IGV0YXQgPSBldGF0RGVzVHJhaXRlbWVudHMuZXRhdFxuICAgICAge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhldGF0KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VzRXRhdCA9IGV0YXREZXNUcmFpdGVtZW50cy5zb3VzRXRhdFxuICAgICAgaWYgKHNvdXNFdGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoc291c0V0YXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFtZW5kZW1lbnQucmVwcmVzZW50YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXByZXNlbnRhdGlvbiA9IGFtZW5kZW1lbnQucmVwcmVzZW50YXRpb25zLnJlcHJlc2VudGF0aW9uXG4gICAgYXNzZXJ0KCFBcnJheS5pc0FycmF5KHJlcHJlc2VudGF0aW9uKSlcbiAgICBhbWVuZGVtZW50LnJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb25cbiAgICBkZWxldGUgYW1lbmRlbWVudC5yZXByZXNlbnRhdGlvbnNcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhyZXByZXNlbnRhdGlvbilcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLnJlcFNvdXJjZSwgdW5kZWZpbmVkKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLm9mZnNldCwgdW5kZWZpbmVkKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLmRhdGVEaXNwb1JlcHJlc2VudGF0aW9uLCB1bmRlZmluZWQpXG5cbiAgICAgIGNvbnN0IHN0YXR1dFJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb24uc3RhdHV0UmVwcmVzZW50YXRpb25cbiAgICAgIHtcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcImNhbm9uaXF1ZVwiKVxuICAgICAgICBjbGVhbkJvb2xlYW5BdHRyaWJ1dGUoc3RhdHV0UmVwcmVzZW50YXRpb24sIFwiZW5yZWdpc3RyZW1lbnRcIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcIm9mZmljaWVsbGVcIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcInRyYW5zY3JpcHRpb25cIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcInZlcmJhdGltXCIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9pUmVmZXJlbmNlID0gYW1lbmRlbWVudC5sb2lSZWZlcmVuY2VcbiAgaWYgKGxvaVJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMobG9pUmVmZXJlbmNlKVxuICB9XG5cbiAgY29uc3QgZGlzY3Vzc2lvbkNvbW11bmUgPSBhbWVuZGVtZW50LmRpc2N1c3Npb25Db21tdW5lXG4gIGlmIChkaXNjdXNzaW9uQ29tbXVuZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZGlzY3Vzc2lvbkNvbW11bmUpXG4gIH1cblxuICBjb25zdCBkaXNjdXNzaW9uSWRlbnRpcXVlID0gYW1lbmRlbWVudC5kaXNjdXNzaW9uSWRlbnRpcXVlXG4gIGlmIChkaXNjdXNzaW9uSWRlbnRpcXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhkaXNjdXNzaW9uSWRlbnRpcXVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFuRGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYoXG4gIGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGOiBhbnksXG4gIHsgcmVjdGlmaWNhdGlmIH06IHsgcmVjdGlmaWNhdGlmOiBib29sZWFuIH0sXG4pOiB2b2lkIHtcbiAgaWYgKGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsaXN0ZVByb2dyYW1tZXMgPSBkaXNwb3NpdGlmQW1kdENyZWRpdFBMRi5saXN0ZVByb2dyYW1tZXM/LnByb2dyYW1tZVxuICAgIGlmIChsaXN0ZVByb2dyYW1tZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVQcm9ncmFtbWVzKSkge1xuICAgICAgICBkaXNwb3NpdGlmQW1kdENyZWRpdFBMRi5saXN0ZVByb2dyYW1tZXMgPSBsaXN0ZVByb2dyYW1tZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydChsaXN0ZVByb2dyYW1tZXMpXG4gICAgICAgIGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGLmxpc3RlUHJvZ3JhbW1lcyA9IFtsaXN0ZVByb2dyYW1tZXNdXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcHJvZ3JhbW1lIG9mIGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGLmxpc3RlUHJvZ3JhbW1lcykge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhwcm9ncmFtbWUpXG5cbiAgICAgICAgaWYgKHByb2dyYW1tZS5saWduZXNDcmVkaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsZXQgbGlnbmVzQ3JlZGl0cyA9IHByb2dyYW1tZS5saWduZXNDcmVkaXRzLmxpZ25lQ3JlZGl0XG4gICAgICAgICAgaWYgKGxpZ25lc0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVsZXRlIHByb2dyYW1tZS5saWduZXNDcmVkaXRzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsaWduZXNDcmVkaXRzKSkge1xuICAgICAgICAgICAgICBhc3NlcnQobGlnbmVzQ3JlZGl0cylcbiAgICAgICAgICAgICAgbGlnbmVzQ3JlZGl0cyA9IFtsaWduZXNDcmVkaXRzXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvZ3JhbW1lLmxpZ25lc0NyZWRpdHMgPSBsaWduZXNDcmVkaXRzXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsaWduZXNDcmVkaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlnbmVDcmVkaXQgb2YgbGlnbmVzQ3JlZGl0cykge1xuICAgICAgICAgICAgICBpZiAocmVjdGlmaWNhdGlmKSB7XG4gICAgICAgICAgICAgICAgY2xlYW5MaWduZUNyZWRpdFBMRlIobGlnbmVDcmVkaXQpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMobGlnbmVDcmVkaXQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xlYW5MaWduZUNyZWRpdFBMRlIobGlnbmVDcmVkaXRQTEZSOiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHMobGlnbmVDcmVkaXRQTEZSKVxuXG4gIGlmIChsaWduZUNyZWRpdFBMRlIubGlnbmVzQ3JlZGl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IGxpZ25lc0NyZWRpdHMgPSBsaWduZUNyZWRpdFBMRlIubGlnbmVzQ3JlZGl0cy5saWduZUNyZWRpdFxuICAgIGlmIChsaWduZXNDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBsaWduZUNyZWRpdFBMRlIubGlnbmVzQ3JlZGl0c1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlnbmVzQ3JlZGl0cykpIHtcbiAgICAgICAgYXNzZXJ0KGxpZ25lc0NyZWRpdHMpXG4gICAgICAgIGxpZ25lc0NyZWRpdHMgPSBbbGlnbmVzQ3JlZGl0c11cbiAgICAgIH1cbiAgICAgIGxpZ25lQ3JlZGl0UExGUi5saWduZXNDcmVkaXRzID0gbGlnbmVzQ3JlZGl0c1xuICAgIH1cbiAgICBpZiAobGlnbmVzQ3JlZGl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpZ25lQ3JlZGl0IG9mIGxpZ25lc0NyZWRpdHMpIHtcbiAgICAgICAgY2xlYW5MaWduZUNyZWRpdFBMRlIobGlnbmVDcmVkaXQpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblRleHRlTGVnaXNsYXRpZih0ZXh0ZUxlZ2lzbGF0aWY6IGFueSk6IHZvaWQge1xuICBjbGVhblhtbEFydGVmYWN0cyh0ZXh0ZUxlZ2lzbGF0aWYpXG5cbiAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gYHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50c2AgYXJlIGN1cnJlbnRseSBpZ25vcmVkOlxuICAvLyAqIFwiI3RleHRcIj86ICAgICAgIHN0cmluZztcbiAgLy8gKiBvZmZzZXQ/OiAgICAgICAgbnVsbDtcbiAgLy8gKiBub20/OiAgICAgICAgICAgTm9tO1xuICAvLyAqIGF2YW50X0FfQXByZXM/OiBEaXZpc2lvbkF2YW50QUFwcmVzO1xuICAvLyAqIGRhdGVEZXBvdD86ICAgICBEYXRlO1xuICAvLyAqIGRvY3VtZW50VVJJPzogICBzdHJpbmc7XG4gIC8vIEJlY2F1c2UgaXQgc2VlbXMgdGhleSBzaG91bGQgYmVsb25nIHRvIGFuIFwiYW1lbmRlbWVudFwiLlxuICBsZXQgYW1lbmRlbWVudCA9IHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cy5hbWVuZGVtZW50XG4gIGlmIChBcnJheS5pc0FycmF5KGFtZW5kZW1lbnQpKSB7XG4gICAgdGV4dGVMZWdpc2xhdGlmLmFtZW5kZW1lbnRzID0gYW1lbmRlbWVudFxuICB9IGVsc2Uge1xuICAgIGFzc2VydChhbWVuZGVtZW50KVxuICAgIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cyA9IFthbWVuZGVtZW50XVxuICB9XG5cbiAgZm9yIChjb25zdCBhbWVuZGVtZW50IG9mIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cykge1xuICAgIGNsZWFuQW1lbmRlbWVudChhbWVuZGVtZW50KVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxRQUFRO0FBQUEsU0FFbEJDLHFCQUFxQixFQUFFQyxpQkFBaUI7QUFBQSxTQUN4Q0MsV0FBVztBQUVwQixPQUFPLFNBQVNDLGVBQWVBLENBQUNDLFVBQWUsRUFBUTtFQUNyREgsaUJBQWlCLENBQUNHLFVBQVUsQ0FBQztFQUU3QixNQUFNQyxXQUFXLEdBQUdELFVBQVUsQ0FBQ0MsV0FBVztFQUMxQztJQUNFSixpQkFBaUIsQ0FBQ0ksV0FBVyxDQUFDO0lBRTlCLE1BQU1DLE1BQU0sR0FBR0QsV0FBVyxDQUFDQyxNQUFNO0lBQ2pDO01BQ0VMLGlCQUFpQixDQUFDSyxNQUFNLENBQUM7SUFDM0I7SUFFQSxJQUFJRCxXQUFXLENBQUNFLGFBQWEsS0FBS0MsU0FBUyxFQUFFO01BQzNDLE1BQU1DLFNBQVMsR0FBR0osV0FBVyxDQUFDRSxhQUFhLENBQUNFLFNBQVM7TUFDckQsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLFNBQVMsQ0FBQyxFQUFFO1FBQzVCSixXQUFXLENBQUNPLGlCQUFpQixHQUFHSCxTQUFTO01BQzNDLENBQUMsTUFBTTtRQUNMVixNQUFNLENBQUNVLFNBQVMsQ0FBQztRQUNqQkosV0FBVyxDQUFDTyxpQkFBaUIsR0FBRyxDQUFDSCxT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