UNPKG

@tricoteuses/assemblee

Version:

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

651 lines (648 loc) 73.7 kB
"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.iterator.js"); require("core-js/modules/es.object.define-property.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.TypeMajorite = exports.PositionMajoritaire = exports.ModePublicationDesVotes = exports.LieuVote = exports.LibelleTypeVote = exports.Libelle = exports.Convert = exports.CodeTypeVote = exports.Code = exports.CausePositionVote = void 0; require("core-js/modules/es.symbol.to-primitive.js"); require("core-js/modules/es.array.concat.js"); require("core-js/modules/es.array.for-each.js"); require("core-js/modules/es.array.index-of.js"); require("core-js/modules/es.array.is-array.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.date.to-json.js"); require("core-js/modules/es.date.to-primitive.js"); require("core-js/modules/es.date.to-string.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.object.get-own-property-names.js"); require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/web.dom-collections.for-each.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // To parse this data: // // import { Convert, Scrutins, ScrutinWrapper } from "./file"; // // const scrutins = Convert.toScrutins(json); // const scrutinWrapper = Convert.toScrutinWrapper(json); // // These functions will throw an error if the JSON doesn't // match the expected interface, even if the JSON is valid. var ModePublicationDesVotes = exports.ModePublicationDesVotes = /*#__PURE__*/function (ModePublicationDesVotes) { ModePublicationDesVotes["DecompteDissidentsPositionGroupe"] = "DecompteDissidentsPositionGroupe"; ModePublicationDesVotes["DecompteNominatif"] = "DecompteNominatif"; return ModePublicationDesVotes; }({}); var Code = exports.Code = /*#__PURE__*/function (Code) { Code["Adopt\xE9"] = "adopt\xE9"; Code["Rejet\xE9"] = "rejet\xE9"; return Code; }({}); var Libelle = exports.Libelle = /*#__PURE__*/function (Libelle) { Libelle["LAssembl\xE9eNationaleAAdopt\xE9"] = "l'Assembl\xE9e nationale a adopt\xE9"; Libelle["LAssembl\xE9eNationaleNAPasAdopt\xE9"] = "L'Assembl\xE9e nationale n'a pas adopt\xE9"; Libelle["LeCongr\xE8sDuParlementAAdopt\xE9"] = "Le Congr\xE8s du Parlement a adopt\xE9"; Libelle["LeCongr\xE8sDuParlementNAPasAdopt\xE9"] = "Le Congr\xE8s du Parlement n'a pas adopt\xE9"; return Libelle; }({}); var CodeTypeVote = exports.CodeTypeVote = /*#__PURE__*/function (CodeTypeVote) { CodeTypeVote["Moc"] = "MOC"; CodeTypeVote["Sat"] = "SAT"; CodeTypeVote["Spo"] = "SPO"; CodeTypeVote["Sps"] = "SPS"; CodeTypeVote["Ssg"] = "SSG"; return CodeTypeVote; }({}); var LibelleTypeVote = exports.LibelleTypeVote = /*#__PURE__*/function (LibelleTypeVote) { LibelleTypeVote["MotionDeCensure"] = "motion de censure"; LibelleTypeVote["ScrutinPublicOrdinaire"] = "scrutin public ordinaire"; LibelleTypeVote["ScrutinPublicSolennel"] = "scrutin public solennel"; LibelleTypeVote["Scrutin\xC0LaTribune"] = "scrutin \xE0 la tribune"; LibelleTypeVote["ScrutinSolennelCongr\xE8s"] = "Scrutin solennel congr\xE8s"; return LibelleTypeVote; }({}); var TypeMajorite = exports.TypeMajorite = /*#__PURE__*/function (TypeMajorite) { TypeMajorite["Majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "Majorit\xE9 absolue des suffrages exprim\xE9s"; TypeMajorite["majorit\xE9AbsolueDesSuffragesExprim\xE9s"] = "majorit\xE9 absolue des suffrages exprim\xE9s"; TypeMajorite["majorit\xE9DesMembresComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composant l'Assembl\xE9e nationale"; TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9e"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e"; TypeMajorite["majorit\xE9DesMembresComposantsComposantLAssembl\xE9eNationale"] = "majorit\xE9 des membres composants composant l'Assembl\xE9e nationale"; TypeMajorite["Majorit\xE9RequisePourUnCongr\xE8s"] = "Majorit\xE9 requise pour un Congr\xE8s"; TypeMajorite["Majorit\xE9RequisePourUneMotionDeCensure"] = "Majorit\xE9 requise pour une motion de censure"; return TypeMajorite; }({}); var CausePositionVote = exports.CausePositionVote = /*#__PURE__*/function (CausePositionVote) { CausePositionVote["Mg"] = "MG"; CausePositionVote["Pan"] = "PAN"; CausePositionVote["Pse"] = "PSE"; return CausePositionVote; }({}); var PositionMajoritaire = exports.PositionMajoritaire = /*#__PURE__*/function (PositionMajoritaire) { PositionMajoritaire["Abstention"] = "abstention"; PositionMajoritaire["Contre"] = "contre"; PositionMajoritaire["Pour"] = "pour"; return PositionMajoritaire; }({}); var LieuVote = exports.LieuVote = /*#__PURE__*/function (LieuVote) { LieuVote["Congr\xE8s"] = "Congr\xE8s"; LieuVote["H\xE9micycle"] = "H\xE9micycle"; LieuVote["Salons"] = "Salons"; return LieuVote; }({}); // Converts JSON strings to/from your types // and asserts the results of JSON.parse at runtime var Convert = exports.Convert = /*#__PURE__*/function () { function Convert() { _classCallCheck(this, Convert); } return _createClass(Convert, null, [{ key: "toScrutins", value: function toScrutins(json) { return cast(JSON.parse(json), r("Scrutins")); } }, { key: "scrutinsToJson", value: function scrutinsToJson(value) { return JSON.stringify(uncast(value, r("Scrutins")), null, 2); } }, { key: "toScrutinWrapper", value: function toScrutinWrapper(json) { return cast(JSON.parse(json), r("ScrutinWrapper")); } }, { key: "scrutinWrapperToJson", value: function scrutinWrapperToJson(value) { return JSON.stringify(uncast(value, r("ScrutinWrapper")), null, 2); } }]); }(); function invalidValue(typ, val) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; if (key) { throw Error("Invalid value for key \"".concat(key, "\". Expected type ").concat(JSON.stringify(typ), " but got ").concat(JSON.stringify(val))); } throw Error("Invalid value ".concat(JSON.stringify(val), " for type ").concat(JSON.stringify(typ))); } function jsonToJSProps(typ) { if (typ.jsonToJS === undefined) { var map = {}; typ.props.forEach(function (p) { return map[p.json] = { key: p.js, typ: p.typ }; }); typ.jsonToJS = map; } return typ.jsonToJS; } function jsToJSONProps(typ) { if (typ.jsToJSON === undefined) { var map = {}; typ.props.forEach(function (p) { return map[p.js] = { key: p.json, typ: p.typ }; }); typ.jsToJSON = map; } return typ.jsToJSON; } function transform(val, typ, getProps) { var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ''; function transformPrimitive(typ, val) { if (_typeof(typ) === _typeof(val)) return val; return invalidValue(typ, val, key); } function transformUnion(typs, val) { // val must validate against one typ in typs var l = typs.length; for (var i = 0; i < l; i++) { var _typ = typs[i]; try { return transform(val, _typ, getProps); } catch (_) {} } return invalidValue(typs, val); } function transformEnum(cases, val) { if (cases.indexOf(val) !== -1) return val; return invalidValue(cases, val); } function transformArray(typ, val) { // val must be an array with no invalid elements if (!Array.isArray(val)) return invalidValue("array", val); return val.map(function (el) { return transform(el, typ, getProps); }); } function transformDate(val) { if (val === null) { return null; } var d = new Date(val); if (isNaN(d.valueOf())) { return invalidValue("Date", val); } return d; } function transformObject(props, additional, val) { if (val === null || _typeof(val) !== "object" || Array.isArray(val)) { return invalidValue("object", val); } var result = {}; Object.getOwnPropertyNames(props).forEach(function (key) { var prop = props[key]; var v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined; result[prop.key] = transform(v, prop.typ, getProps, prop.key); }); Object.getOwnPropertyNames(val).forEach(function (key) { if (!Object.prototype.hasOwnProperty.call(props, key)) { result[key] = transform(val[key], additional, getProps, key); } }); return result; } if (typ === "any") return val; if (typ === null) { if (val === null) return val; return invalidValue(typ, val); } if (typ === false) return invalidValue(typ, val); while (_typeof(typ) === "object" && typ.ref !== undefined) { typ = typeMap[typ.ref]; } if (Array.isArray(typ)) return transformEnum(typ, val); if (_typeof(typ) === "object") { return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val) : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val) : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val) : invalidValue(typ, val); } // Numbers can be parsed by Date but shouldn't be. if (typ === Date && typeof val !== "number") return transformDate(val); return transformPrimitive(typ, val); } function cast(val, typ) { return transform(val, typ, jsonToJSProps); } function uncast(val, typ) { return transform(val, typ, jsToJSONProps); } function a(typ) { return { arrayItems: typ }; } function u() { for (var _len = arguments.length, typs = new Array(_len), _key = 0; _key < _len; _key++) { typs[_key] = arguments[_key]; } return { unionMembers: typs }; } function o(props, additional) { return { props: props, additional: additional }; } // function m(additional: any) { // return { props: [], additional }; // } function r(name) { return { ref: name }; } var typeMap = { "Scrutins": o([{ json: "scrutins", js: "scrutins", typ: r("ScrutinsClass") }], false), "ScrutinsClass": o([{ json: "scrutin", js: "scrutin", typ: a(r("Scrutin")) }], false), "ScrutinWrapper": o([{ json: "scrutin", js: "scrutin", typ: r("Scrutin") }], false), "Scrutin": o([{ json: "@xmlns:xsi", js: "@xmlns:xsi", typ: "" }, { json: "uid", js: "uid", typ: "" }, { json: "numero", js: "numero", typ: "" }, { json: "organeRef", js: "organeRef", typ: "" }, { json: "legislature", js: "legislature", typ: "" }, { json: "sessionRef", js: "sessionRef", typ: "" }, { json: "seanceRef", js: "seanceRef", typ: "" }, { json: "dateScrutin", js: "dateScrutin", typ: Date }, { json: "quantiemeJourSeance", js: "quantiemeJourSeance", typ: "" }, { json: "typeVote", js: "typeVote", typ: r("TypeVote") }, { json: "sort", js: "sort", typ: r("Sort") }, { json: "titre", js: "titre", typ: "" }, { json: "demandeur", js: "demandeur", typ: r("Demandeur") }, { json: "objet", js: "objet", typ: r("Objet") }, { json: "modePublicationDesVotes", js: "modePublicationDesVotes", typ: r("ModePublicationDesVotes") }, { json: "syntheseVote", js: "syntheseVote", typ: r("SyntheseVote") }, { json: "ventilationVotes", js: "ventilationVotes", typ: r("VentilationVotes") }, { json: "miseAuPoint", js: "miseAuPoint", typ: u(r("MiseAuPoint"), null) }, { json: "lieuVote", js: "lieuVote", typ: u(undefined, r("LieuVote")) }, { json: "@xmlns", js: "@xmlns", typ: u(undefined, "") }], false), "Demandeur": o([{ json: "texte", js: "texte", typ: u(null, "") }, { json: "referenceLegislative", js: "referenceLegislative", typ: null }], false), "MiseAuPoint": o([{ json: "nonVotants", js: "nonVotants", typ: u(a(u(r("VotantsClass"), null)), null) }, { json: "pour", js: "pour", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "contre", js: "contre", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "abstentions", js: "abstentions", typ: u(a(u(r("VotantsClass"), null)), r("VotantsClass"), null) }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(a(u(r("VotantsClass"), null)), r("VotantsClass"), null) }, { json: "pours", js: "pours", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "contres", js: "contres", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "dysfonctionnement", js: "dysfonctionnement", typ: u(undefined, r("Dysfonctionnement")) }], false), "Dysfonctionnement": o([{ json: "nonVotants", js: "nonVotants", typ: u(r("VotantsClass"), null) }, { json: "pour", js: "pour", typ: u(r("VotantsClass"), null) }, { json: "contre", js: "contre", typ: u(r("VotantsClass"), null) }, { json: "abstentions", js: "abstentions", typ: u(r("VotantsClass"), null) }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(r("VotantsClass"), null) }], false), "Objet": o([{ json: "libelle", js: "libelle", typ: "" }, { json: "referenceLegislative", js: "referenceLegislative", typ: null }, { json: "dossierLegislatif", js: "dossierLegislatif", typ: u(undefined, null) }], false), "Sort": o([{ json: "code", js: "code", typ: r("Code") }, { json: "libelle", js: "libelle", typ: r("Libelle") }], false), "SyntheseVote": o([{ json: "nombreVotants", js: "nombreVotants", typ: "" }, { json: "suffragesExprimes", js: "suffragesExprimes", typ: "" }, { json: "nbrSuffragesRequis", js: "nbrSuffragesRequis", typ: "" }, { json: "annonce", js: "annonce", typ: r("Libelle") }, { json: "decompte", js: "decompte", typ: r("Decompte") }], false), "Decompte": o([{ json: "pour", js: "pour", typ: "" }, { json: "contre", js: "contre", typ: "" }, { json: "abstentions", js: "abstentions", typ: "" }, { json: "nonVotants", js: "nonVotants", typ: "" }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(undefined, "") }], false), "TypeVote": o([{ json: "codeTypeVote", js: "codeTypeVote", typ: r("CodeTypeVote") }, { json: "libelleTypeVote", js: "libelleTypeVote", typ: r("LibelleTypeVote") }, { json: "typeMajorite", js: "typeMajorite", typ: r("TypeMajorite") }], false), "VentilationVotes": o([{ json: "organe", js: "organe", typ: r("Organe") }], false), "Organe": o([{ json: "organeRef", js: "organeRef", typ: "" }, { json: "groupes", js: "groupes", typ: r("Groupes") }], false), "Groupes": o([{ json: "groupe", js: "groupe", typ: a(r("Groupe")) }], false), "Groupe": o([{ json: "organeRef", js: "organeRef", typ: "" }, { json: "nombreMembresGroupe", js: "nombreMembresGroupe", typ: "" }, { json: "vote", js: "vote", typ: r("Vote") }], false), "Vote": o([{ json: "positionMajoritaire", js: "positionMajoritaire", typ: r("PositionMajoritaire") }, { json: "decompteVoix", js: "decompteVoix", typ: r("DecompteVoix") }, { json: "decompteNominatif", js: "decompteNominatif", typ: r("DecompteNominatif") }], false), "DecompteNominatif": o([{ json: "nonVotant", js: "nonVotant", typ: u(undefined, null) }, { json: "nonVotants", js: "nonVotants", typ: u(undefined, u(r("VotantsClass"), null, "")) }, { json: "pour", js: "pour", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "contre", js: "contre", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "abstention", js: "abstention", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "abstentions", js: "abstentions", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "pours", js: "pours", typ: u(undefined, u(r("VotantsClass"), null)) }, { json: "contres", js: "contres", typ: u(undefined, u(r("VotantsClass"), null)) }], false), "VotantsClass": o([{ json: "votant", js: "votant", typ: u(a(r("Votant")), r("Votant")) }], false), "Votant": o([{ json: "acteurRef", js: "acteurRef", typ: "" }, { json: "mandatRef", js: "mandatRef", typ: "" }, { json: "parDelegation", js: "parDelegation", typ: u(undefined, "") }, { json: "numPlace", js: "numPlace", typ: u(undefined, u("", null)) }, { json: "causePositionVote", js: "causePositionVote", typ: u(undefined, r("CausePositionVote")) }], false), "DecompteVoix": o([{ json: "pour", js: "pour", typ: "" }, { json: "contre", js: "contre", typ: "" }, { json: "abstention", js: "abstention", typ: u(undefined, "") }, { json: "nonVotant", js: "nonVotant", typ: u(undefined, u("", null)) }, { json: "nonVotants", js: "nonVotants", typ: u(undefined, "") }, { json: "abstentions", js: "abstentions", typ: u(undefined, "") }, { json: "nonVotantsVolontaires", js: "nonVotantsVolontaires", typ: u(undefined, "") }], false), "ModePublicationDesVotes": ["DecompteDissidentsPositionGroupe", "DecompteNominatif"], "Code": ["adopté", "rejeté"], "Libelle": ["l'Assemblée nationale a adopté", "L'Assemblée nationale n'a pas adopté", "Le Congrès du Parlement a adopté", "Le Congrès du Parlement n'a pas adopté"], "CodeTypeVote": ["MOC", "SAT", "SPO", "SPS", "SSG"], "LibelleTypeVote": ["motion de censure", "scrutin public ordinaire", "scrutin public solennel", "scrutin à la tribune", "Scrutin solennel congrès"], "TypeMajorite": ["Majorité absolue des suffrages exprimés", "majorité absolue des suffrages exprimés", "majorité des membres composant l'Assemblée nationale", "majorité des membres composants composant l'Assemblée", "majorité des membres composants composant l'Assemblée nationale", "Majorité requise pour un Congrès", "Majorité requise pour une motion de censure"], "CausePositionVote": ["MG", "PAN", "PSE"], "PositionMajoritaire": ["abstention", "contre", "pour"], "LieuVote": ["Congrès", "Hémicycle", "Salons"] }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNb2RlUHVibGljYXRpb25EZXNWb3RlcyIsImV4cG9ydHMiLCJDb2RlIiwiTGliZWxsZSIsIkNvZGVUeXBlVm90ZSIsIkxpYmVsbGVUeXBlVm90ZSIsIlR5cGVNYWpvcml0ZSIsIkNhdXNlUG9zaXRpb25Wb3RlIiwiUG9zaXRpb25NYWpvcml0YWlyZSIsIkxpZXVWb3RlIiwiQ29udmVydCIsIl9jbGFzc0NhbGxDaGVjayIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwidG9TY3J1dGlucyIsImpzb24iLCJjYXN0IiwiSlNPTiIsInBhcnNlIiwiciIsInNjcnV0aW5zVG9Kc29uIiwic3RyaW5naWZ5IiwidW5jYXN0IiwidG9TY3J1dGluV3JhcHBlciIsInNjcnV0aW5XcmFwcGVyVG9Kc29uIiwiaW52YWxpZFZhbHVlIiwidHlwIiwidmFsIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJjb25jYXQiLCJqc29uVG9KU1Byb3BzIiwianNvblRvSlMiLCJtYXAiLCJwcm9wcyIsImZvckVhY2giLCJwIiwianMiLCJqc1RvSlNPTlByb3BzIiwianNUb0pTT04iLCJ0cmFuc2Zvcm0iLCJnZXRQcm9wcyIsInRyYW5zZm9ybVByaW1pdGl2ZSIsIl90eXBlb2YiLCJ0cmFuc2Zvcm1VbmlvbiIsInR5cHMiLCJsIiwiaSIsIl8iLCJ0cmFuc2Zvcm1FbnVtIiwiY2FzZXMiLCJpbmRleE9mIiwidHJhbnNmb3JtQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJlbCIsInRyYW5zZm9ybURhdGUiLCJkIiwiRGF0ZSIsImlzTmFOIiwidmFsdWVPZiIsInRyYW5zZm9ybU9iamVjdCIsImFkZGl0aW9uYWwiLCJyZXN1bHQiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvcCIsInYiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZWYiLCJ0eXBlTWFwIiwidW5pb25NZW1iZXJzIiwiYXJyYXlJdGVtcyIsImEiLCJ1IiwiX2xlbiIsIl9rZXkiLCJvIiwibmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yYXdfdHlwZXMvc2NydXRpbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG8gcGFyc2UgdGhpcyBkYXRhOlxuLy9cbi8vICAgaW1wb3J0IHsgQ29udmVydCwgU2NydXRpbnMsIFNjcnV0aW5XcmFwcGVyIH0gZnJvbSBcIi4vZmlsZVwiO1xuLy9cbi8vICAgY29uc3Qgc2NydXRpbnMgPSBDb252ZXJ0LnRvU2NydXRpbnMoanNvbik7XG4vLyAgIGNvbnN0IHNjcnV0aW5XcmFwcGVyID0gQ29udmVydC50b1NjcnV0aW5XcmFwcGVyKGpzb24pO1xuLy9cbi8vIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBKU09OIGRvZXNuJ3Rcbi8vIG1hdGNoIHRoZSBleHBlY3RlZCBpbnRlcmZhY2UsIGV2ZW4gaWYgdGhlIEpTT04gaXMgdmFsaWQuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NydXRpbnMge1xuICAgIHNjcnV0aW5zOiBTY3J1dGluc0NsYXNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjcnV0aW5zQ2xhc3Mge1xuICAgIHNjcnV0aW46IFNjcnV0aW5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3J1dGluV3JhcHBlciB7XG4gIHNjcnV0aW46IFNjcnV0aW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3J1dGluIHtcbiAgICBcIkB4bWxuczp4c2lcIjogICAgICAgICAgICBzdHJpbmc7XG4gICAgdWlkOiAgICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBudW1lcm86ICAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIG9yZ2FuZVJlZjogICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgbGVnaXNsYXR1cmU6ICAgICAgICAgICAgIHN0cmluZztcbiAgICBzZXNzaW9uUmVmOiAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIHNlYW5jZVJlZjogICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgZGF0ZVNjcnV0aW46ICAgICAgICAgICAgIERhdGU7XG4gICAgcXVhbnRpZW1lSm91clNlYW5jZTogICAgIHN0cmluZztcbiAgICB0eXBlVm90ZTogICAgICAgICAgICAgICAgVHlwZVZvdGU7XG4gICAgc29ydDogICAgICAgICAgICAgICAgICAgIFNvcnQ7XG4gICAgdGl0cmU6ICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBkZW1hbmRldXI6ICAgICAgICAgICAgICAgRGVtYW5kZXVyO1xuICAgIG9iamV0OiAgICAgICAgICAgICAgICAgICBPYmpldDtcbiAgICBtb2RlUHVibGljYXRpb25EZXNWb3RlczogTW9kZVB1YmxpY2F0aW9uRGVzVm90ZXM7XG4gICAgc3ludGhlc2VWb3RlOiAgICAgICAgICAgIFN5bnRoZXNlVm90ZTtcbiAgICB2ZW50aWxhdGlvblZvdGVzOiAgICAgICAgVmVudGlsYXRpb25Wb3RlcztcbiAgICBtaXNlQXVQb2ludDogICAgICAgICAgICAgTWlzZUF1UG9pbnQgfCBudWxsO1xuICAgIGxpZXVWb3RlPzogICAgICAgICAgICAgICBMaWV1Vm90ZTtcbiAgICBcIkB4bWxuc1wiPzogICAgICAgICAgICAgICBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVtYW5kZXVyIHtcbiAgICB0ZXh0ZTogICAgICAgICAgICAgICAgbnVsbCB8IHN0cmluZztcbiAgICByZWZlcmVuY2VMZWdpc2xhdGl2ZTogbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaXNlQXVQb2ludCB7XG4gICAgbm9uVm90YW50czogICAgICAgICAgICBBcnJheTxWb3RhbnRzQ2xhc3MgfCBudWxsPiB8IG51bGw7XG4gICAgcG91cj86ICAgICAgICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIGNvbnRyZT86ICAgICAgICAgICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBhYnN0ZW50aW9uczogICAgICAgICAgIEFycmF5PFZvdGFudHNDbGFzcyB8IG51bGw+IHwgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBub25Wb3RhbnRzVm9sb250YWlyZXM6IEFycmF5PFZvdGFudHNDbGFzcyB8IG51bGw+IHwgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBwb3Vycz86ICAgICAgICAgICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgY29udHJlcz86ICAgICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIGR5c2ZvbmN0aW9ubmVtZW50PzogICAgRHlzZm9uY3Rpb25uZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHlzZm9uY3Rpb25uZW1lbnQge1xuICAgIG5vblZvdGFudHM6ICAgICAgICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBwb3VyOiAgICAgICAgICAgICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgY29udHJlOiAgICAgICAgICAgICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIGFic3RlbnRpb25zOiAgICAgICAgICAgVm90YW50c0NsYXNzIHwgbnVsbDtcbiAgICBub25Wb3RhbnRzVm9sb250YWlyZXM6IFZvdGFudHNDbGFzcyB8IG51bGw7XG59XG5cbmV4cG9ydCBlbnVtIE1vZGVQdWJsaWNhdGlvbkRlc1ZvdGVzIHtcbiAgICBEZWNvbXB0ZURpc3NpZGVudHNQb3NpdGlvbkdyb3VwZSA9IFwiRGVjb21wdGVEaXNzaWRlbnRzUG9zaXRpb25Hcm91cGVcIixcbiAgICBEZWNvbXB0ZU5vbWluYXRpZiA9IFwiRGVjb21wdGVOb21pbmF0aWZcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmpldCB7XG4gICAgbGliZWxsZTogICAgICAgICAgICAgIHN0cmluZztcbiAgICByZWZlcmVuY2VMZWdpc2xhdGl2ZTogbnVsbDtcbiAgICBkb3NzaWVyTGVnaXNsYXRpZj86IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3J0IHtcbiAgICBjb2RlOiAgICBDb2RlO1xuICAgIGxpYmVsbGU6IExpYmVsbGU7XG59XG5cbmV4cG9ydCBlbnVtIENvZGUge1xuICAgIEFkb3B0w6kgPSBcImFkb3B0w6lcIixcbiAgICBSZWpldMOpID0gXCJyZWpldMOpXCIsXG59XG5cbmV4cG9ydCBlbnVtIExpYmVsbGUge1xuICAgIExBc3NlbWJsw6llTmF0aW9uYWxlQUFkb3B0w6kgPSBcImwnQXNzZW1ibMOpZSBuYXRpb25hbGUgYSBhZG9wdMOpXCIsXG4gICAgTEFzc2VtYmzDqWVOYXRpb25hbGVOQVBhc0Fkb3B0w6kgPSBcIkwnQXNzZW1ibMOpZSBuYXRpb25hbGUgbidhIHBhcyBhZG9wdMOpXCIsXG4gICAgTGVDb25ncsOoc0R1UGFybGVtZW50QUFkb3B0w6kgPSBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBhIGFkb3B0w6lcIixcbiAgICBMZUNvbmdyw6hzRHVQYXJsZW1lbnROQVBhc0Fkb3B0w6kgPSBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBuJ2EgcGFzIGFkb3B0w6lcIixcbiAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNlVm90ZSB7XG4gICAgbm9tYnJlVm90YW50czogICAgICBzdHJpbmc7XG4gICAgc3VmZnJhZ2VzRXhwcmltZXM6ICBzdHJpbmc7XG4gICAgbmJyU3VmZnJhZ2VzUmVxdWlzOiBzdHJpbmc7XG4gICAgYW5ub25jZTogICAgICAgICAgICBMaWJlbGxlO1xuICAgIGRlY29tcHRlOiAgICAgICAgICAgRGVjb21wdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb21wdGUge1xuICAgIHBvdXI6ICAgICAgICAgICAgICAgICAgIHN0cmluZztcbiAgICBjb250cmU6ICAgICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgYWJzdGVudGlvbnM6ICAgICAgICAgICAgc3RyaW5nO1xuICAgIG5vblZvdGFudHM6ICAgICAgICAgICAgIHN0cmluZztcbiAgICBub25Wb3RhbnRzVm9sb250YWlyZXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVZvdGUge1xuICAgIGNvZGVUeXBlVm90ZTogICAgQ29kZVR5cGVWb3RlO1xuICAgIGxpYmVsbGVUeXBlVm90ZTogTGliZWxsZVR5cGVWb3RlO1xuICAgIHR5cGVNYWpvcml0ZTogICAgVHlwZU1ham9yaXRlO1xufVxuXG5leHBvcnQgZW51bSBDb2RlVHlwZVZvdGUge1xuICAgIE1vYyA9IFwiTU9DXCIsXG4gICAgU2F0ID0gXCJTQVRcIixcbiAgICBTcG8gPSBcIlNQT1wiLFxuICAgIFNwcyA9IFwiU1BTXCIsXG4gICAgU3NnID0gXCJTU0dcIixcbn1cblxuZXhwb3J0IGVudW0gTGliZWxsZVR5cGVWb3RlIHtcbiAgICBNb3Rpb25EZUNlbnN1cmUgPSBcIm1vdGlvbiBkZSBjZW5zdXJlXCIsXG4gICAgU2NydXRpblB1YmxpY09yZGluYWlyZSA9IFwic2NydXRpbiBwdWJsaWMgb3JkaW5haXJlXCIsXG4gICAgU2NydXRpblB1YmxpY1NvbGVubmVsID0gXCJzY3J1dGluIHB1YmxpYyBzb2xlbm5lbFwiLFxuICAgIFNjcnV0aW7DgExhVHJpYnVuZSA9IFwic2NydXRpbiDDoCBsYSB0cmlidW5lXCIsXG4gICAgU2NydXRpblNvbGVubmVsQ29uZ3LDqHMgPSBcIlNjcnV0aW4gc29sZW5uZWwgY29uZ3LDqHNcIixcbn1cblxuZXhwb3J0IGVudW0gVHlwZU1ham9yaXRlIHtcbiAgICBNYWpvcml0w6lBYnNvbHVlRGVzU3VmZnJhZ2VzRXhwcmltw6lzID0gXCJNYWpvcml0w6kgYWJzb2x1ZSBkZXMgc3VmZnJhZ2VzIGV4cHJpbcOpc1wiLFxuICAgIG1ham9yaXTDqUFic29sdWVEZXNTdWZmcmFnZXNFeHByaW3DqXMgPSBcIm1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gICAgbWFqb3JpdMOpRGVzTWVtYnJlc0NvbXBvc2FudExBc3NlbWJsw6llTmF0aW9uYWxlID0gXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50IGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIixcbiAgICBtYWpvcml0w6lEZXNNZW1icmVzQ29tcG9zYW50c0NvbXBvc2FudExBc3NlbWJsw6llID0gXCJtYWpvcml0w6kgZGVzIG1lbWJyZXMgY29tcG9zYW50cyBjb21wb3NhbnQgbCdBc3NlbWJsw6llXCIsXG4gICAgbWFqb3JpdMOpRGVzTWVtYnJlc0NvbXBvc2FudHNDb21wb3NhbnRMQXNzZW1ibMOpZU5hdGlvbmFsZSA9IFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudHMgY29tcG9zYW50IGwnQXNzZW1ibMOpZSBuYXRpb25hbGVcIixcbiAgICBNYWpvcml0w6lSZXF1aXNlUG91clVuQ29uZ3LDqHMgPSBcIk1ham9yaXTDqSByZXF1aXNlIHBvdXIgdW4gQ29uZ3LDqHNcIixcbiAgICBNYWpvcml0w6lSZXF1aXNlUG91clVuZU1vdGlvbkRlQ2Vuc3VyZSA9IFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1bmUgbW90aW9uIGRlIGNlbnN1cmVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZW50aWxhdGlvblZvdGVzIHtcbiAgICBvcmdhbmU6IE9yZ2FuZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbmUge1xuICAgIG9yZ2FuZVJlZjogc3RyaW5nO1xuICAgIGdyb3VwZXM6ICAgR3JvdXBlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGVzIHtcbiAgICBncm91cGU6IEdyb3VwZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwZSB7XG4gICAgb3JnYW5lUmVmOiAgICAgICAgICAgc3RyaW5nO1xuICAgIG5vbWJyZU1lbWJyZXNHcm91cGU6IHN0cmluZztcbiAgICB2b3RlOiAgICAgICAgICAgICAgICBWb3RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvdGUge1xuICAgIHBvc2l0aW9uTWFqb3JpdGFpcmU6IFBvc2l0aW9uTWFqb3JpdGFpcmU7XG4gICAgZGVjb21wdGVWb2l4OiAgICAgICAgRGVjb21wdGVWb2l4O1xuICAgIGRlY29tcHRlTm9taW5hdGlmOiAgIERlY29tcHRlTm9taW5hdGlmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlY29tcHRlTm9taW5hdGlmIHtcbiAgICBub25Wb3RhbnQ/OiAgIG51bGxcbiAgICBub25Wb3RhbnRzPzogIFZvdGFudHNDbGFzcyB8IG51bGwgfCBzdHJpbmc7XG4gICAgcG91cj86ICAgICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgY29udHJlPzogICAgIFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgYWJzdGVudGlvbj86IFZvdGFudHNDbGFzcyB8IG51bGw7XG4gICAgYWJzdGVudGlvbnM/OiBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIHBvdXJzPzogICAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xuICAgIGNvbnRyZXM/OiAgICBWb3RhbnRzQ2xhc3MgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZvdGFudHNDbGFzcyB7XG4gICAgdm90YW50OiBWb3RhbnRbXSB8IFZvdGFudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb3RhbnQge1xuICAgIGFjdGV1clJlZjogICAgICBzdHJpbmc7XG4gICAgbWFuZGF0UmVmOiAgICAgIHN0cmluZztcbiAgICBwYXJEZWxlZ2F0aW9uPzogc3RyaW5nO1xuICAgIG51bVBsYWNlPzogICAgICBzdHJpbmcgfCBudWxsO1xuICAgIGNhdXNlUG9zaXRpb25Wb3RlPzogQ2F1c2VQb3NpdGlvblZvdGU7XG59XG5cbmV4cG9ydCBlbnVtIENhdXNlUG9zaXRpb25Wb3RlIHtcbiAgICBNZyA9IFwiTUdcIixcbiAgICBQYW4gPSBcIlBBTlwiLFxuICAgIFBzZSA9IFwiUFNFXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb21wdGVWb2l4IHtcbiAgICBwb3VyOiAgICAgICAgICAgICAgICAgICBzdHJpbmc7XG4gICAgY29udHJlOiAgICAgICAgICAgICAgICAgc3RyaW5nO1xuICAgIGFic3RlbnRpb24/OiAgICAgICAgICAgIHN0cmluZztcbiAgICBub25Wb3RhbnQ/OiAgICAgICAgICAgICBzdHJpbmcgfCBudWxsO1xuICAgIG5vblZvdGFudHM/OiAgICAgICAgICAgIHN0cmluZztcbiAgICBhYnN0ZW50aW9ucz86ICAgICAgICAgICBzdHJpbmc7XG4gICAgbm9uVm90YW50c1ZvbG9udGFpcmVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBQb3NpdGlvbk1ham9yaXRhaXJlIHtcbiAgICBBYnN0ZW50aW9uID0gXCJhYnN0ZW50aW9uXCIsXG4gICAgQ29udHJlID0gXCJjb250cmVcIixcbiAgICBQb3VyID0gXCJwb3VyXCIsXG59XG5cbmV4cG9ydCBlbnVtIExpZXVWb3RlIHtcbiAgICBDb25ncsOocyA9IFwiQ29uZ3LDqHNcIixcbiAgICBIw6ltaWN5Y2xlID0gXCJIw6ltaWN5Y2xlXCIsXG4gICAgU2Fsb25zID0gXCJTYWxvbnNcIixcbn1cblxuLy8gQ29udmVydHMgSlNPTiBzdHJpbmdzIHRvL2Zyb20geW91ciB0eXBlc1xuLy8gYW5kIGFzc2VydHMgdGhlIHJlc3VsdHMgb2YgSlNPTi5wYXJzZSBhdCBydW50aW1lXG5leHBvcnQgY2xhc3MgQ29udmVydCB7XG4gICAgcHVibGljIHN0YXRpYyB0b1NjcnV0aW5zKGpzb246IHN0cmluZyk6IFNjcnV0aW5zIHtcbiAgICAgICAgcmV0dXJuIGNhc3QoSlNPTi5wYXJzZShqc29uKSwgcihcIlNjcnV0aW5zXCIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNjcnV0aW5zVG9Kc29uKHZhbHVlOiBTY3J1dGlucyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh1bmNhc3QodmFsdWUsIHIoXCJTY3J1dGluc1wiKSksIG51bGwsIDIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdG9TY3J1dGluV3JhcHBlcihqc29uOiBzdHJpbmcpOiBTY3J1dGluV3JhcHBlciB7XG4gICAgICAgIHJldHVybiBjYXN0KEpTT04ucGFyc2UoanNvbiksIHIoXCJTY3J1dGluV3JhcHBlclwiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzY3J1dGluV3JhcHBlclRvSnNvbih2YWx1ZTogU2NydXRpbldyYXBwZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodW5jYXN0KHZhbHVlLCByKFwiU2NydXRpbldyYXBwZXJcIikpLCBudWxsLCAyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGludmFsaWRWYWx1ZSh0eXA6IGFueSwgdmFsOiBhbnksIGtleTogYW55ID0gJycpOiBuZXZlciB7XG4gICAgaWYgKGtleSkge1xuICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCB2YWx1ZSBmb3Iga2V5IFwiJHtrZXl9XCIuIEV4cGVjdGVkIHR5cGUgJHtKU09OLnN0cmluZ2lmeSh0eXApfSBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkodmFsKX1gKTtcbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoYEludmFsaWQgdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh2YWwpfSBmb3IgdHlwZSAke0pTT04uc3RyaW5naWZ5KHR5cCl9YCwgKTtcbn1cblxuZnVuY3Rpb24ganNvblRvSlNQcm9wcyh0eXA6IGFueSk6IGFueSB7XG4gICAgaWYgKHR5cC5qc29uVG9KUyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1hcDogYW55ID0ge307XG4gICAgICAgIHR5cC5wcm9wcy5mb3JFYWNoKChwOiBhbnkpID0+IG1hcFtwLmpzb25dID0geyBrZXk6IHAuanMsIHR5cDogcC50eXAgfSk7XG4gICAgICAgIHR5cC5qc29uVG9KUyA9IG1hcDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cC5qc29uVG9KUztcbn1cblxuZnVuY3Rpb24ganNUb0pTT05Qcm9wcyh0eXA6IGFueSk6IGFueSB7XG4gICAgaWYgKHR5cC5qc1RvSlNPTiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1hcDogYW55ID0ge307XG4gICAgICAgIHR5cC5wcm9wcy5mb3JFYWNoKChwOiBhbnkpID0+IG1hcFtwLmpzXSA9IHsga2V5OiBwLmpzb24sIHR5cDogcC50eXAgfSk7XG4gICAgICAgIHR5cC5qc1RvSlNPTiA9IG1hcDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cC5qc1RvSlNPTjtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtKHZhbDogYW55LCB0eXA6IGFueSwgZ2V0UHJvcHM6IGFueSwga2V5OiBhbnkgPSAnJyk6IGFueSB7XG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtUHJpbWl0aXZlKHR5cDogc3RyaW5nLCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwID09PSB0eXBlb2YgdmFsKSByZXR1cm4gdmFsO1xuICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKHR5cCwgdmFsLCBrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVVuaW9uKHR5cHM6IGFueVtdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIC8vIHZhbCBtdXN0IHZhbGlkYXRlIGFnYWluc3Qgb25lIHR5cCBpbiB0eXBzXG4gICAgICAgIGNvbnN0IGwgPSB0eXBzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cCA9IHR5cHNbaV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGdldFByb3BzKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXBzLCB2YWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUVudW0oY2FzZXM6IHN0cmluZ1tdLCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIGlmIChjYXNlcy5pbmRleE9mKHZhbCkgIT09IC0xKSByZXR1cm4gdmFsO1xuICAgICAgICByZXR1cm4gaW52YWxpZFZhbHVlKGNhc2VzLCB2YWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUFycmF5KHR5cDogYW55LCB2YWw6IGFueSk6IGFueSB7XG4gICAgICAgIC8vIHZhbCBtdXN0IGJlIGFuIGFycmF5IHdpdGggbm8gaW52YWxpZCBlbGVtZW50c1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGludmFsaWRWYWx1ZShcImFycmF5XCIsIHZhbCk7XG4gICAgICAgIHJldHVybiB2YWwubWFwKGVsID0+IHRyYW5zZm9ybShlbCwgdHlwLCBnZXRQcm9wcykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybURhdGUodmFsOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gbmV3IERhdGUodmFsKTtcbiAgICAgICAgaWYgKGlzTmFOKGQudmFsdWVPZigpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIkRhdGVcIiwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3QocHJvcHM6IHsgW2s6IHN0cmluZ106IGFueSB9LCBhZGRpdGlvbmFsOiBhbnksIHZhbDogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZShcIm9iamVjdFwiLCB2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpID8gdmFsW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXN1bHRbcHJvcC5rZXldID0gdHJhbnNmb3JtKHYsIHByb3AudHlwLCBnZXRQcm9wcywgcHJvcC5rZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywga2V5KSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdHJhbnNmb3JtKHZhbFtrZXldLCBhZGRpdGlvbmFsLCBnZXRQcm9wcywga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cCA9PT0gXCJhbnlcIikgcmV0dXJuIHZhbDtcbiAgICBpZiAodHlwID09PSBudWxsKSB7XG4gICAgICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB2YWw7XG4gICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpO1xuICAgIH1cbiAgICBpZiAodHlwID09PSBmYWxzZSkgcmV0dXJuIGludmFsaWRWYWx1ZSh0eXAsIHZhbCk7XG4gICAgd2hpbGUgKHR5cGVvZiB0eXAgPT09IFwib2JqZWN0XCIgJiYgdHlwLnJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cCA9IHR5cGVNYXBbdHlwLnJlZl07XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cCkpIHJldHVybiB0cmFuc2Zvcm1FbnVtKHR5cCwgdmFsKTtcbiAgICBpZiAodHlwZW9mIHR5cCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gdHlwLmhhc093blByb3BlcnR5KFwidW5pb25NZW1iZXJzXCIpID8gdHJhbnNmb3JtVW5pb24odHlwLnVuaW9uTWVtYmVycywgdmFsKVxuICAgICAgICAgICAgOiB0eXAuaGFzT3duUHJvcGVydHkoXCJhcnJheUl0ZW1zXCIpICAgID8gdHJhbnNmb3JtQXJyYXkodHlwLmFycmF5SXRlbXMsIHZhbClcbiAgICAgICAgICAgIDogdHlwLmhhc093blByb3BlcnR5KFwicHJvcHNcIikgICAgICAgICA/IHRyYW5zZm9ybU9iamVjdChnZXRQcm9wcyh0eXApLCB0eXAuYWRkaXRpb25hbCwgdmFsKVxuICAgICAgICAgICAgOiBpbnZhbGlkVmFsdWUodHlwLCB2YWwpO1xuICAgIH1cbiAgICAvLyBOdW1iZXJzIGNhbiBiZSBwYXJzZWQgYnkgRGF0ZSBidXQgc2hvdWxkbid0IGJlLlxuICAgIGlmICh0eXAgPT09IERhdGUgJiYgdHlwZW9mIHZhbCAhPT0gXCJudW1iZXJcIikgcmV0dXJuIHRyYW5zZm9ybURhdGUodmFsKTtcbiAgICByZXR1cm4gdHJhbnNmb3JtUHJpbWl0aXZlKHR5cCwgdmFsKTtcbn1cblxuZnVuY3Rpb24gY2FzdDxUPih2YWw6IGFueSwgdHlwOiBhbnkpOiBUIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtKHZhbCwgdHlwLCBqc29uVG9KU1Byb3BzKTtcbn1cblxuZnVuY3Rpb24gdW5jYXN0PFQ+KHZhbDogVCwgdHlwOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0cmFuc2Zvcm0odmFsLCB0eXAsIGpzVG9KU09OUHJvcHMpO1xufVxuXG5mdW5jdGlvbiBhKHR5cDogYW55KSB7XG4gICAgcmV0dXJuIHsgYXJyYXlJdGVtczogdHlwIH07XG59XG5cbmZ1bmN0aW9uIHUoLi4udHlwczogYW55W10pIHtcbiAgICByZXR1cm4geyB1bmlvbk1lbWJlcnM6IHR5cHMgfTtcbn1cblxuZnVuY3Rpb24gbyhwcm9wczogYW55W10sIGFkZGl0aW9uYWw6IGFueSkge1xuICAgIHJldHVybiB7IHByb3BzLCBhZGRpdGlvbmFsIH07XG59XG5cbi8vIGZ1bmN0aW9uIG0oYWRkaXRpb25hbDogYW55KSB7XG4vLyAgICAgcmV0dXJuIHsgcHJvcHM6IFtdLCBhZGRpdGlvbmFsIH07XG4vLyB9XG5cbmZ1bmN0aW9uIHIobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHsgcmVmOiBuYW1lIH07XG59XG5cbmNvbnN0IHR5cGVNYXA6IGFueSA9IHtcbiAgICBcIlNjcnV0aW5zXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwic2NydXRpbnNcIiwganM6IFwic2NydXRpbnNcIiwgdHlwOiByKFwiU2NydXRpbnNDbGFzc1wiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlNjcnV0aW5zQ2xhc3NcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJzY3J1dGluXCIsIGpzOiBcInNjcnV0aW5cIiwgdHlwOiBhKHIoXCJTY3J1dGluXCIpKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIlNjcnV0aW5XcmFwcGVyXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwic2NydXRpblwiLCBqczogXCJzY3J1dGluXCIsIHR5cDogcihcIlNjcnV0aW5cIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJTY3J1dGluXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiQHhtbG5zOnhzaVwiLCBqczogXCJAeG1sbnM6eHNpXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwidWlkXCIsIGpzOiBcInVpZFwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm51bWVyb1wiLCBqczogXCJudW1lcm9cIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJvcmdhbmVSZWZcIiwganM6IFwib3JnYW5lUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwibGVnaXNsYXR1cmVcIiwganM6IFwibGVnaXNsYXR1cmVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJzZXNzaW9uUmVmXCIsIGpzOiBcInNlc3Npb25SZWZcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJzZWFuY2VSZWZcIiwganM6IFwic2VhbmNlUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiZGF0ZVNjcnV0aW5cIiwganM6IFwiZGF0ZVNjcnV0aW5cIiwgdHlwOiBEYXRlIH0sXG4gICAgICAgIHsganNvbjogXCJxdWFudGllbWVKb3VyU2VhbmNlXCIsIGpzOiBcInF1YW50aWVtZUpvdXJTZWFuY2VcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJ0eXBlVm90ZVwiLCBqczogXCJ0eXBlVm90ZVwiLCB0eXA6IHIoXCJUeXBlVm90ZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwic29ydFwiLCBqczogXCJzb3J0XCIsIHR5cDogcihcIlNvcnRcIikgfSxcbiAgICAgICAgeyBqc29uOiBcInRpdHJlXCIsIGpzOiBcInRpdHJlXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiZGVtYW5kZXVyXCIsIGpzOiBcImRlbWFuZGV1clwiLCB0eXA6IHIoXCJEZW1hbmRldXJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcIm9iamV0XCIsIGpzOiBcIm9iamV0XCIsIHR5cDogcihcIk9iamV0XCIpIH0sXG4gICAgICAgIHsganNvbjogXCJtb2RlUHVibGljYXRpb25EZXNWb3Rlc1wiLCBqczogXCJtb2RlUHVibGljYXRpb25EZXNWb3Rlc1wiLCB0eXA6IHIoXCJNb2RlUHVibGljYXRpb25EZXNWb3Rlc1wiKSB9LFxuICAgICAgICB7IGpzb246IFwic3ludGhlc2VWb3RlXCIsIGpzOiBcInN5bnRoZXNlVm90ZVwiLCB0eXA6IHIoXCJTeW50aGVzZVZvdGVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcInZlbnRpbGF0aW9uVm90ZXNcIiwganM6IFwidmVudGlsYXRpb25Wb3Rlc1wiLCB0eXA6IHIoXCJWZW50aWxhdGlvblZvdGVzXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJtaXNlQXVQb2ludFwiLCBqczogXCJtaXNlQXVQb2ludFwiLCB0eXA6IHUocihcIk1pc2VBdVBvaW50XCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwibGlldVZvdGVcIiwganM6IFwibGlldVZvdGVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgcihcIkxpZXVWb3RlXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwiQHhtbG5zXCIsIGpzOiBcIkB4bWxuc1wiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgIF0sIGZhbHNlKSxcbiAgICBcIkRlbWFuZGV1clwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInRleHRlXCIsIGpzOiBcInRleHRlXCIsIHR5cDogdShudWxsLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwicmVmZXJlbmNlTGVnaXNsYXRpdmVcIiwganM6IFwicmVmZXJlbmNlTGVnaXNsYXRpdmVcIiwgdHlwOiBudWxsIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiTWlzZUF1UG9pbnRcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzXCIsIGpzOiBcIm5vblZvdGFudHNcIiwgdHlwOiB1KGEodShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJwb3VyXCIsIGpzOiBcInBvdXJcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImFic3RlbnRpb25zXCIsIGpzOiBcImFic3RlbnRpb25zXCIsIHR5cDogdShhKHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpLCByKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSB9LFxuICAgICAgICB7IGpzb246IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsIGpzOiBcIm5vblZvdGFudHNWb2xvbnRhaXJlc1wiLCB0eXA6IHUoYSh1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSwgcihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvdXJzXCIsIGpzOiBcInBvdXJzXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJjb250cmVzXCIsIGpzOiBcImNvbnRyZXNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImR5c2ZvbmN0aW9ubmVtZW50XCIsIGpzOiBcImR5c2ZvbmN0aW9ubmVtZW50XCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJEeXNmb25jdGlvbm5lbWVudFwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJEeXNmb25jdGlvbm5lbWVudFwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNcIiwganM6IFwibm9uVm90YW50c1wiLCB0eXA6IHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcInBvdXJcIiwganM6IFwicG91clwiLCB0eXA6IHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcImNvbnRyZVwiLCBqczogXCJjb250cmVcIiwgdHlwOiB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpIH0sXG4gICAgICAgIHsganNvbjogXCJhYnN0ZW50aW9uc1wiLCBqczogXCJhYnN0ZW50aW9uc1wiLCB0eXA6IHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNWb2xvbnRhaXJlc1wiLCBqczogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwgdHlwOiB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiT2JqZXRcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJsaWJlbGxlXCIsIGpzOiBcImxpYmVsbGVcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJyZWZlcmVuY2VMZWdpc2xhdGl2ZVwiLCBqczogXCJyZWZlcmVuY2VMZWdpc2xhdGl2ZVwiLCB0eXA6IG51bGwgfSxcbiAgICAgICAgeyBqc29uOiBcImRvc3NpZXJMZWdpc2xhdGlmXCIsIGpzOiBcImRvc3NpZXJMZWdpc2xhdGlmXCIsIHR5cDogdSh1bmRlZmluZWQsIG51bGwpIH1cbiAgICBdLCBmYWxzZSksXG4gICAgXCJTb3J0XCI6IG8oW1xuICAgICAgICB7IGpzb246IFwiY29kZVwiLCBqczogXCJjb2RlXCIsIHR5cDogcihcIkNvZGVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImxpYmVsbGVcIiwganM6IFwibGliZWxsZVwiLCB0eXA6IHIoXCJMaWJlbGxlXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiU3ludGhlc2VWb3RlXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwibm9tYnJlVm90YW50c1wiLCBqczogXCJub21icmVWb3RhbnRzXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwic3VmZnJhZ2VzRXhwcmltZXNcIiwganM6IFwic3VmZnJhZ2VzRXhwcmltZXNcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJuYnJTdWZmcmFnZXNSZXF1aXNcIiwganM6IFwibmJyU3VmZnJhZ2VzUmVxdWlzXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiYW5ub25jZVwiLCBqczogXCJhbm5vbmNlXCIsIHR5cDogcihcIkxpYmVsbGVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImRlY29tcHRlXCIsIGpzOiBcImRlY29tcHRlXCIsIHR5cDogcihcIkRlY29tcHRlXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiRGVjb21wdGVcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJwb3VyXCIsIGpzOiBcInBvdXJcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJjb250cmVcIiwganM6IFwiY29udHJlXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiYWJzdGVudGlvbnNcIiwganM6IFwiYWJzdGVudGlvbnNcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzXCIsIGpzOiBcIm5vblZvdGFudHNcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiVHlwZVZvdGVcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJjb2RlVHlwZVZvdGVcIiwganM6IFwiY29kZVR5cGVWb3RlXCIsIHR5cDogcihcIkNvZGVUeXBlVm90ZVwiKSB9LFxuICAgICAgICB7IGpzb246IFwibGliZWxsZVR5cGVWb3RlXCIsIGpzOiBcImxpYmVsbGVUeXBlVm90ZVwiLCB0eXA6IHIoXCJMaWJlbGxlVHlwZVZvdGVcIikgfSxcbiAgICAgICAgeyBqc29uOiBcInR5cGVNYWpvcml0ZVwiLCBqczogXCJ0eXBlTWFqb3JpdGVcIiwgdHlwOiByKFwiVHlwZU1ham9yaXRlXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiVmVudGlsYXRpb25Wb3Rlc1wiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm9yZ2FuZVwiLCBqczogXCJvcmdhbmVcIiwgdHlwOiByKFwiT3JnYW5lXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiT3JnYW5lXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwib3JnYW5lUmVmXCIsIGpzOiBcIm9yZ2FuZVJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcImdyb3VwZXNcIiwganM6IFwiZ3JvdXBlc1wiLCB0eXA6IHIoXCJHcm91cGVzXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiR3JvdXBlc1wiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcImdyb3VwZVwiLCBqczogXCJncm91cGVcIiwgdHlwOiBhKHIoXCJHcm91cGVcIikpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiR3JvdXBlXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwib3JnYW5lUmVmXCIsIGpzOiBcIm9yZ2FuZVJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vbWJyZU1lbWJyZXNHcm91cGVcIiwganM6IFwibm9tYnJlTWVtYnJlc0dyb3VwZVwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInZvdGVcIiwganM6IFwidm90ZVwiLCB0eXA6IHIoXCJWb3RlXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiVm90ZVwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcInBvc2l0aW9uTWFqb3JpdGFpcmVcIiwganM6IFwicG9zaXRpb25NYWpvcml0YWlyZVwiLCB0eXA6IHIoXCJQb3NpdGlvbk1ham9yaXRhaXJlXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJkZWNvbXB0ZVZvaXhcIiwganM6IFwiZGVjb21wdGVWb2l4XCIsIHR5cDogcihcIkRlY29tcHRlVm9peFwiKSB9LFxuICAgICAgICB7IGpzb246IFwiZGVjb21wdGVOb21pbmF0aWZcIiwganM6IFwiZGVjb21wdGVOb21pbmF0aWZcIiwgdHlwOiByKFwiRGVjb21wdGVOb21pbmF0aWZcIikgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJEZWNvbXB0ZU5vbWluYXRpZlwiOiBvKFtcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudFwiLCBqczogXCJub25Wb3RhbnRcIiwgdHlwOiB1KHVuZGVmaW5lZCwgbnVsbCkgfSxcbiAgICAgICAgeyBqc29uOiBcIm5vblZvdGFudHNcIiwganM6IFwibm9uVm90YW50c1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwsIFwiXCIpKSB9LFxuICAgICAgICB7IGpzb246IFwicG91clwiLCBqczogXCJwb3VyXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJjb250cmVcIiwganM6IFwiY29udHJlXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJhYnN0ZW50aW9uXCIsIGpzOiBcImFic3RlbnRpb25cIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShyKFwiVm90YW50c0NsYXNzXCIpLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImFic3RlbnRpb25zXCIsIGpzOiBcImFic3RlbnRpb25zXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJwb3Vyc1wiLCBqczogXCJwb3Vyc1wiLCB0eXA6IHUodW5kZWZpbmVkLCB1KHIoXCJWb3RhbnRzQ2xhc3NcIiksIG51bGwpKSB9LFxuICAgICAgICB7IGpzb246IFwiY29udHJlc1wiLCBqczogXCJjb250cmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIHUocihcIlZvdGFudHNDbGFzc1wiKSwgbnVsbCkpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiVm90YW50c0NsYXNzXCI6IG8oW1xuICAgICAgICB7IGpzb246IFwidm90YW50XCIsIGpzOiBcInZvdGFudFwiLCB0eXA6IHUoYShyKFwiVm90YW50XCIpKSwgcihcIlZvdGFudFwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJWb3RhbnRcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJhY3RldXJSZWZcIiwganM6IFwiYWN0ZXVyUmVmXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwibWFuZGF0UmVmXCIsIGpzOiBcIm1hbmRhdFJlZlwiLCB0eXA6IFwiXCIgfSxcbiAgICAgICAgeyBqc29uOiBcInBhckRlbGVnYXRpb25cIiwganM6IFwicGFyRGVsZWdhdGlvblwiLCB0eXA6IHUodW5kZWZpbmVkLCBcIlwiKSB9LFxuICAgICAgICB7IGpzb246IFwibnVtUGxhY2VcIiwganM6IFwibnVtUGxhY2VcIiwgdHlwOiB1KHVuZGVmaW5lZCwgdShcIlwiLCBudWxsKSkgfSxcbiAgICAgICAgeyBqc29uOiBcImNhdXNlUG9zaXRpb25Wb3RlXCIsIGpzOiBcImNhdXNlUG9zaXRpb25Wb3RlXCIsIHR5cDogdSh1bmRlZmluZWQsIHIoXCJDYXVzZVBvc2l0aW9uVm90ZVwiKSkgfSxcbiAgICBdLCBmYWxzZSksXG4gICAgXCJEZWNvbXB0ZVZvaXhcIjogbyhbXG4gICAgICAgIHsganNvbjogXCJwb3VyXCIsIGpzOiBcInBvdXJcIiwgdHlwOiBcIlwiIH0sXG4gICAgICAgIHsganNvbjogXCJjb250cmVcIiwganM6IFwiY29udHJlXCIsIHR5cDogXCJcIiB9LFxuICAgICAgICB7IGpzb246IFwiYWJzdGVudGlvblwiLCBqczogXCJhYnN0ZW50aW9uXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRcIiwganM6IFwibm9uVm90YW50XCIsIHR5cDogdSh1bmRlZmluZWQsIHUoXCJcIiwgbnVsbCkpIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzXCIsIGpzOiBcIm5vblZvdGFudHNcIiwgdHlwOiB1KHVuZGVmaW5lZCwgXCJcIikgfSxcbiAgICAgICAgeyBqc29uOiBcImFic3RlbnRpb25zXCIsIGpzOiBcImFic3RlbnRpb25zXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgICAgIHsganNvbjogXCJub25Wb3RhbnRzVm9sb250YWlyZXNcIiwganM6IFwibm9uVm90YW50c1ZvbG9udGFpcmVzXCIsIHR5cDogdSh1bmRlZmluZWQsIFwiXCIpIH0sXG4gICAgXSwgZmFsc2UpLFxuICAgIFwiTW9kZVB1YmxpY2F0aW9uRGVzVm90ZXNcIjogW1xuICAgICAgICBcIkRlY29tcHRlRGlzc2lkZW50c1Bvc2l0aW9uR3JvdXBlXCIsXG4gICAgICAgIFwiRGVjb21wdGVOb21pbmF0aWZcIixcbiAgICBdLFxuICAgIFwiQ29kZVwiOiBbXG4gICAgICAgIFwiYWRvcHTDqVwiLFxuICAgICAgICBcInJlamV0w6lcIixcbiAgICBdLFxuICAgIFwiTGliZWxsZVwiOiBbXG4gICAgICAgIFwibCdBc3NlbWJsw6llIG5hdGlvbmFsZSBhIGFkb3B0w6lcIixcbiAgICAgICAgXCJMJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlIG4nYSBwYXMgYWRvcHTDqVwiLFxuICAgICAgICBcIkxlIENvbmdyw6hzIGR1IFBhcmxlbWVudCBhIGFkb3B0w6lcIixcbiAgICAgICAgXCJMZSBDb25ncsOocyBkdSBQYXJsZW1lbnQgbidhIHBhcyBhZG9wdMOpXCIsXG4gICAgICAgICAgXSxcbiAgICBcIkNvZGVUeXBlVm90ZVwiOiBbXG4gICAgICAgIFwiTU9DXCIsXG4gICAgICAgIFwiU0FUXCIsXG4gICAgICAgIFwiU1BPXCIsXG4gICAgICAgIFwiU1BTXCIsXG4gICAgICAgIFwiU1NHXCIsXG4gICAgXSxcbiAgICBcIkxpYmVsbGVUeXBlVm90ZVwiOiBbXG4gICAgICAgIFwibW90aW9uIGRlIGNlbnN1cmVcIixcbiAgICAgICAgXCJzY3J1dGluIHB1YmxpYyBvcmRpbmFpcmVcIixcbiAgICAgICAgXCJzY3J1dGluIHB1YmxpYyBzb2xlbm5lbFwiLFxuICAgICAgICBcInNjcnV0aW4gw6AgbGEgdHJpYnVuZVwiLFxuICAgICAgICBcIlNjcnV0aW4gc29sZW5uZWwgY29uZ3LDqHNcIixcbiAgICBdLFxuICAgIFwiVHlwZU1ham9yaXRlXCI6IFtcbiAgICAgICAgXCJNYWpvcml0w6kgYWJzb2x1ZSBkZXMgc3VmZnJhZ2VzIGV4cHJpbcOpc1wiLFxuICAgICAgICBcIm1ham9yaXTDqSBhYnNvbHVlIGRlcyBzdWZmcmFnZXMgZXhwcmltw6lzXCIsXG4gICAgICAgIFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCIsXG4gICAgICAgIFwibWFqb3JpdMOpIGRlcyBtZW1icmVzIGNvbXBvc2FudHMgY29tcG9zYW50IGwnQXNzZW1ibMOpZVwiLFxuICAgICAgICBcIm1ham9yaXTDqSBkZXMgbWVtYnJlcyBjb21wb3NhbnRzIGNvbXBvc2FudCBsJ0Fzc2VtYmzDqWUgbmF0aW9uYWxlXCIsXG4gICAgICAgIFwiTWFqb3JpdMOpIHJlcXVpc2UgcG91ciB1biBDb25ncsOoc1wiLFxuICAgICAgICBcIk1ham9yaXTDqSByZXF1aXNlIHBvdXIgdW5lIG1vdGlvbiBkZSBjZW5zdXJlXCIsXG4gICAgXSxcbiAgICBcIkNhdXNlUG9zaXRpb25Wb3RlXCI6IFtcbiAgICAgICAgXCJNR1wiLFxuICAgICAgICBcIlBBTlwiLFxuICAgICAgICBcIlBTRVwiLFxuICAgIF0sXG4gICAgXCJQb3NpdGlvbk1ham9yaXRhaXJlXCI6IFtcbiAgICAgICAgXCJhYnN0ZW50aW9uXCIsXG4gICAgICAgIFwiY29udHJlXCIsXG4gICAgICAgIFwicG91clwiLFxuICAgIF0sXG4gICAgXCJMaWV1Vm90ZVwiOiBbXG4gICAgICAgIFwiQ29uZ3LDqHNcIixcbiAgICAgICAgXCJIw6ltaWN5Y2xlXCIsXG4gICAgICAgIFwiU2Fsb25zXCIsXG4gICAgXSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBLElBNkRZQSx1QkFBdUIsR0FBQUMsT0FBQSxDQUFBRCx1QkFBQSwwQkFBdkJBLHVCQUF1QjtFQUF2QkEsdUJBQXVCO0