@tricoteuses/assemblee
Version:
Retrieve, clean up & handle French Assemblée nationale's open data
521 lines (518 loc) • 63.2 kB
JavaScript
"use strict";
require("core-js/modules/es.symbol.js");
require("core-js/modules/es.symbol.description.js");
require("core-js/modules/es.symbol.iterator.js");
require("core-js/modules/es.array.from.js");
require("core-js/modules/es.array.is-array.js");
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.array.slice.js");
require("core-js/modules/es.date.to-string.js");
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.object.define-property.js");
require("core-js/modules/es.object.to-string.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.regexp.to-string.js");
require("core-js/modules/es.string.iterator.js");
require("core-js/modules/web.dom-collections.iterator.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.insertActeurReferences = insertActeurReferences;
exports.insertAmendementReferences = insertAmendementReferences;
exports.insertDocumentReferences = insertDocumentReferences;
exports.insertDossierReferences = insertDossierReferences;
exports.insertOrganeReferences = insertOrganeReferences;
exports.insertReunionReferences = insertReunionReferences;
exports.insertScrutinReferences = insertScrutinReferences;
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function insertActeLegislatifReferences(acte, data, visitedUids) {
if (!visitedUids.has(acte.uid)) {
visitedUids.add(acte.uid);
if (data.documentByUid !== undefined && acte.depotInitialLectureDefinitiveRef !== undefined) {
var document = data.documentByUid[acte.depotInitialLectureDefinitiveRef];
if (document !== undefined) {
acte.depotInitialLectureDefinitive = document;
insertDocumentReferences(document, data, visitedUids);
}
}
if (data.organeByUid !== undefined && acte.organeRef !== undefined) {
var organe = data.organeByUid[acte.organeRef];
if (organe !== undefined) {
acte.organe = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
if (data.organeByUid !== undefined && acte.provenanceRef !== undefined) {
var _organe = data.organeByUid[acte.provenanceRef];
if (_organe !== undefined) {
acte.provenance = _organe;
insertOrganeReferences(_organe, data, visitedUids);
}
}
if (data.acteurByUid !== undefined && acte.rapporteurs !== undefined) {
var _iterator = _createForOfIteratorHelper(acte.rapporteurs),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var rapporteur = _step.value;
var acteur = data.acteurByUid[rapporteur.acteurRef];
if (acteur !== undefined) {
rapporteur.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
if (data.reunionByUid !== undefined && acte.reunionRef !== undefined) {
var reunion = data.reunionByUid[acte.reunionRef];
if (reunion !== undefined) {
acte.reunion = reunion;
insertReunionReferences(reunion, data, visitedUids);
if (acte.odjRef !== undefined) {
var odj = reunion.odj;
if (odj !== undefined && odj.pointsOdj !== undefined) {
var _iterator2 = _createForOfIteratorHelper(odj.pointsOdj),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var pointOdj = _step2.value;
if (pointOdj.uid === acte.odjRef) {
acte.odj = pointOdj;
break;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
}
}
}
if (data.documentByUid !== undefined && acte.texteAdopteRef !== undefined) {
var _document = data.documentByUid[acte.texteAdopteRef];
if (_document !== undefined) {
acte.texteAdopte = _document;
insertDocumentReferences(_document, data, visitedUids);
}
}
if (data.documentByUid !== undefined && acte.texteAssocieRef !== undefined) {
var _document2 = data.documentByUid[acte.texteAssocieRef];
if (_document2 !== undefined) {
acte.texteAssocie = _document2;
insertDocumentReferences(_document2, data, visitedUids);
}
}
if (data.documentByUid !== undefined && acte.textesAssocies !== undefined) {
var _iterator3 = _createForOfIteratorHelper(acte.textesAssocies),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var texteAssocie = _step3.value;
var _document3 = data.documentByUid[texteAssocie.texteAssocieRef];
if (_document3 !== undefined) {
texteAssocie.texteAssocie = _document3;
insertDocumentReferences(_document3, data, visitedUids);
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
if (data.scrutinByUid !== undefined && acte.voteRefs !== undefined) {
var scrutins = [];
var _iterator4 = _createForOfIteratorHelper(acte.voteRefs),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var voteRef = _step4.value;
var scrutin = data.scrutinByUid[voteRef];
if (scrutin !== undefined) {
scrutins.push(scrutin);
insertScrutinReferences(scrutin, data, visitedUids);
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
acte.votes = scrutins;
}
var _iterator5 = _createForOfIteratorHelper(acte.actesLegislatifs || []),
_step5;
try {
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
var childActe = _step5.value;
insertActeLegislatifReferences(childActe, data, visitedUids);
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
}
return acte;
}
function insertActeurReferences(acteur, data, visitedUids) {
if (!visitedUids.has(acteur.uid)) {
visitedUids.add(acteur.uid);
if (data.organeByUid !== undefined) {
var _iterator6 = _createForOfIteratorHelper(acteur.mandats || []),
_step6;
try {
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
var mandat = _step6.value;
var organes = [];
var _iterator7 = _createForOfIteratorHelper(mandat.organesRefs),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var organeRef = _step7.value;
var organe = data.organeByUid[organeRef];
if (organe !== undefined) {
organes.push(organe);
insertOrganeReferences(organe, data, visitedUids);
}
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
mandat.organes = organes;
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
}
}
return acteur;
}
function insertAmendementReferences(amendement, data, visitedUids) {
if (!visitedUids.has(amendement.uid)) {
visitedUids.add(amendement.uid);
var signataires = amendement.signataires;
var auteur = signataires.auteur;
if (data.acteurByUid !== undefined && auteur.acteurRef !== undefined) {
var acteur = data.acteurByUid[auteur.acteurRef];
if (acteur !== undefined) {
auteur.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
}
if (data.organeByUid !== undefined && auteur.auteurRapporteurOrganeRef !== undefined) {
var auteurRapporteurOrgane = data.organeByUid[auteur.auteurRapporteurOrganeRef];
if (auteurRapporteurOrgane !== undefined) {
auteur.auteurRapporteurOrgane = auteurRapporteurOrgane;
insertOrganeReferences(auteurRapporteurOrgane, data, visitedUids);
}
}
if (data.organeByUid !== undefined && auteur.gouvernementRef !== undefined) {
var gouvernement = data.organeByUid[auteur.gouvernementRef];
if (gouvernement !== undefined) {
auteur.gouvernement = gouvernement;
insertOrganeReferences(gouvernement, data, visitedUids);
}
}
if (data.organeByUid !== undefined && auteur.groupePolitiqueRef !== undefined) {
var organe = data.organeByUid[auteur.groupePolitiqueRef];
if (organe !== undefined) {
auteur.groupePolitique = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
if (data.acteurByUid !== undefined) {
var cosignatairesRefs = signataires.cosignatairesRefs;
if (cosignatairesRefs !== undefined) {
var cosignataires = [];
var _iterator8 = _createForOfIteratorHelper(signataires.cosignatairesRefs || []),
_step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
var cosignataireRef = _step8.value;
var cosignataire = data.acteurByUid[cosignataireRef];
if (cosignataire !== undefined) {
cosignataires.push(cosignataire);
insertActeurReferences(cosignataire, data, visitedUids);
}
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
signataires.cosignataires = cosignataires;
}
}
}
return amendement;
}
function insertDivisionReferences(division, data, visitedUids) {
var _iterator9 = _createForOfIteratorHelper(division.auteurs),
_step9;
try {
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
var auteur = _step9.value;
var acteurSummary = auteur.acteur;
if (data.acteurByUid !== undefined && acteurSummary !== undefined) {
var acteur = data.acteurByUid[acteurSummary.acteurRef];
if (acteur !== undefined) {
acteurSummary.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
}
if (data.organeByUid !== undefined && auteur.organeRef !== undefined) {
var organe = data.organeByUid[auteur.organeRef];
if (organe !== undefined) {
auteur.organe = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
}
} catch (err) {
_iterator9.e(err);
} finally {
_iterator9.f();
}
if (data.dossierByUid !== undefined) {
var dossier = data.dossierByUid[division.dossierRef];
if (dossier !== undefined) {
division.dossier = dossier;
insertDossierReferences(dossier, data, visitedUids);
}
}
var _iterator10 = _createForOfIteratorHelper(division.divisions || []),
_step10;
try {
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
var childDivision = _step10.value;
insertDivisionReferences(childDivision, data, visitedUids);
}
} catch (err) {
_iterator10.e(err);
} finally {
_iterator10.f();
}
return division;
}
function insertDocumentReferences(document, data, visitedUids) {
if (!visitedUids.has(document.uid)) {
visitedUids.add(document.uid);
var _iterator11 = _createForOfIteratorHelper(document.auteurs),
_step11;
try {
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
var auteur = _step11.value;
var acteurSummary = auteur.acteur;
if (data.acteurByUid !== undefined && acteurSummary !== undefined) {
var acteur = data.acteurByUid[acteurSummary.acteurRef];
if (acteur !== undefined) {
acteurSummary.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
}
if (data.organeByUid !== undefined && auteur.organeRef !== undefined) {
var organe = data.organeByUid[auteur.organeRef];
if (organe !== undefined) {
auteur.organe = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
}
} catch (err) {
_iterator11.e(err);
} finally {
_iterator11.f();
}
if (data.dossierByUid !== undefined) {
var dossier = data.dossierByUid[document.dossierRef];
if (dossier !== undefined) {
document.dossier = dossier;
insertDossierReferences(dossier, data, visitedUids);
}
}
var _iterator12 = _createForOfIteratorHelper(document.divisions || []),
_step12;
try {
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
var division = _step12.value;
insertDivisionReferences(division, data, visitedUids);
}
} catch (err) {
_iterator12.e(err);
} finally {
_iterator12.f();
}
}
return document;
}
function insertDossierReferences(dossier, data, visitedUids) {
if (!visitedUids.has(dossier.uid)) {
var _dossier$actesLegisla;
visitedUids.add(dossier.uid);
var _iterator13 = _createForOfIteratorHelper((_dossier$actesLegisla = dossier.actesLegislatifs) !== null && _dossier$actesLegisla !== void 0 ? _dossier$actesLegisla : []),
_step13;
try {
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
var acte = _step13.value;
insertActeLegislatifReferences(acte, data, visitedUids);
}
} catch (err) {
_iterator13.e(err);
} finally {
_iterator13.f();
}
var initiateur = dossier.initiateur;
if (initiateur !== undefined) {
if (data.acteurByUid !== undefined) {
var _iterator14 = _createForOfIteratorHelper(initiateur.acteurs || []),
_step14;
try {
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
var acteurSummary = _step14.value;
var acteur = data.acteurByUid[acteurSummary.acteurRef];
if (acteur !== undefined) {
acteurSummary.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
if (acteur !== undefined && acteurSummary.mandatRef !== undefined) {
var _iterator15 = _createForOfIteratorHelper(acteur.mandats || []),
_step15;
try {
for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
var mandat = _step15.value;
if (mandat.uid === acteurSummary.mandatRef) {
acteurSummary.mandat = mandat;
break;
}
}
} catch (err) {
_iterator15.e(err);
} finally {
_iterator15.f();
}
}
}
} catch (err) {
_iterator14.e(err);
} finally {
_iterator14.f();
}
}
if (data.organeByUid !== undefined && initiateur.organeRef !== undefined) {
var organe = data.organeByUid[initiateur.organeRef];
if (organe !== undefined) {
initiateur.organe = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
}
}
return dossier;
}
function insertOrganeReferences(organe, data, visitedUids) {
if (!visitedUids.has(organe.uid)) {
visitedUids.add(organe.uid);
if (data.organeByUid !== undefined && organe.organeParentRef !== undefined) {
var organeParent = data.organeByUid[organe.organeParentRef];
if (organeParent !== undefined) {
organe.organeParent = organeParent;
insertOrganeReferences(organeParent, data, visitedUids);
}
}
if (data.organeByUid !== undefined && organe.organePrecedentRef !== undefined) {
var organePrecedent = data.organeByUid[organe.organePrecedentRef];
if (organePrecedent !== undefined) {
organe.organePrecedent = organePrecedent;
insertOrganeReferences(organePrecedent, data, visitedUids);
}
}
// TODO
}
return organe;
}
function insertReunionReferences(reunion, data, visitedUids) {
if (!visitedUids.has(reunion.uid)) {
visitedUids.add(reunion.uid);
var demandeurs = reunion.demandeurs;
if (demandeurs !== undefined) {
if (data.acteurByUid !== undefined) {
var _iterator16 = _createForOfIteratorHelper(demandeurs.acteurs || []),
_step16;
try {
for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
var acteurSummary = _step16.value;
var acteur = data.acteurByUid[acteurSummary.acteurRef];
if (acteur !== undefined) {
acteurSummary.acteur = acteur;
insertActeurReferences(acteur, data, visitedUids);
}
}
} catch (err) {
_iterator16.e(err);
} finally {
_iterator16.f();
}
}
if (data.organeByUid !== undefined) {
var organeSummary = demandeurs.organe;
if (organeSummary !== undefined) {
var organe = data.organeByUid[organeSummary.organeRef];
if (organe !== undefined) {
organeSummary.organe = organe;
insertOrganeReferences(organe, data, visitedUids);
}
}
}
}
if (data.organeByUid !== undefined && reunion.organeReuniRef !== undefined) {
var organeReuni = data.organeByUid[reunion.organeReuniRef];
if (organeReuni !== undefined) {
reunion.organeReuni = organeReuni;
insertOrganeReferences(organeReuni, data, visitedUids);
}
}
if (data.acteurByUid !== undefined) {
var participants = reunion.participants;
if (participants !== undefined) {
var _iterator17 = _createForOfIteratorHelper(participants.participantsInternes || []),
_step17;
try {
for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
var participantInterne = _step17.value;
var _acteur = data.acteurByUid[participantInterne.acteurRef];
if (_acteur !== undefined) {
participantInterne.acteur = _acteur;
insertActeurReferences(_acteur, data, visitedUids);
}
}
} catch (err) {
_iterator17.e(err);
} finally {
_iterator17.f();
}
}
}
}
return reunion;
}
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpbnNlcnRBY3RlTGVnaXNsYXRpZlJlZmVyZW5jZXMiLCJhY3RlIiwiZGF0YSIsInZpc2l0ZWRVaWRzIiwiaGFzIiwidWlkIiwiYWRkIiwiZG9jdW1lbnRCeVVpZCIsInVuZGVmaW5lZCIsImRlcG90SW5pdGlhbExlY3R1cmVEZWZpbml0aXZlUmVmIiwiZG9jdW1lbnQiLCJkZXBvdEluaXRpYWxMZWN0dXJlRGVmaW5pdGl2ZSIsImluc2VydERvY3VtZW50UmVmZXJlbmNlcyIsIm9yZ2FuZUJ5VWlkIiwib3JnYW5lUmVmIiwib3JnYW5lIiwiaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyIsInByb3ZlbmFuY2VSZWYiLCJwcm92ZW5hbmNlIiwiYWN0ZXVyQnlVaWQiLCJyYXBwb3J0ZXVycyIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJyYXBwb3J0ZXVyIiwidmFsdWUiLCJhY3RldXIiLCJhY3RldXJSZWYiLCJpbnNlcnRBY3RldXJSZWZlcmVuY2VzIiwiZXJyIiwiZSIsImYiLCJyZXVuaW9uQnlVaWQiLCJyZXVuaW9uUmVmIiwicmV1bmlvbiIsImluc2VydFJldW5pb25SZWZlcmVuY2VzIiwib2RqUmVmIiwib2RqIiwicG9pbnRzT2RqIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsInBvaW50T2RqIiwidGV4dGVBZG9wdGVSZWYiLCJ0ZXh0ZUFkb3B0ZSIsInRleHRlQXNzb2NpZVJlZiIsInRleHRlQXNzb2NpZSIsInRleHRlc0Fzc29jaWVzIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsInNjcnV0aW5CeVVpZCIsInZvdGVSZWZzIiwic2NydXRpbnMiLCJfaXRlcmF0b3I0IiwiX3N0ZXA0Iiwidm90ZVJlZiIsInNjcnV0aW4iLCJwdXNoIiwiaW5zZXJ0U2NydXRpblJlZmVyZW5jZXMiLCJ2b3RlcyIsIl9pdGVyYXRvcjUiLCJhY3Rlc0xlZ2lzbGF0aWZzIiwiX3N0ZXA1IiwiY2hpbGRBY3RlIiwiX2l0ZXJhdG9yNiIsIm1hbmRhdHMiLCJfc3RlcDYiLCJtYW5kYXQiLCJvcmdhbmVzIiwiX2l0ZXJhdG9yNyIsIm9yZ2FuZXNSZWZzIiwiX3N0ZXA3IiwiaW5zZXJ0QW1lbmRlbWVudFJlZmVyZW5jZXMiLCJhbWVuZGVtZW50Iiwic2lnbmF0YWlyZXMiLCJhdXRldXIiLCJhdXRldXJSYXBwb3J0ZXVyT3JnYW5lUmVmIiwiYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZSIsImdvdXZlcm5lbWVudFJlZiIsImdvdXZlcm5lbWVudCIsImdyb3VwZVBvbGl0aXF1ZVJlZiIsImdyb3VwZVBvbGl0aXF1ZSIsImNvc2lnbmF0YWlyZXNSZWZzIiwiY29zaWduYXRhaXJlcyIsIl9pdGVyYXRvcjgiLCJfc3RlcDgiLCJjb3NpZ25hdGFpcmVSZWYiLCJjb3NpZ25hdGFpcmUiLCJpbnNlcnREaXZpc2lvblJlZmVyZW5jZXMiLCJkaXZpc2lvbiIsIl9pdGVyYXRvcjkiLCJhdXRldXJzIiwiX3N0ZXA5IiwiYWN0ZXVyU3VtbWFyeSIsImRvc3NpZXJCeVVpZCIsImRvc3NpZXIiLCJkb3NzaWVyUmVmIiwiaW5zZXJ0RG9zc2llclJlZmVyZW5jZXMiLCJfaXRlcmF0b3IxMCIsImRpdmlzaW9ucyIsIl9zdGVwMTAiLCJjaGlsZERpdmlzaW9uIiwiX2l0ZXJhdG9yMTEiLCJfc3RlcDExIiwiX2l0ZXJhdG9yMTIiLCJfc3RlcDEyIiwiX2Rvc3NpZXIkYWN0ZXNMZWdpc2xhIiwiX2l0ZXJhdG9yMTMiLCJfc3RlcDEzIiwiaW5pdGlhdGV1ciIsIl9pdGVyYXRvcjE0IiwiYWN0ZXVycyIsIl9zdGVwMTQiLCJtYW5kYXRSZWYiLCJfaXRlcmF0b3IxNSIsIl9zdGVwMTUiLCJvcmdhbmVQYXJlbnRSZWYiLCJvcmdhbmVQYXJlbnQiLCJvcmdhbmVQcmVjZWRlbnRSZWYiLCJvcmdhbmVQcmVjZWRlbnQiLCJkZW1hbmRldXJzIiwiX2l0ZXJhdG9yMTYiLCJfc3RlcDE2Iiwib3JnYW5lU3VtbWFyeSIsIm9yZ2FuZVJldW5pUmVmIiwib3JnYW5lUmV1bmkiLCJwYXJ0aWNpcGFudHMiLCJfaXRlcmF0b3IxNyIsInBhcnRpY2lwYW50c0ludGVybmVzIiwiX3N0ZXAxNyIsInBhcnRpY2lwYW50SW50ZXJuZSIsIl9kYXRhIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luc2VydGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY3RldXIsIE9yZ2FuZSB9IGZyb20gXCIuL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBSZXVuaW9uIH0gZnJvbSBcIi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50IH0gZnJvbSBcIi4vdHlwZXMvYW1lbmRlbWVudHNcIlxuaW1wb3J0IHtcbiAgQWN0ZUxlZ2lzbGF0aWYsXG4gIERpdmlzaW9uLFxuICBEb2N1bWVudCxcbiAgRG9zc2llclBhcmxlbWVudGFpcmUsXG59IGZyb20gXCIuL3R5cGVzL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmltcG9ydCB7IFNjcnV0aW4gfSBmcm9tIFwiLi90eXBlcy9zY3J1dGluc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0RGF0YSB7XG4gIHJlYWRvbmx5IGFjdGV1ckJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfVxuICByZWFkb25seSBhbWVuZGVtZW50QnlVaWQ/OiB7IFt1aWQ6IHN0cmluZ106IEFtZW5kZW1lbnQgfVxuICByZWFkb25seSBkb2N1bWVudEJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBEb2N1bWVudCB9XG4gIHJlYWRvbmx5IGRvc3NpZXJCeVVpZD86IHsgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmUgfVxuICByZWFkb25seSBvcmdhbmVCeVVpZD86IHsgW3VpZDogc3RyaW5nXTogT3JnYW5lIH1cbiAgcmVhZG9ubHkgcmV1bmlvbkJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH1cbiAgcmVhZG9ubHkgc2NydXRpbkJ5VWlkPzogeyBbdWlkOiBzdHJpbmddOiBTY3J1dGluIH1cbn1cblxuZnVuY3Rpb24gaW5zZXJ0QWN0ZUxlZ2lzbGF0aWZSZWZlcmVuY2VzKFxuICBhY3RlOiBBY3RlTGVnaXNsYXRpZixcbiAgZGF0YTogT3V0cHV0RGF0YSxcbiAgdmlzaXRlZFVpZHM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGlmICghdmlzaXRlZFVpZHMuaGFzKGFjdGUudWlkKSkge1xuICAgIHZpc2l0ZWRVaWRzLmFkZChhY3RlLnVpZClcblxuICAgIGlmIChcbiAgICAgIGRhdGEuZG9jdW1lbnRCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhY3RlLmRlcG90SW5pdGlhbExlY3R1cmVEZWZpbml0aXZlUmVmICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IGRvY3VtZW50ID0gZGF0YS5kb2N1bWVudEJ5VWlkW2FjdGUuZGVwb3RJbml0aWFsTGVjdHVyZURlZmluaXRpdmVSZWZdXG4gICAgICBpZiAoZG9jdW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY3RlLmRlcG90SW5pdGlhbExlY3R1cmVEZWZpbml0aXZlID0gZG9jdW1lbnRcbiAgICAgICAgaW5zZXJ0RG9jdW1lbnRSZWZlcmVuY2VzKGRvY3VtZW50LCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RlLm9yZ2FuZVJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2FjdGUub3JnYW5lUmVmXVxuICAgICAgaWYgKG9yZ2FuZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGUub3JnYW5lID0gb3JnYW5lXG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RlLnByb3ZlbmFuY2VSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgb3JnYW5lID0gZGF0YS5vcmdhbmVCeVVpZFthY3RlLnByb3ZlbmFuY2VSZWZdXG4gICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYWN0ZS5wcm92ZW5hbmNlID0gb3JnYW5lXG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RlLnJhcHBvcnRldXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgcmFwcG9ydGV1ciBvZiBhY3RlLnJhcHBvcnRldXJzKSB7XG4gICAgICAgIGNvbnN0IGFjdGV1ciA9IGRhdGEuYWN0ZXVyQnlVaWRbcmFwcG9ydGV1ci5hY3RldXJSZWZdXG4gICAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJhcHBvcnRldXIuYWN0ZXVyID0gYWN0ZXVyXG4gICAgICAgICAgaW5zZXJ0QWN0ZXVyUmVmZXJlbmNlcyhhY3RldXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLnJldW5pb25CeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUucmV1bmlvblJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXVuaW9uID0gZGF0YS5yZXVuaW9uQnlVaWRbYWN0ZS5yZXVuaW9uUmVmXVxuICAgICAgaWYgKHJldW5pb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY3RlLnJldW5pb24gPSByZXVuaW9uXG4gICAgICAgIGluc2VydFJldW5pb25SZWZlcmVuY2VzKHJldW5pb24sIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICBpZiAoYWN0ZS5vZGpSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgICAgaWYgKG9kaiAhPT0gdW5kZWZpbmVkICYmIG9kai5wb2ludHNPZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludE9kaiBvZiBvZGoucG9pbnRzT2RqKSB7XG4gICAgICAgICAgICAgIGlmIChwb2ludE9kai51aWQgPT09IGFjdGUub2RqUmVmKSB7XG4gICAgICAgICAgICAgICAgYWN0ZS5vZGogPSBwb2ludE9kalxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuZG9jdW1lbnRCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUudGV4dGVBZG9wdGVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBkYXRhLmRvY3VtZW50QnlVaWRbYWN0ZS50ZXh0ZUFkb3B0ZVJlZl1cbiAgICAgIGlmIChkb2N1bWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGUudGV4dGVBZG9wdGUgPSBkb2N1bWVudFxuICAgICAgICBpbnNlcnREb2N1bWVudFJlZmVyZW5jZXMoZG9jdW1lbnQsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBkYXRhLmRvY3VtZW50QnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYWN0ZS50ZXh0ZUFzc29jaWVSZWYgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBkYXRhLmRvY3VtZW50QnlVaWRbYWN0ZS50ZXh0ZUFzc29jaWVSZWZdXG4gICAgICBpZiAoZG9jdW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY3RlLnRleHRlQXNzb2NpZSA9IGRvY3VtZW50XG4gICAgICAgIGluc2VydERvY3VtZW50UmVmZXJlbmNlcyhkb2N1bWVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmRvY3VtZW50QnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RlLnRleHRlc0Fzc29jaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgdGV4dGVBc3NvY2llIG9mIGFjdGUudGV4dGVzQXNzb2NpZXMpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBkYXRhLmRvY3VtZW50QnlVaWRbdGV4dGVBc3NvY2llLnRleHRlQXNzb2NpZVJlZl1cbiAgICAgICAgaWYgKGRvY3VtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0ZXh0ZUFzc29jaWUudGV4dGVBc3NvY2llID0gZG9jdW1lbnRcbiAgICAgICAgICBpbnNlcnREb2N1bWVudFJlZmVyZW5jZXMoZG9jdW1lbnQsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLnNjcnV0aW5CeVVpZCAhPT0gdW5kZWZpbmVkICYmIGFjdGUudm90ZVJlZnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2NydXRpbnMgPSBbXVxuICAgICAgZm9yIChjb25zdCB2b3RlUmVmIG9mIGFjdGUudm90ZVJlZnMpIHtcbiAgICAgICAgY29uc3Qgc2NydXRpbiA9IGRhdGEuc2NydXRpbkJ5VWlkW3ZvdGVSZWZdXG4gICAgICAgIGlmIChzY3J1dGluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzY3J1dGlucy5wdXNoKHNjcnV0aW4pXG4gICAgICAgICAgaW5zZXJ0U2NydXRpblJlZmVyZW5jZXMoc2NydXRpbiwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFjdGUudm90ZXMgPSBzY3J1dGluc1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGRBY3RlIG9mIGFjdGUuYWN0ZXNMZWdpc2xhdGlmcyB8fCBbXSkge1xuICAgICAgaW5zZXJ0QWN0ZUxlZ2lzbGF0aWZSZWZlcmVuY2VzKGNoaWxkQWN0ZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFjdGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEFjdGV1clJlZmVyZW5jZXMoXG4gIGFjdGV1cjogQWN0ZXVyLFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoYWN0ZXVyLnVpZCkpIHtcbiAgICB2aXNpdGVkVWlkcy5hZGQoYWN0ZXVyLnVpZClcblxuICAgIGlmIChkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgbWFuZGF0IG9mIGFjdGV1ci5tYW5kYXRzIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IG9yZ2FuZXMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVJlZiBvZiBtYW5kYXQub3JnYW5lc1JlZnMpIHtcbiAgICAgICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW29yZ2FuZVJlZl1cbiAgICAgICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9yZ2FuZXMucHVzaChvcmdhbmUpXG4gICAgICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hbmRhdC5vcmdhbmVzID0gb3JnYW5lc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhY3RldXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEFtZW5kZW1lbnRSZWZlcmVuY2VzKFxuICBhbWVuZGVtZW50OiBBbWVuZGVtZW50LFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoYW1lbmRlbWVudC51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKGFtZW5kZW1lbnQudWlkKVxuXG4gICAgY29uc3Qgc2lnbmF0YWlyZXMgPSBhbWVuZGVtZW50LnNpZ25hdGFpcmVzXG4gICAgY29uc3QgYXV0ZXVyID0gc2lnbmF0YWlyZXMuYXV0ZXVyXG4gICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhdXRldXIuYWN0ZXVyUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGV1ciA9IGRhdGEuYWN0ZXVyQnlVaWRbYXV0ZXVyLmFjdGV1clJlZl1cbiAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhdXRldXIuYWN0ZXVyID0gYWN0ZXVyXG4gICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBhdXRldXIuYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZVJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBhdXRldXJSYXBwb3J0ZXVyT3JnYW5lID1cbiAgICAgICAgZGF0YS5vcmdhbmVCeVVpZFthdXRldXIuYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZVJlZl1cbiAgICAgIGlmIChhdXRldXJSYXBwb3J0ZXVyT3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXV0ZXVyLmF1dGV1clJhcHBvcnRldXJPcmdhbmUgPSBhdXRldXJSYXBwb3J0ZXVyT3JnYW5lXG4gICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMoYXV0ZXVyUmFwcG9ydGV1ck9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXV0ZXVyLmdvdXZlcm5lbWVudFJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBnb3V2ZXJuZW1lbnQgPSBkYXRhLm9yZ2FuZUJ5VWlkW2F1dGV1ci5nb3V2ZXJuZW1lbnRSZWZdXG4gICAgICBpZiAoZ291dmVybmVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXV0ZXVyLmdvdXZlcm5lbWVudCA9IGdvdXZlcm5lbWVudFxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKGdvdXZlcm5lbWVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXV0ZXVyLmdyb3VwZVBvbGl0aXF1ZVJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2F1dGV1ci5ncm91cGVQb2xpdGlxdWVSZWZdXG4gICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXV0ZXVyLmdyb3VwZVBvbGl0aXF1ZSA9IG9yZ2FuZVxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhLmFjdGV1ckJ5VWlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvc2lnbmF0YWlyZXNSZWZzID0gc2lnbmF0YWlyZXMuY29zaWduYXRhaXJlc1JlZnNcbiAgICAgIGlmIChjb3NpZ25hdGFpcmVzUmVmcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNvc2lnbmF0YWlyZXMgPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGNvc2lnbmF0YWlyZVJlZiBvZiBzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzUmVmcyB8fCBbXSkge1xuICAgICAgICAgIGNvbnN0IGNvc2lnbmF0YWlyZSA9IGRhdGEuYWN0ZXVyQnlVaWRbY29zaWduYXRhaXJlUmVmXVxuICAgICAgICAgIGlmIChjb3NpZ25hdGFpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29zaWduYXRhaXJlcy5wdXNoKGNvc2lnbmF0YWlyZSlcbiAgICAgICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoY29zaWduYXRhaXJlLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmF0YWlyZXMuY29zaWduYXRhaXJlcyA9IGNvc2lnbmF0YWlyZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW1lbmRlbWVudFxufVxuXG5mdW5jdGlvbiBpbnNlcnREaXZpc2lvblJlZmVyZW5jZXMoXG4gIGRpdmlzaW9uOiBEaXZpc2lvbixcbiAgZGF0YTogT3V0cHV0RGF0YSxcbiAgdmlzaXRlZFVpZHM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGZvciAoY29uc3QgYXV0ZXVyIG9mIGRpdmlzaW9uLmF1dGV1cnMpIHtcbiAgICBjb25zdCBhY3RldXJTdW1tYXJ5ID0gYXV0ZXVyLmFjdGV1clxuICAgIGlmIChkYXRhLmFjdGV1ckJ5VWlkICE9PSB1bmRlZmluZWQgJiYgYWN0ZXVyU3VtbWFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhY3RldXIgPSBkYXRhLmFjdGV1ckJ5VWlkW2FjdGV1clN1bW1hcnkuYWN0ZXVyUmVmXVxuICAgICAgaWYgKGFjdGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGV1clN1bW1hcnkuYWN0ZXVyID0gYWN0ZXVyXG4gICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmIGF1dGV1ci5vcmdhbmVSZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgb3JnYW5lID0gZGF0YS5vcmdhbmVCeVVpZFthdXRldXIub3JnYW5lUmVmXVxuICAgICAgaWYgKG9yZ2FuZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF1dGV1ci5vcmdhbmUgPSBvcmdhbmVcbiAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkYXRhLmRvc3NpZXJCeVVpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZG9zc2llciA9IGRhdGEuZG9zc2llckJ5VWlkW2RpdmlzaW9uLmRvc3NpZXJSZWZdXG4gICAgaWYgKGRvc3NpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGl2aXNpb24uZG9zc2llciA9IGRvc3NpZXJcbiAgICAgIGluc2VydERvc3NpZXJSZWZlcmVuY2VzKGRvc3NpZXIsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2hpbGREaXZpc2lvbiBvZiBkaXZpc2lvbi5kaXZpc2lvbnMgfHwgW10pIHtcbiAgICBpbnNlcnREaXZpc2lvblJlZmVyZW5jZXMoY2hpbGREaXZpc2lvbiwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gIH1cblxuICByZXR1cm4gZGl2aXNpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydERvY3VtZW50UmVmZXJlbmNlcyhcbiAgZG9jdW1lbnQ6IERvY3VtZW50LFxuICBkYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoZG9jdW1lbnQudWlkKSkge1xuICAgIHZpc2l0ZWRVaWRzLmFkZChkb2N1bWVudC51aWQpXG5cbiAgICBmb3IgKGNvbnN0IGF1dGV1ciBvZiBkb2N1bWVudC5hdXRldXJzKSB7XG4gICAgICBjb25zdCBhY3RldXJTdW1tYXJ5ID0gYXV0ZXVyLmFjdGV1clxuICAgICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhY3RldXJTdW1tYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFthY3RldXJTdW1tYXJ5LmFjdGV1clJlZl1cbiAgICAgICAgaWYgKGFjdGV1ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYWN0ZXVyU3VtbWFyeS5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgICBpbnNlcnRBY3RldXJSZWZlcmVuY2VzKGFjdGV1ciwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJiBhdXRldXIub3JnYW5lUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgb3JnYW5lID0gZGF0YS5vcmdhbmVCeVVpZFthdXRldXIub3JnYW5lUmVmXVxuICAgICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdXRldXIub3JnYW5lID0gb3JnYW5lXG4gICAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmUsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZG9zc2llckJ5VWlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRvc3NpZXIgPSBkYXRhLmRvc3NpZXJCeVVpZFtkb2N1bWVudC5kb3NzaWVyUmVmXVxuICAgICAgaWYgKGRvc3NpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkb2N1bWVudC5kb3NzaWVyID0gZG9zc2llclxuICAgICAgICBpbnNlcnREb3NzaWVyUmVmZXJlbmNlcyhkb3NzaWVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRpdmlzaW9uIG9mIGRvY3VtZW50LmRpdmlzaW9ucyB8fCBbXSkge1xuICAgICAgaW5zZXJ0RGl2aXNpb25SZWZlcmVuY2VzKGRpdmlzaW9uLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydERvc3NpZXJSZWZlcmVuY2VzKFxuICBkb3NzaWVyOiBEb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgZGF0YTogT3V0cHV0RGF0YSxcbiAgdmlzaXRlZFVpZHM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGlmICghdmlzaXRlZFVpZHMuaGFzKGRvc3NpZXIudWlkKSkge1xuICAgIHZpc2l0ZWRVaWRzLmFkZChkb3NzaWVyLnVpZClcblxuICAgIGZvciAoY29uc3QgYWN0ZSBvZiBkb3NzaWVyLmFjdGVzTGVnaXNsYXRpZnMgPz8gW10pIHtcbiAgICAgIGluc2VydEFjdGVMZWdpc2xhdGlmUmVmZXJlbmNlcyhhY3RlLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICB9XG5cbiAgICBjb25zdCBpbml0aWF0ZXVyID0gZG9zc2llci5pbml0aWF0ZXVyXG4gICAgaWYgKGluaXRpYXRldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGV1clN1bW1hcnkgb2YgaW5pdGlhdGV1ci5hY3RldXJzIHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFthY3RldXJTdW1tYXJ5LmFjdGV1clJlZl1cbiAgICAgICAgICBpZiAoYWN0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFjdGV1clN1bW1hcnkuYWN0ZXVyID0gYWN0ZXVyXG4gICAgICAgICAgICBpbnNlcnRBY3RldXJSZWZlcmVuY2VzKGFjdGV1ciwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3RldXIgIT09IHVuZGVmaW5lZCAmJiBhY3RldXJTdW1tYXJ5Lm1hbmRhdFJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdCBvZiBhY3RldXIubWFuZGF0cyB8fCBbXSkge1xuICAgICAgICAgICAgICBpZiAobWFuZGF0LnVpZCA9PT0gYWN0ZXVyU3VtbWFyeS5tYW5kYXRSZWYpIHtcbiAgICAgICAgICAgICAgICBhY3RldXJTdW1tYXJ5Lm1hbmRhdCA9IG1hbmRhdFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGluaXRpYXRldXIub3JnYW5lUmVmICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBvcmdhbmUgPSBkYXRhLm9yZ2FuZUJ5VWlkW2luaXRpYXRldXIub3JnYW5lUmVmXVxuICAgICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbml0aWF0ZXVyLm9yZ2FuZSA9IG9yZ2FuZVxuICAgICAgICAgIGluc2VydE9yZ2FuZVJlZmVyZW5jZXMob3JnYW5lLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb3NzaWVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKFxuICBvcmdhbmU6IE9yZ2FuZSxcbiAgZGF0YTogT3V0cHV0RGF0YSxcbiAgdmlzaXRlZFVpZHM6IFNldDxzdHJpbmc+LFxuKSB7XG4gIGlmICghdmlzaXRlZFVpZHMuaGFzKG9yZ2FuZS51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKG9yZ2FuZS51aWQpXG5cbiAgICBpZiAoXG4gICAgICBkYXRhLm9yZ2FuZUJ5VWlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9yZ2FuZS5vcmdhbmVQYXJlbnRSZWYgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3Qgb3JnYW5lUGFyZW50ID0gZGF0YS5vcmdhbmVCeVVpZFtvcmdhbmUub3JnYW5lUGFyZW50UmVmXVxuICAgICAgaWYgKG9yZ2FuZVBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9yZ2FuZS5vcmdhbmVQYXJlbnQgPSBvcmdhbmVQYXJlbnRcbiAgICAgICAgaW5zZXJ0T3JnYW5lUmVmZXJlbmNlcyhvcmdhbmVQYXJlbnQsIGRhdGEsIHZpc2l0ZWRVaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3JnYW5lLm9yZ2FuZVByZWNlZGVudFJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBvcmdhbmVQcmVjZWRlbnQgPSBkYXRhLm9yZ2FuZUJ5VWlkW29yZ2FuZS5vcmdhbmVQcmVjZWRlbnRSZWZdXG4gICAgICBpZiAob3JnYW5lUHJlY2VkZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb3JnYW5lLm9yZ2FuZVByZWNlZGVudCA9IG9yZ2FuZVByZWNlZGVudFxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZVByZWNlZGVudCwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ET1xuICB9XG5cbiAgcmV0dXJuIG9yZ2FuZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0UmV1bmlvblJlZmVyZW5jZXMoXG4gIHJldW5pb246IFJldW5pb24sXG4gIGRhdGE6IE91dHB1dERhdGEsXG4gIHZpc2l0ZWRVaWRzOiBTZXQ8c3RyaW5nPixcbikge1xuICBpZiAoIXZpc2l0ZWRVaWRzLmhhcyhyZXVuaW9uLnVpZCkpIHtcbiAgICB2aXNpdGVkVWlkcy5hZGQocmV1bmlvbi51aWQpXG5cbiAgICBjb25zdCBkZW1hbmRldXJzID0gcmV1bmlvbi5kZW1hbmRldXJzXG4gICAgaWYgKGRlbWFuZGV1cnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGV1clN1bW1hcnkgb2YgZGVtYW5kZXVycy5hY3RldXJzIHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgYWN0ZXVyID0gZGF0YS5hY3RldXJCeVVpZFthY3RldXJTdW1tYXJ5LmFjdGV1clJlZl1cbiAgICAgICAgICBpZiAoYWN0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFjdGV1clN1bW1hcnkuYWN0ZXVyID0gYWN0ZXVyXG4gICAgICAgICAgICBpbnNlcnRBY3RldXJSZWZlcmVuY2VzKGFjdGV1ciwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5vcmdhbmVCeVVpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9yZ2FuZVN1bW1hcnkgPSBkZW1hbmRldXJzLm9yZ2FuZVxuICAgICAgICBpZiAob3JnYW5lU3VtbWFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb3JnYW5lID0gZGF0YS5vcmdhbmVCeVVpZFtvcmdhbmVTdW1tYXJ5Lm9yZ2FuZVJlZl1cbiAgICAgICAgICBpZiAob3JnYW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9yZ2FuZVN1bW1hcnkub3JnYW5lID0gb3JnYW5lXG4gICAgICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZSwgZGF0YSwgdmlzaXRlZFVpZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRhdGEub3JnYW5lQnlVaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmV1bmlvbi5vcmdhbmVSZXVuaVJlZiAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBvcmdhbmVSZXVuaSA9IGRhdGEub3JnYW5lQnlVaWRbcmV1bmlvbi5vcmdhbmVSZXVuaVJlZl1cbiAgICAgIGlmIChvcmdhbmVSZXVuaSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldW5pb24ub3JnYW5lUmV1bmkgPSBvcmdhbmVSZXVuaVxuICAgICAgICBpbnNlcnRPcmdhbmVSZWZlcmVuY2VzKG9yZ2FuZVJldW5pLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEuYWN0ZXVyQnlVaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gcmV1bmlvbi5wYXJ0aWNpcGFudHNcbiAgICAgIGlmIChwYXJ0aWNpcGFudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnRpY2lwYW50SW50ZXJuZSBvZiBwYXJ0aWNpcGFudHMucGFydGljaXBhbnRzSW50ZXJuZXMgfHxcbiAgICAgICAgICBbXSkge1xuICAgICAgICAgIGNvbnN0IGFjdGV1ciA9IGRhdGEuYWN0ZXVyQnlVaWRbcGFydGljaXBhbnRJbnRlcm5lLmFjdGV1clJlZl1cbiAgICAgICAgICBpZiAoYWN0ZXVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcnRpY2lwYW50SW50ZXJuZS5hY3RldXIgPSBhY3RldXJcbiAgICAgICAgICAgIGluc2VydEFjdGV1clJlZmVyZW5jZXMoYWN0ZXVyLCBkYXRhLCB2aXNpdGVkVWlkcylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV1bmlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U2NydXRpblJlZmVyZW5jZXMoXG4gIHNjcnV0aW46IFNjcnV0aW4sXG4gIF9kYXRhOiBPdXRwdXREYXRhLFxuICB2aXNpdGVkVWlkczogU2V0PHN0cmluZz4sXG4pIHtcbiAgaWYgKCF2aXNpdGVkVWlkcy5oYXMoc2NydXRpbi51aWQpKSB7XG4gICAgdmlzaXRlZFVpZHMuYWRkKHNjcnV0aW4udWlkKVxuXG4gICAgLy8gVE9ET1xuICB9XG5cbiAgcmV0dXJuIHNjcnV0aW5cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLFNBQVNBLDhCQUE4QkEsQ0FDckNDLElBQW9CLEVBQ3BCQyxJQUFnQixFQUNoQkMsV0FBd0IsRUFDeEI7RUFDQSxJQUFJLENBQUNBLFdBQVcsQ0FBQ0MsR0FBRyxDQUFDSCxJQUFJLENBQUNJLEdBQUcsQ0FBQyxFQUFFO0lBQzlCRixXQUFXLENBQUNHLEdBQUcsQ0FBQ0wsSUFBSSxDQUFDSSxHQUFHLENBQUM7SUFFekIsSUFDRUgsSUFBSSxDQUFDSyxhQUFhLEtBQUtDLFNBQVMsSUFDaENQLElBQUksQ0FBQ1EsZ0NBQWdDLEtBQUtELFNBQVMsRUFDbkQ7TUFDQSxJQUFNRSxRQUFRLEdBQUdSLElBQUksQ0FBQ0ssYUFBYSxDQUFDTixJQUFJLENBQUNRLGdDQUFnQyxDQUFDO01BQzFFLElBQUlDLFFBQVEsS0FBS0YsU0FBUyxFQUFFO1FBQzFCUCxJQUFJLENBQUNVLDZCQUE2QixHQUFHRCxRQUFRO1FBQzdDRSx3QkFBd0IsQ0FBQ0YsUUFBUSxFQUFFUixJQUFJLEVBQUVDLFdBQVcsQ0FBQztNQUN2RDtJQUNGO0lBQ0EsSUFBSUQsSUFBSSxDQUFDVyxXQUFXLEtBQUtMLFNBQVMsSUFBSVAsSUFBSSxDQUFDYSxTQUFTLEtBQUtOLFNBQVMsRUFBRTtNQUNsRSxJQUFNTyxNQUFNLEdBQUdiLElBQUksQ0FBQ1csV0FBVyxDQUFDWixJQUFJLENBQUNhLFNBQVMsQ0FBQztNQUMvQyxJQUFJQyxNQUFNLEtBQUtQLFNBQVMsRUFBRTtRQUN4QlAsSUFBSSxDQUFDYyxNQUFNLEdBQUdBLE1BQU07UUFDcEJDLHNCQUFzQixDQUFDRCxNQUFNLEVBQUViLElBQUksRUFBRUMsV0FBVyxDQUFDO01BQ25EO0lBQ0Y7SUFDQSxJQUFJRCxJQUFJLENBQUNXLFdBQVcsS0FBS0ws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