WikiLerni/front/public/JS/manageQuestionnaires.app.js

2387 lines
345 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/manageQuestionnaires.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "../config/illustrations.js":
/*!**********************************!*\
!*** ../config/illustrations.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var instance = __webpack_require__(/*! ./instance */ "../config/instance.js");
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
illustrationsRoute: "/illustration/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Illustration: {
alt: {
maxlength: 255
},
title: {
maxlength: 255
},
caption: {
maxlength: 255
},
image: {
required: true,
accept: instance.mimeTypesForIllustration.join(",")
}
},
// files upload tempory dir
dirIllustrationsTmp: "temp",
dirIllustrations: "front/public/img/quizs"
};
/***/ }),
/***/ "../config/instance.js":
/*!*****************************!*\
!*** ../config/instance.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var _module$exports;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var users = __webpack_require__(/*! ./users */ "../config/users.js");
var questionnaires = __webpack_require__(/*! ./questionnaires */ "../config/questionnaires.js");
module.exports = (_module$exports = {
apiUrl: "http://localhost:3000/api",
siteUrl: "http://localhost:8080",
adminName: "Fabrice",
adminEmail: "dev@wikilerni.com",
senderName: "WikiLerni (local)",
senderEmail: "bonjour@wikilerni.com",
adminLang: "fr",
theme: "wikilerni",
// le thème utilisé (dans /views) pour générer les pages HTML. Contient ses propres fichiers de configuration.
availableLangs: ["fr"],
// Languages in which the site is available. The first one is the default one.
siteName: "WikiLerni (local)",
beginCodeGodfather: "WL",
// case-sensitive and can't contain "@" !
defaultReceiptDays: "147",
// Par défaut, quel(s) jour(s) de la semaine, l'utilisateur reçoit-il quelque chose ? (1=dimanche, 2=lundi... 7=samedi)
cronTimingAlertInSeconde: 120,
// for logs
responseTimingAlertInSeconde: 3,
// idem
tokenSignupValidationTimeInHours: "48h",
// https://github.com/zeit/ms
tokenLoginLinkTimeInHours: "1h",
tokenConnexionMinTimeInHours: "24h",
tokenConnexionMaxTimeInDays: "180 days",
tokenLoginChangingTimeInHours: "1h",
// for email & password changing
tokenDeleteUserTimeInHours: "1h",
tokenUnsubscribeLinkTimeInDays: "7 days",
// token send with subscription's emails
freeAccountTimingInDays: 15,
freeAccountExpirationNotificationInDays: 3,
accountExpirationFirstNotificationInDays: 10,
accountExpirationSecondNotificationInDays: 3,
inactiveAccountTimeToDeleteInDays: 180,
// Questionnaires:
nbQuestionsMin: 1,
// minimum number of questions for the questionnaire to be publishable
nbQuestionsMax: 2,
// if 0 = not maximum
nbChoicesMax: 10,
nbNewQuestionnaires: 12,
// for RSS, etc.
hourGiveNewQuestionnaireBegin: 7,
// in user local time
hourGiveNewQuestionnaireEnd: 21,
// idem
maxQuestionnaireSendedAtSameTime: 50,
// for subscription's e-mailing
minSearchQuestionnaires: 3,
fieldNewQuestionnaires: "publishingAt",
// field to be used to create the list of the last questionnaires, can be "createdAt", "updatedAt" or "publishingAt"
// Groups :
nbQuestionnairesByGroupMin: 2,
nbQuestionnairesByGroupMax: 0,
// Illustrations:
nbIllustrationsMin: 1,
nbIllustrationsMax: 1,
maxIllustrationSizeinOctet: 1000000,
// pas contrôlé pour l'instant. À revoir.
mimeTypesForIllustration: ["image/jpg", "image/jpeg", "image/png", "image/gif", "image/png"],
// -- Upload and resize:
illustrationsWidthMaxInPx: 500,
illustrationsMiniaturesWidthMaxInPx: 200,
// Links:
nbLinksMin: 1,
nbLinksMax: 1
}, _defineProperty(_module$exports, "nbQuestionsMin", 1), _defineProperty(_module$exports, "nbQuestionsMax", 0), _defineProperty(_module$exports, "nbChoicesMax", 10), _defineProperty(_module$exports, "passwordMinLength", users.password.minlength), _defineProperty(_module$exports, "dirCacheUsers", users.dirCacheUsers), _defineProperty(_module$exports, "dirCacheUsersAnswers", users.dirCacheUsersAnswers), _defineProperty(_module$exports, "dirCacheQuestionnaires", questionnaires.dirCacheQuestionnaires), _defineProperty(_module$exports, "dirCacheQuestions", questionnaires.dirCacheQuestions), _defineProperty(_module$exports, "dirCacheUsersQuestionnaires", questionnaires.dirCacheUsersQuestionnaires), _defineProperty(_module$exports, "dirHTMLQuestionnaires", questionnaires.dirHTMLQuestionnaires), _defineProperty(_module$exports, "dirWebQuestionnaires", questionnaires.dirWebQuestionnaires), _module$exports);
/***/ }),
/***/ "../config/links.js":
/*!**************************!*\
!*** ../config/links.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
linksRoute: "/link/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Link: {
url: {
maxlength: 255,
required: true
},
anchor: {
maxlength: 150,
required: true
}
}
};
/***/ }),
/***/ "../config/questionnaires.js":
/*!***********************************!*\
!*** ../config/questionnaires.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
questionnaireRoutes: "/questionnaire",
// la base à laquelle s'ajoute les routes suivantes
getListNextQuestionnaires: "/getlistnextquestionnaires/",
getQuestionnaireRoutes: "/get",
getRandomQuestionnairesRoute: "/getrandom",
getStatsQuestionnaires: "/stats/",
previewQuestionnaireRoutes: "/preview",
publishedQuestionnaireRoutes: "/quiz/",
regenerateHTML: "/htmlregenerated",
searchAdminQuestionnairesRoute: "/searchadmin",
searchQuestionnairesRoute: "/search",
// -- groupes :
groupRoutes: "/group",
getGroupRoute: "/get/",
previewGroupRoutes: "/preview",
searchGroupsRoute: "/search",
// -- questions & choices :
questionsRoute: "/question/",
// -- tags :
tagsSearchRoute: "/tags/search/",
// -- answers :
getAdminStats: "/getadminstats/",
getPreviousAnswers: "/user/answers/",
getStatsAnswers: "/user/anwswers/stats/",
// fonctionne aussi pour les groupes
saveAnswersRoute: "/answer/",
// idem
// forms : à compléter avec valeurs par défaut, etc. cf modèle
Questionnaire: {
title: {
maxlength: 255,
required: true
},
slug: {
maxlength: 150
},
// champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
introduction: {
required: true
}
},
searchQuestionnaires: {
minlength: 3,
required: true
},
Group: {
title: {
maxlength: 255,
required: true
},
slug: {
maxlength: 150
} // champ requis mais calculé à partir du titre qd laissé vide dans le formulaire
},
Question: {
text: {
maxlength: 255,
required: true
},
rank: {
required: true,
min: 1,
defaultValue: 1
}
},
Choice: {
text: {
maxlength: 255,
required: true
}
},
search: {
minlength: 3,
required: true
},
searchGroups: {
minlength: 3,
required: true
},
// Emplacement des fichiers JSON générés :
dirCacheGroups: "datas/questionnaires/groups",
dirCacheQuestionnaires: "datas/questionnaires",
dirCacheQuestions: "datas/questionnaires/questions",
dirCacheTags: "datas/questionnaires/tags",
dirCacheUsersQuestionnaires: "datas/users/questionnaires",
// Emplacement des fichiers HTML générés :
dirHTMLGroups: "front/public/quiz/gp",
dirHTMLQuestionnaires: "front/public/quiz",
dirHTMLNews: "front/public/quizs",
dirHTMLTags: "front/public/quizs",
// Idem mais pour urls :
dirWebGroups: "quiz/gp",
dirWebQuestionnaires: "quiz",
dirWebNews: "quizs/",
dirWebTags: "quizs/",
// limite des résultat du moteur de recherche, quand demande de résultats au hasard :
nbRandomResults: 3,
/* Valeurs en fait définies dans instance.js donc à supprimer quand plus utilisées ailleurs : */
nbQuestionsMin: 1,
nbQuestionsMax: 0,
nbChoicesMax: 10,
nbTagsMin: 0,
nbTagsMax: 0 // 0 = not max
};
/***/ }),
/***/ "../config/users.js":
/*!**************************!*\
!*** ../config/users.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// API'routes (after "apiUrl" defined in instance.js)
userRoutes: "/user",
checkDeleteLinkRoute: "/confirmdelete/",
checkIfIsEmailfreeRoute: "/isemailfree",
checkLoginRoute: "/checklogin/",
checkNewLoginLinkRoute: "/confirmnewlogin/",
checkSubscribeTokenRoute: "/validation/",
connectionRoute: "/login",
connectionWithLinkRoute: "/checkloginlink",
createUserRoute: "/create",
getAdminStats: "/getadminstats/",
getGodChilds: "/getgodchilds/",
getGodfatherRoute: "/getgodfatherid",
getLoginLinkRoute: "/getloginlink",
getPayments: "/payment/getforoneuser/",
getUserInfos: "/get/",
getUsersQuestionnairesRoute: "/getusersquestionnaires/",
// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
searchUserRoute: "/search/",
signupCompletionRoute: "/signupcompletion/",
subscribeRoute: "/signup",
unsubscribeRoute: "/subscription/stop/",
updateUserInfos: "/modify/",
validateUserRoute: "/validate/",
// forms : à compléter avec valeurs par défaut, etc. cf modèle
name: {
maxlength: 70,
required: true
},
email: {
maxlength: 255,
required: true
},
password: {
minlength: 8,
maxlength: 72,
required: true
},
// https://www.npmjs.com/package/bcrypt#security-issues-and-concerns
newPassword: {
minlength: 8,
maxlength: 72
},
codeGodfather: {
maxlength: 255
},
cguOk: {
value: "true",
required: true
},
search: {
minlength: 1,
required: true
},
timeDifferenceMin: -720,
timeDifferenceMax: 840,
// JSON dir
dirCacheUsers: "datas/users",
dirCacheUsersAnswers: "datas/users/questionnaires/answers",
dirCacheUsersWithoutAnswers: "datas/users/questionnaires/without"
};
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/general$":
/*!**************************************!*\
!*** ../lang sync ^\.\/.*\/general$ ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/general": "../lang/fr/general.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/general$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/illustration$":
/*!*******************************************!*\
!*** ../lang sync ^\.\/.*\/illustration$ ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/illustration": "../lang/fr/illustration.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/illustration$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/link$":
/*!***********************************!*\
!*** ../lang sync ^\.\/.*\/link$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/link": "../lang/fr/link.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/link$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/question$":
/*!***************************************!*\
!*** ../lang sync ^\.\/.*\/question$ ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/question": "../lang/fr/question.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/question$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/questionnaire$":
/*!********************************************!*\
!*** ../lang sync ^\.\/.*\/questionnaire$ ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/questionnaire": "../lang/fr/questionnaire.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/questionnaire$";
/***/ }),
/***/ "../lang sync recursive ^\\.\\/.*\\/user$":
/*!***********************************!*\
!*** ../lang sync ^\.\/.*\/user$ ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./fr/user": "../lang/fr/user.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../lang sync recursive ^\\.\\/.*\\/user$";
/***/ }),
/***/ "../lang/fr/general.js":
/*!*****************************!*\
!*** ../lang/fr/general.js ***!
\*****************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
addBtnTxt: "Ajouter",
addOkMessage: "Les données ont bien été enregistrées.",
alertNewWindow: "nouvelle fenêtre",
badUrl: "Tentative d'accès à une page n'existant pas :",
btnLinkToQuestionnaire: "Afficher !",
btnProposeConnection: "Je me connecte.",
btnProposeSubscribe: "Je crée mon compte.",
btnShowOnWebSite: "Voir sur #SITE_NAME.",
deleteBtnTxt: "Supprimer",
deleteFailMessage: "La suppression de l'enregistrement #ID a échoué.",
deleteOkMessage: "La suppression a bien été enregistrée.",
failAuth: "Erreur d'authentification.",
failAuthCron: "Tentative de lancement d'un cron sans le bon token.",
failAuthHeader: "Absence de header Authorization.",
failAuthId: "Identifiant non valide : ",
failAuthToken: "Token invalide ou utilisateur non trouvé.",
neededParams: "Des paramètres nécessaires manquants sont manquants.",
nextPage: "Page suivante",
notAllowed: "Vous n'avez pas les droits nécessaires pour cette action.",
notRequired: "Facultatif.",
notValidFormat: "Format non valide.",
previousPage: "Page précédente",
serverError: "Désolé. Une erreur imprévue est survenue. Si cela persiste, n'hésitez à prévenir l'administrateur du site.",
serverErrorAdmin: "Bug de l'application :",
siteHTMLTitle: "WikiLerni : la culture générale en liberté",
siteMetaDescription: "Avec WikiLerni, vous apprenez chaque jour de nouvelles choses. Vous recevez de courts articles lisibles en quelques minutes. Des quizs vous permettent ensuite de tester ce que vous avez retenu.",
scriptTimingAlert: "*** Script lent : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
scriptTimingInfo: "Durée de la réponse : SCRIPT_TIMING millisecondes, route : SCRIPT_URL",
statsAdmin: "Durant les dernières 24h : NB_USERS_24H comptes ont été créés, NB_SUBSCRIPTIONS_24H validés et NB_USERS_DELETED_24H supprimés. NB_ANSWERS_24H réponses aux quizs ont été enregistrées.<br>En tout, il y a : NB_USERS_TOT comptes, dont NB_SUBSCRIPTIONS_TOT validés et NB_SUBSCRIPTIONS_PREMIUM comptes prémium. NB_ANSWERS_TOT réponses aux quizs ont été enregistrées.<br>Parmi les NB_USERS_DELETED_TOT comptes supprimés, NB_USERS_DELETED_VALIDED avaient validé leur compte et NB_USERS_DELETED_PREMIUM avaient souscrit un compte prémium.",
subscriptionCall: "Inscrivez-vous !",
updateBtnTxt: "Modifier",
updateOkMessage: "La mise à jour à jour a bien été enregistrée."
};
/***/ }),
/***/ "../lang/fr/illustration.js":
/*!**********************************!*\
!*** ../lang/fr/illustration.js ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
addedOkMessage: "L'illustration a bien été enregistrée.",
addIllustrationTxt: "Ajouter une illustration",
defaultAlt: "Illustration du quiz",
deletedOkMessage: "L'illustration a bien été supprimée.",
introNoIllustration: "Aucune illustration pour l'instant.",
introTitleForIllustration: "Illustrations du quiz",
needGoodFile: "Votre fichier n'a pas été accepté.",
needGoodLongAlt: "Le texte de la propriété 'alt' ne doit pas compter plus de 255 caractères.",
needGoodLongCaption: "Le texte de la légende de l'image ne doit pas compter plus de 255 caractères.",
needGoodLongTitle: "Le texte de la propriété 'title' ne doit pas compter plus de 255 caractères.",
needGoodLongUrl: "L'url de l'image doit contenir entre 5 et 255 caractères.",
needMaxIllustrationsForQuestionnaire: "Vous avez déjà atteint le nombre maximal d'illustrations pour ce questionnaire.",
needQuestionnaireForIllustration: "Tentative d'ajout/mise à jour/suppreession d'une illustration pour un questionnaire n'ayant pas été trouvé.",
needUniqueUrl: "L'url est déjà utilisée par une autre image.",
needUrl: "Merci de fournir une url pour l'image.",
notFound: "L'enregistrement de l'illustration n'a pas été trouvé : ",
updatedOkMessage: "L'illustration a bien été modifiée."
};
/***/ }),
/***/ "../lang/fr/link.js":
/*!**************************!*\
!*** ../lang/fr/link.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
addedOkMessage: "Le lien a bien été ajouté.",
addLinkTxt: "Ajouter un lien",
defaultValueForLink: "Lire l'article sur Wikipédia.",
deletedOkMessage: "Le lien a bien été supprimé.",
introNoLink: "Aucun lien pour l'instant.",
introTitleForLink: "Lectures proposées",
needAnchor: "Merci de fournir une ancre pour ce lien.",
needGoodLongAnchor: "Merci de fournir une ancre pour ce lien comptant entre 5 et 150 caractères.",
needMaxLinksForQuestionnaire: "Vous avez déjà atteint le nombre maximal de liens pour ce questionnaire.",
needNotTooLongUrl: "Merci de saisir un url ne comptant pas plus de 255 caractères.",
needQuestionnaire: "Le questionnaire du lien n'a pas été trouvé.",
needUrl: "Merci de saisir l'url du lien.",
needValidUrl: "Merci de saisir un url ayant un format valide.",
notFound: "L'enregistrement du lien n'a pas été trouvé.",
updatedOkMessage: "Le lien a bien été modifié."
};
/***/ }),
/***/ "../lang/fr/question.js":
/*!******************************!*\
!*** ../lang/fr/question.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
addOkMessage: "La question a bien été ajoutée.",
addQuestionTxt: "Ajouter une question",
deleteOkMessage: "La question a bien été supprimée.",
introNoQuestion: "Aucune question n'a été saisie pour l'instant",
introTitleForQuestion: "Les questions enregistrées",
needMaxQuestions: "Vous avez déjà atteint le nombre maximal de questions pour ce questionnaire : ",
needNotTooLongText: "La question ne doit pas compter plus de 255 caractères.",
needNumberForRank: "Vous devez fournir un nombre supérieur ou égal à 1 pour le rang de cette question.",
needQuestionnaire: "Le questionnaire concerné n'a pas été trouvé.",
needText: "Merci de saisir le texte de la question !",
notFound: "L'enregistrement de la question n'a pas été trouvé.",
updateOkMessage: "La question a bien été modifiée."
};
/***/ }),
/***/ "../lang/fr/questionnaire.js":
/*!***********************************!*\
!*** ../lang/fr/questionnaire.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
btnProposeConnection: "Je me connecte.",
// déplacé dans general.js
btnProposeSubscribe: "Je crée mon compte.",
//idem
btnSendResponse: "Testez vos réponses.",
btnShareQuizTxt: "Partager via ",
btnShareQuizMailBody: "Bonjour,%0A%0AVoici%20un%20lien%20internet%20qui%20devrait%20t'intéresser :%0A",
btnShowQuestionnaire: "Répondre au quiz !",
correctAnswerTxt: "Bonne réponse",
estimatedTime: "Durée de lecture estimée : ",
estimatedTimeOption: {
short: "courte",
medium: "moyenne",
long: "longue"
},
explanationBeforeTxt: "Extrait :",
haveBeenPublished: ":NB nouveaux questionnaires ont été publiés.",
haveBeenRegenerated: "Les pages HTML de #NB1 questionnaires ou éléments de groupes, #NB2 quizs groupés et #NB3 thèmes ont été regénérés.",
lastUpdated: "Dernière mise à jour, le ",
linkGoToNextElement: "Article suivant",
linkGoToQuiz: "Accéder au quiz",
needCorrectPublishingDate: "La date de publication fournie n'a pas un format valide.",
needEstimatedTime: "Merci de sélectionner une estimation de la durée de ce quiz.",
needGroupIfRank: "Vous avez saisi un rang de classement, sans sélectionner le groupe du quiz.",
needIntroduction: "Merci de fournir un texte d'introduction à votre quiz.",
needKnowIfIsPublished: "Il faut savoir si ce quiz est publié.",
needLanguage: "Vous devez sélectionner la langue de ce quiz.",
needNotTooLongTitle: "Le titre du quiz ne doit pas compter plus de 255 caractères.",
needNumberForRank: "Vous devez saisir un nombre entier pour le rang de ce questionnaire dans son groupe.",
needTitle: "Merci de fournir un titre à votre quiz.",
needUniqueUrl: "L'url du quiz doit être unique.",
needUrl: "Merci de fournir l'url à votre quiz.",
nextDateWithoutQuestionnaire: "Prochaine date sans quiz programmé : ",
nextQuestionnairesList: "Les #NB prochains quizs devant être publiés",
questionnairesName: "quiz",
questionnaireNeedBeCompleted: "Quiz incomplet",
publishedAt: ", le",
publishedBy: "Quiz publié par",
searchQuestionnaireResultTitle: "Résultat pour votre recherche",
searchQuestionnaireWithNoResult: "Aucun quiz n'a été trouvé pour votre recherche.",
searchQuestionnaireWithResult: "Il y a #NB article#S correspondant à votre recherche :",
wrongAnswerTxt: "Mauvaise réponse"
};
/***/ }),
/***/ "../lang/fr/user.js":
/*!**************************!*\
!*** ../lang/fr/user.js ***!
\**************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
alreadyConnected: "Vous êtes déjà connecté au site !",
badLinkValidationMessage: "Votre lien de confirmation ne semble pas valide ou bien il a expiré. Vous pouvez en recevoir un nouveau <a href='#URL'>en cliquant ici</a>.",
badPassword: "Aucun compte utilisateur ne correspond aux informations saisies.",
byebyeMessage: "Si vous voyez ce message, c'est que votre déconnexion s'est bien déroulée.<br>À bientôt !",
connectionOk: "Connexion réussie.",
creationOkMessage: "Le nouvel utilisateur a bien été enregistré.",
cronDeleteUnvalidedUsersMessage: " comptes utilisateurs non validés ont été supprimés.",
deleteFailMessage: "Tentative de suppression d'un utilisateur inexistant : ",
deleteInactiveUsersMessage: " comptes utilisateurs inactifs ont été supprimés.",
deleteOkMessage: "L'utilisateur a bien été supprimé.",
emailNotFound: "Aucun compte utilisateur n'a été trouvé pour cette adresse e-mail.",
formsEmailLabel: "E-mail :",
formsEmailPlaceholder: "Votre adresse e-mail",
formsCGUOkLabel: "J'accepte <a href=#link target=\"_blank\" rel=\"noopener\" title=\"À lire :)\">les Conditions Générale d'Utilisation</a> du site (requis).",
formsSubmitTxt: "Je m'abonne !",
godfatherFound: "Votre \"parrain\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.",
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
infosAdminNbGodChilds: "Ses #NB filleuls : ",
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
infosUserNbGodChilds: "Voici les #NB utilisateur(s) inscrit(s) en vous désignant comme \"parrain\" : ",
infosUserNoGodchilds: "Pour l'instant, aucune personne ne s'est inscrite, en vous désignant comme \"parrain\".",
mailDeleteBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour confirmer la suppression de votre compte, cliquez sur le lien ci-dessous sans tarder.</p>",
mailDeleteBodyTxt: "Bonjour USER_NAME,\n\nPour confirmer la suppression de votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailDeleteLinkAlreadyMessage: "Il semble que vous ayez déjà validé la suppression de votre compte.",
mailDeleteLinkFailMessage: "Votre lien de suppression n'est pas valide ou alors il a expiré.",
mailDeleteLinkMessage: "Votre demande de suppression a bien été enregistrée. Merci de cliquer sans tarder sur le lien qui vient de vous être envoyé par e-mail pour confirmer.",
mailDeleteLinkOkMessage: "Votre compte a bien été supprimé. Merci d'avoir utilisé nos services.",
mailDeleteLinkTxt: "Confirmer.",
mailDeleteSubject: "Confirmer la suppression de votre compte.",
mailLoginLinkBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :</p>",
mailLoginLinkBodyTxt: "Bonjour USER_NAME,\n\nPour vous connecter à votre compte, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailLoginLinkMessage: "Un lien de connexion vient de vous être envoyé sur votre adresse e-mail. Ne tardez pas à l'utiliser, car il n'est valable que durant *TIMING* !",
mailLoginLinkSubject: "Votre lien de connexion.",
mailLoginLinkTxt: "Me connecter.",
mailThankGodfatherBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Grâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.<br>Si dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.</p><p>Encore merci et à bientôt !</p>",
mailThankGodfatherBodyTxt: "Bonjour USER_NAME,\nGrâce à vous, un nouvel utilisateur (EMAIL) vient de s'inscrire sur NOM_SITE.\nSi dans l'avenir cette personne souscrit un abonnement prémium, votre propre abonnement sera prolongé de 30 jours.\nEncore merci et à bientôt !",
mailThankGodfatherLinkTxt: "Me connecter à mon compte.",
mailThankGodfatherSubject: "Merci !",
mailUpdateLoginBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider vos nouveaux identifiants de connexion, cliquez sur le lien ci-dessous sans tarder.</p>",
mailUpdateLoginBodyTxt: "Bonjour USER_NAME,\n\nPour valider vos nouveaux identifiants de connexion, cliquez sur le lien suivant sans tarder :\nLINK_URL",
mailUpdateLoginLinkMessage: "Cependant, vous avez modifié au moins un de vos identifiants de connexion (e-mail et/ou mot de passe) et <b>vous devez cliquer sur le lien qui vient de vous êtres envoyé sur votre adresse (NEW_EMAIL) pour valider ce changement</b>.<br>En attendant, merci de continuer à utiliser vos anciens identifiants.",
mailUpdateLoginLinkTxt: "Valider.",
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
mailUpdateLoginSubject: "Merci de valider vos nouveaux identifiants.",
mailValidationLinkSBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
mailValidationLinkSBodyTxt: "Bonjour USER_NAME,\n\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSubject: "Merci de valider votre inscription",
mailValidationLinkTxt: "Valider mon compte.",
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient de vous être envoyé par e-mail.",
mailWelcomeBodyHTML: "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses <b>pour éviter que les prochains envois de NOM_SITE n'arrivent en <i>spam</i></b>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
mailWelcomeBodyTxt: "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",
mailWelcomeLinkTxt: "Me connecter à mon compte.",
mailWelcomeSubject: "Bienvenue !",
needBeConnected: "Vous devez être connecté pour accéder à cette page.",
needChooseLoginWay: "Vous devez soit saisir votre mot de passe, soit cocher la case vous permettant de recevoir un lien de connexion par e-mail.",
needEmail: "Merci de saisir votre adresse e-mail.",
needKnowNewsletterOk: "Il faut savoir si l'utilisateur accepte ou refuse de recevoir la newsletter.",
needLanguage: "Il manque le code langue.",
needLongPassWord: "Merci de fournir un mot de passe d'au moins MIN_LENGTH caractères.",
needMaxTimeDifference: "Il faut fournir un nombre de minutes à ajouter à l'heure GMT ne dépassant pas 840.",
needMinTimeDifference: "Il faut fournir un nombre de minutes à enlever à l'heure GMT ne dépassant pas 720.",
needName: "Merci de choisir un nom d'utilisateur.",
needNotTooLongName: "Merci de choisir un nom d'utilisateur ne comptant pas plus de 70 caractères.",
needNotTooLongEmail: "Merci de saisir une adresse e-mail ne comptant pas plus de 255 caractères.",
needPassWord: "Merci de fournir un mot de passe.",
needSMTP: "Il manque le serveur SMTP.",
needSMTPNotFound: "Il manque un serveur SMTP valide.",
needStatus: "Il manque le statut.",
needTimeDifference: "Il faut connaître le nombre de minutes du décalage horaire.",
needUGCOk: "Merci d'accepter les CGU pour créer votre compte.",
needUniqueEmail: "L'adresse e-mail que vous avez saisie est déjà utilisée pour un compte utilisateur. Si vous avez déjà un compte, <a href='/#URL'>cliquez-ici pour vous connecter</a>.",
needValidationToLogin: "Vous devez d'abord valider votre compte avant de pouvoir vous connecter. Pour ce faire, un nouveau lien vient de vous être envoyé par e-mail.",
needValidLastConnectionDate: "La date de dernière connexion n'est pas valide.",
passwordCopied: "Le mot de passe généré a été copié dans le presse-papier de votre ordinateur (ou mobile). Vous pouvez le \"coller\" où vous le souhaitez.",
searchUsersWithoutResult: "L'utilisateur n'a pas été trouvé.",
tooManyLoginFails: "Désolé mais il y a eu trop de tentatives de connexion infructueuses pour cette adresse e-mail. Vous devez attendre MINUTES minutes pour essayer de nouveau.",
updatedFailedGodfatherNotFound: "L'identifiant fourni pour le parrain ne correspond à aucun utilisateur.",
updatedNeedGoodEmail: "Mais la nouvelle adresse e-mail n'a pu être enregistrée, car elle n'a pas un format correct.",
updatedNeedGoodGodfather: "Mais le nouveau code parrain n'a pu être retenu, car il ne correspond à aucun compte utilisateur ou à l'utilisateur lui-même.",
updatedNeedUniqueEmail: "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",
updatedNeedValidatedUser: "L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",
updatedOkMessage: "Vos informations ont bien été mises à jour.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter <a href='#URL'>en cliquant ici</a>.",
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez compléter les informations de votre abonnement ci-dessous.",
validationMessageAdmin: "Le compte a bien été validé.",
welcomeMessage: "Bienvenue #NAME !"
};
/***/ }),
/***/ "../tools/main.js":
/*!************************!*\
!*** ../tools/main.js ***!
\************************/
/*! no static exports found */
/***/ (function(module, exports) {
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
// Quelques fonctions utiles pour les chaînes
var Tool = /*#__PURE__*/function () {
function Tool() {
_classCallCheck(this, Tool);
}
_createClass(Tool, null, [{
key: "isEmpty",
value: function isEmpty(myVar) {
if (myVar === undefined || myVar === null) return true;else {
myVar += ""; // si autre chose qu'une chaîne envoyé...
myVar = myVar.trim();
if (myVar === "") return true;else return false;
}
}
}, {
key: "trimIfNotNull",
value: function trimIfNotNull(myString) {
if (Tool.isEmpty(myString)) myString = null;else {
myString += ""; // si autre chose qu'une chaîne envoyé...
myString = myString.trim();
}
return myString;
}
}, {
key: "shortenIfLongerThan",
value: function shortenIfLongerThan(myString, max) {
myString += ""; // au cas où cela ne serait pas une chaîne...
if (myString.length > max) myString = myString.substring(0, max - 3) + "...";
return myString;
} // source : https://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings
}, {
key: "replaceAll",
value: function replaceAll(myString, mapObj) {
var replaceElts = new RegExp(Object.keys(mapObj).join("|"), "gi");
return myString.replace(replaceElts, function (matched) {
return mapObj[matched];
});
} // source : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math/random
}, {
key: "getRandomInt",
value: function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
} // à compléter : https://en.wikipedia.org/wiki/Date_format_by_country
}, {
key: "dateFormat",
value: function dateFormat(dateString) {
var lang = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fr";
if (Tool.isEmpty(dateString)) return "";
var myDate = new Date(dateString);
var myDay = myDate.getDate() + "";
if (myDay.length === 1) myDay = "0" + myDay;
var myMounth = myDate.getMonth() + 1 + "";
if (myMounth.length === 1) myMounth = "0" + myMounth;
var myYear = myDate.getFullYear();
if (lang === "fr") return myDay + "/" + myMounth + "/" + myYear;else if (lang === "form") // 2014-02-09
return myYear + "-" + myMounth + "-" + myDay;else return myMounth + "/" + myDay + "/" + myYear;
} // On enlève volontairement les 0/O pour éviter les confusions !
// Et mieux vaut aussi débuter et finir par une lettre simple.
}, {
key: "getPassword",
value: function getPassword(nbCarMin, nbCarMax) {
var nbCar = nbCarMin + Math.floor(Math.random() * (nbCarMax - nbCarMin));
var letters = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz";
var others = "123456789!?.*-_%@&ÉÀÈÙ€$ÂÊÛÎ";
var password = letters[Math.floor(Math.random() * letters.length)];
for (var i = 1; i < nbCar - 1; i++) {
if (i % 2 === 1) password += others[Math.floor(Math.random() * others.length)];else password += letters[Math.floor(Math.random() * letters.length)];
}
password += letters[Math.floor(Math.random() * letters.length)];
return password;
}
}]);
return Tool;
}();
module.exports = Tool;
/***/ }),
/***/ "../views sync recursive ^\\.\\/.*\\.js$":
/*!**********************************!*\
!*** ../views sync ^\.\/.*\.js$ ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
var map = {
"./default/config/fr.js": "../views/default/config/fr.js",
"./wikilerni/config/fr.js": "../views/wikilerni/config/fr.js"
};
function webpackContext(req) {
var id = webpackContextResolve(req);
return __webpack_require__(id);
}
function webpackContextResolve(req) {
if(!__webpack_require__.o(map, req)) {
var e = new Error("Cannot find module '" + req + "'");
e.code = 'MODULE_NOT_FOUND';
throw e;
}
return map[req];
}
webpackContext.keys = function webpackContextKeys() {
return Object.keys(map);
};
webpackContext.resolve = webpackContextResolve;
module.exports = webpackContext;
webpackContext.id = "../views sync recursive ^\\.\\/.*\\.js$";
/***/ }),
/***/ "../views/default/config/fr.js":
/*!*************************************!*\
!*** ../views/default/config/fr.js ***!
\*************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
headLinks: [{
anchor: "Accueil",
attributes: {
href: "/"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html"
}
}, {
anchor: "Contact",
attributes: {
href: "/contact.html"
}
}],
footLinks: [{
anchor: "Crédits",
attributes: {
href: "/credits.html"
}
}, {
anchor: "Mentions légales",
attributes: {
href: "/mentions-legales.html",
rel: "nofollow"
}
}, {
anchor: "Données personnelles",
attributes: {
href: "/donnees.html"
}
}, {
anchor: "C.G.U.",
attributes: {
href: "/cgu.html",
rel: "nofollow"
}
}, {
anchor: "C.G.V.",
attributes: {
href: "/cgv.html",
rel: "nofollow"
}
}],
maxQuestionnairesByPage: 10,
userHomePage: "accueil.html",
adminHomePage: "admin.html",
managerHomePage: "gestion.html",
subscribePage: "inscription.html",
connectionPage: "connexion.html",
accountPage: "compte.html",
questionnairesManagementPage: "gestion-quizs.html",
usersManagementPage: "gestion-utilisateurs.html",
nbQuestionnairesUserHomePage: 10,
illustrationDir: "/img/quizs/",
siteSlogan: "Cultivons notre jardin !",
homeTitle1: "De nature curieuse ?",
homeP1: "Avec WikiLerni vous apprenez chaque jour de nouvelles choses.<br>Des articles de Wikipédia sont sélectionnés pour vous et sont suivis d'un quiz vous permettant de tester ce que vous en avez retenu.<br>De jour en jour de nouvelles graines de savoir sont ainsi semées dans votre \"jardin\".",
homeTitle2: "La culture en liberté",
homeP2: "Tout comme sur Wikipédia (*), le logiciel et le contenu partagé sur WikiLerni sont libres.<br>Vous pouvez les utiliser, les modifier et les diffuser selon votre souhait.<br>Sur WikiLerni, pas de publicité, ni de commercialisation de vos données personnelles.<br>Vous pouvez venir y \"cultiver votre jardin\" en toute tranquillité.<br><br><small><em>(*) Bien que partageant ses valeurs, WikiLerni est un projet indépendant de la fondation Wikipédia.</em></small>",
newQuestionnairesTitle: "Les derniers quizs publiés sur WikiLerni",
newQuestionnairesIntro: "Liste des derniers quizs publiés sur WikiLerni.",
explanationTitle: "Vous découvrez WikiLerni ?",
explanationTxt: "Le principe est simple : vous commencez par lire l'article Wikipédia dont le lien vous est proposé.<br>Puis vous afficher le quiz pour vérifier ce que vous en avez retenu de votre lecture. Vous obtenez alors votre résultat immédiatement.<br><br>Toutes les réponses se trouvent dans l'article proposé à la lecture. <b>Vous êtes ici pour apprendre de nouvelles choses</b>, mais libre à vous d'essayer d'y répondre immédiatement.<br><br>Quand le sujet s'y prête, ne vous étonnez pas si certaines des réponses proposées peuvent être un peu décalées, absurdes... On peut apprendre avec le sourire, non ? :-)<br><br>Une fois votre résultat obtenu, il vous sera proposé de créer un compte pour le sauvegarder.<br>Ce compte vous permettra de tester de nouveau ce quiz pour vérifier ce que vous en avez retenu plusieurs jours, semaines, mois... Et de recevoir régulièrement de nouvelles suggestions de lectures.<br><br>Mais <b>la création de ce compte est facultative</b> et <a href='/quizs/' title='Les derniers quizs publiés'>vous pouvez parcourir WikiLerni librement</a>.",
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
tagsListTxt: "Parcourir les rubriques :"
};
/***/ }),
/***/ "../views/wikilerni/config/fr.js":
/*!***************************************!*\
!*** ../views/wikilerni/config/fr.js ***!
\***************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
// liens de l'interface
headLinks: [{
anchor: "Contact",
attributes: {
href: "/contact.html",
rel: "nofollow"
}
}, {
anchor: "Parcourir",
attributes: {
href: "/quizs/",
id: "indexHeadLink",
title: "Les dernières publications"
}
}, {
anchor: "Mon compte",
attributes: {
href: "/connexion.html",
id: "accountHeadLink",
title: "Accéder ou créez votre compte WikiLerni"
}
}, {
anchor: "À propos",
attributes: {
href: "/a-propos.html",
title: "En savoir + sur WikiLerni"
}
}, {
anchor: "Accueil",
attributes: {
href: "/",
title: "Page d'accueil"
}
}],
footLinks: [{
anchor: "Blog",
attributes: {
href: "https://framasphere.org/people/7e54b7a0b53201389eef2a0000053625",
title: "Le blog WikiLerni sur diaspora*"
}
}, {
anchor: "Crédits",
attributes: {
href: "/credits.html",
title: "Qui a créé WikiLerni ? Quels sont vos droits ?"
}
}, {
anchor: "Mentions légales",
attributes: {
href: "/mentions-legales.html",
rel: "nofollow"
}
}, {
anchor: "Données personnelles",
attributes: {
href: "/donnees.html",
title: "Vos données personnelles sur WikiLerni"
}
}, {
anchor: "CGV & CGU",
attributes: {
href: "/CGV-CGU.html",
rel: "nofollow"
}
}],
accountPage: "compte.html",
aboutPage: "a-propos.html",
adminHomePage: "admin.html",
cguPage: "CGV-CGU.html",
connectionPage: "connexion.html",
deleteLinkPage: "aurevoir.html?t=",
loginLinkPage: "login.html?t=",
managerHomePage: "gestion.html",
newLoginLinkPage: "newlogin.html?t=",
questionnairesManagementPage: "gestion-quizs.html",
stopMailPage: "stop-mail.html?t=",
subscribePage: "inscription.html",
updateAccountPage: "compte.html",
userHomePage: "accueil.html",
userHomePageTxt: "Ma page d'accueil.",
usersManagementPage: "gestion-utilisateurs.html",
validationLinkPage: "validation.html?t=",
/* Textes (général) */
siteSlogan: "Cultivons notre jardin !",
noJSNotification: "Désolé, mais pour l'instant, l'utilisation de WikiLerni nécessite l'activation du JavaScript.",
mailRecipientTxt: "Message envoyé à :",
licenceTxt: "@copyleft Le contenu de ce site <a href=\"/credits.html\" title=\"En savoir plus ?\">est libre</a> et vous offert sans publicité. Vous pouvez <a href=\"/participer-financement.html\" title=\"Financement participatif\">participer à son financement en cliquant ici</a>.",
/* Page d'accueil */
homePageTxt: "Page d'accueil",
homeTitle1: "De nature curieuse ?",
homeP1: "<b>Avec WikiLerni, vous allez apprendre chaque jour de nouvelles choses</b>.<br>Vous recevrez de courts articles, lisibles en quelques minutes.<br>Des quizs vous permettront ensuite de tester ce que vous aurez retenu.<br>De jour en jour <b>de nouvelles graines de culture sont ainsi semées dans votre jardin</b>.",
homeTitle2: "La culture générale en liberté",
homeP2: "Sur WikiLerni <b>pas de faits alternatifs</b>, tous les contenus sont <b>sourcés par des articles Wikipédia</b>.<br>Et tout comme sur Wikipédia, le logiciel et le contenu publié sur WikiLerni <a href=\"/credits.html\" title=\"En savoir plus sur ce sujet\">sont partagés sous licences libres</a>.<br>Le tout sans publicité, ni commercialisation de vos données.<br><b>Sur WikiLerni vous cultivez votre jardin en toute tranquillité.</b>",
homeBtnAboutTxt: "En savoir plus sur WikiLerni ?",
homeBtnSubscribeTxt: "Tester WikiLerni gratuitement.",
/* Page dernières publications... */
newQuestionnairesTitle: "Culture générale - apprenez de nouvelles choses avec WikiLerni",
newQuestionnairesIntro: "WikiLerni : testez vos connaissances et apprenez de nouvelles choses avec WikiLerni.",
newsListTitle: "<p><b>Avec WikiLerni, vous apprenez chaque jour quelque chose de nouveau</b><br>Si dessous les dernières publications. Vous pouvez aussi <a href='/quizs/themes.html'>parcourir le site par thèmes ou mots-clés</a>.</p>",
/* Plan du site, liste des tags */
tagListTitle: "Culture générale - des articles et quizs sur de nombreux thèmes !",
tagListMetaDesc: "WikiLerni : découvrir les différents thèmes abordés par WikiLerni. Inxex du site.",
tagListIntro: "<h3>Avec WikiLerni, devenez fort en thèmes... Oui mais quels thèmes ? :)</h3><blockquote>Aristote: «Lhomme a naturellement la passion de connaître…»</blockquote>",
/* Page quizs */
quizElementLinksIntro: "Source(s)",
quizElementSubcriptionFormTitle: "Recevez les prochains articles WikiLerni",
explanationTitle: "Vous découvrez WikiLerni?",
explanationTxt: "<p>Le principe est simple: <b>vous commencez par lire larticle Wikipédia dont le lien vous est proposé</b>. Puis vous <b>afficher le quiz pour vérifier ce que vous avez retenu de votre lecture</b>. Suivant les questions, <b>une ou plusieurs réponses peuvent être correctes</b> et doivent donc être cochées. Cest toujours <b>le contenu de larticle Wikipédia qui fait foi</b> concernant les «bonnes» réponses. Cest une façon de tester à la fois votre capacité dattention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc nhésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose dautres solutions pour améliorer votre culture générale</b>. Pour en savoir plus, cliquez sur le bouton ci-dessous.</p>",
explanationElementTxt: "<p>WikiLerni vous propose de <b>recevoir par e-mail à la fréquence choisie, de courts articles lisibles en quelques minutes</b> et portant sur des sujets très variés de culture générale (arts, histoire, littérature, sciences, etc.).</p><p>Chaque série darticles est <b>suivie dun quiz</b> permettant de tester ce que vous en avez retenu.</p><p><b>Vous apprenez ainsi de nouvelles choses très simplement.</b></p><p>Linscription est gratuite et vous permet de tester le site sans engagement.</p>",
/* Autres */
illustrationDir: "/img/quizs/",
twitterAccount: "WikiLerni",
maxQuestionnairesByPage: 12,
maxQuestionnairesSiteHomePage: 3,
nbQuestionnairesUserHomePage: 3
};
/***/ }),
/***/ "./src/manageQuestionnaires.js":
/*!*************************************!*\
!*** ./src/manageQuestionnaires.js ***!
\*************************************/
/*! no exports provided */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
/* harmony import */ var _tools_forms_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/forms.js */ "./src/tools/forms.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _tools_url_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/url.js */ "./src/tools/url.js");
/* harmony import */ var _tools_users_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tools/users.js */ "./src/tools/users.js");
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
// -- GESTION DU FORMULAIRE PERMETTANT DE SAISIR / ÉDITER LES QUIZS ET LEURS DÉPENDANCES (LIENS, IMAGES, TAGS, ETC.)
/// Vérifie que l'utilisateur est bien connecté, a le bon statut et le redirige vers le formulaire d'inscription si ce n'est pas le cas.
/// Si c'est ok, propose un moteur de recherche permettant de chercher un quiz
/// Si un id est passé par l'url on affiche les informations du quiz dans un formulaire permettant de l'éditer/supprimer avec une liste des éléments liés (liens, illustrations, questions...) pouvant eux-mêmes être édités/supprimés.
/// Si le nombre max configuré pour chacun de ses éléments n'est pas atteint, il est aussi proposé d'ajouter un nouvel élément.
/// Si pas d'id passé par l'url, on affiche un formulaire vide permettant de saisir un nouveau quiz.
// Fichiers de configuration :
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var config = __webpack_require__(/*! ../../config/instance.js */ "../config/instance.js");
var configIllustrations = __webpack_require__(/*! ../../config/illustrations.js */ "../config/illustrations.js");
var configLinks = __webpack_require__(/*! ../../config/links.js */ "../config/links.js");
var configQuestionnaires = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js"); // Fonctions :
// Dictionnaires :
var _require = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"),
addOkMessage = _require.addOkMessage,
deleteBtnTxt = _require.deleteBtnTxt,
serverError = _require.serverError,
updateBtnTxt = _require.updateBtnTxt;
var _require2 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/illustration$")("./" + lang + "/illustration"),
addIllustrationTxt = _require2.addIllustrationTxt,
defaultAlt = _require2.defaultAlt,
introNoIllustration = _require2.introNoIllustration,
introTitleForIllustration = _require2.introTitleForIllustration;
var _require3 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/link$")("./" + lang + "/link"),
addLinkTxt = _require3.addLinkTxt,
defaultValueForLink = _require3.defaultValueForLink,
introNoLink = _require3.introNoLink,
introTitleForLink = _require3.introTitleForLink;
var _require4 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/question$")("./" + lang + "/question"),
addQuestionTxt = _require4.addQuestionTxt,
introNoQuestion = _require4.introNoQuestion,
introTitleForQuestion = _require4.introTitleForQuestion;
var _require5 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"),
needGroupIfRank = _require5.needGroupIfRank,
nextDateWithoutQuestionnaire = _require5.nextDateWithoutQuestionnaire,
nextQuestionnairesList = _require5.nextQuestionnairesList,
questionnaireNeedBeCompleted = _require5.questionnaireNeedBeCompleted,
searchQuestionnaireWithNoResult = _require5.searchQuestionnaireWithNoResult;
var _require6 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"),
needBeConnected = _require6.needBeConnected; // Principaux éléments du DOM manipulés :
var btnNewQuestionnaire = document.getElementById("wantNewQuestionnaire");
var btnPreviewQuestionnaire = document.getElementById("previewQuestionnaire");
var deleteCheckBox = document.getElementById("deleteOkLabel");
var divCrash = document.getElementById("crash");
var divIllustrations = document.getElementById("illustrationsList");
var divLinks = document.getElementById("linksList");
var divMain = document.getElementById("main-content");
var divMessage = document.getElementById("message");
var divQuestionnaires = document.getElementById("questionnairesList");
var divQuestions = document.getElementById("questionsList");
var divResponse = document.getElementById("response");
var divSearchResult = document.getElementById("searchResult");
var formLink = document.getElementById("links");
var formIllustration = document.getElementById("illustrations");
var formQuestion = document.getElementById("questions");
var formQuestionnaire = document.getElementById("questionnaires");
var formSearch = document.getElementById("search");
var helpClassification = document.getElementById("helpClassification");
var helpGroup = document.getElementById("helpGroup");
var helpPublishingAt = document.getElementById("helpPublishingAt");
var inputClassification = document.getElementById("classification");
var inputGroup = document.getElementById("group");
var inputRankInGroup = document.getElementById("rankInGroup"); // Vide et cache tous les formulaires annexes au questionnaire :
var hideAllForms = function hideAllForms() {
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formLink);
if (defaultValueForLink != 0) document.getElementById("anchor").value = defaultValueForLink;
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formIllustration);
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["empyAndHideForm"])(formQuestion);
}; // Affiche les données d'un lien dans le formulaire adhoc :
var showFormLinkInfos = function showFormLinkInfos(Link) {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formLink.style.display = "block"; // + Les contraintes de champ & valeurs par défaut :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configLinks.Link, formLink);
for (var data in Link) {
if (formLink.elements[data] !== undefined) formLink.elements[data].value = Link[data];
}
}; // Affiche les infos connues concernant les liens du questionnaire affiché :
var showLinkInfos = function showLinkInfos(Links, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "h2", introTitleForLink);
var listLinks = "";
for (var i in Links) {
listLinks += "<li><a href='" + Links[i].url + "' target='_blank'>" + Links[i].anchor + "</a><br><a href='#updateLink" + Links[i].id + "' id='#updateLink" + Links[i].id + "' class='button' >" + updateBtnTxt + "</a> <a href='#deleteLink" + Links[i].id + "' id='#deleteLink" + Links[i].id + "' class='button' >" + deleteBtnTxt + "</a></li>";
}
if (listLinks === "") listLinks = "<li>" + introNoLink + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "ul", listLinks, "", [], "", false); // ! à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
var _loop = function _loop(_i) {
document.getElementById("#updateLink" + Links[_i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[_i]);
window.location.assign("#links");
});
document.getElementById("#deleteLink" + Links[_i].id).addEventListener("click", function (e) {
e.preventDefault();
showFormLinkInfos(Links[_i]);
formLink.elements["deleteOk"].value = true;
sendLinkForm(token);
});
};
for (var _i in Links) {
_loop(_i);
}
if (Links.length < config.nbLinksMax || config.nbLinksMax === 0) {
var newBtn = "<a href='#newLink' id='newLink' class='button'>" + addLinkTxt + "</a>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "p", newBtn, "", [], {}, false);
document.getElementById("newLink").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formLink.style.display = "block";
formLink.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#links");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configLinks, formLink);
});
}
}; // Envoi des données d'un lien.
var sendLinkForm = function sendLinkForm(token) {
var divResponseLink = document.getElementById("responseLink");
divResponseLink.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formLink);
var xhrLinkDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrLinkDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configLinks.linksRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrLinkDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configLinks.linksRoute + datas.id);else xhrLinkDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configLinks.linksRoute);
xhrLinkDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showLinkInfos(response.questionnaire.Links, token); // le serveur retourne une version actualisée de la liste des liens
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divLinks, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#linksList");
showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseLink, "p", serverError, "", ["error"]);
}
};
xhrLinkDatas.setRequestHeader("Content-Type", "application/json");
xhrLinkDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrLinkDatas.send(JSON.stringify(datas));
}; // Affiche les données d'une illustration dans le formulaire adhoc :
var showFormIllustrationInfos = function showFormIllustrationInfos(Illustration) {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formIllustration.style.display = "block"; // + Les contraintes de champ & valeurs par défaut
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configIllustrations.Illustration, formIllustration); // Mais le champ file n'est plus requis, quand un fichier existe déjà
formIllustration.elements["image"].removeAttribute("required");
for (var data in Illustration) {
if (formIllustration.elements[data] !== undefined) formIllustration.elements[data].value = Illustration[data];
}
}; // Affiche les infos connues concernant les illustrations du questionnaire affiché :
var showIllustrationInfos = function showIllustrationInfos(Illustrations, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "h2", introTitleForIllustration);
var listIllustrations = "";
for (var i in Illustrations) {
listIllustrations += "<li><a href='" + configTemplate.illustrationDir + Illustrations[i].url + "' target='_blank'><img src='" + configTemplate.illustrationDir + Illustrations[i].url + "' alt='" + defaultAlt + "' style='max-height:150px'></a><br><a href='#updateIllustration" + Illustrations[i].id + "' id='#updateIllustration" + Illustrations[i].id + "' class='button'>" + updateBtnTxt + "</a> <a href='#deleteIllustration" + Illustrations[i].id + "' id='#deleteIllustration" + Illustrations[i].id + "' class='button'>" + deleteBtnTxt + "</a></li>";
}
if (listIllustrations === "") listIllustrations = "<li>" + introNoIllustration + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "ul", listIllustrations, "", [], "", false); // ! à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
var _loop2 = function _loop2(_i2) {
document.getElementById("#updateIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
window.location.assign("#illustrations");
});
document.getElementById("#deleteIllustration" + Illustrations[_i2].id).addEventListener("click", function (e) {
e.preventDefault();
showFormIllustrationInfos(Illustrations[_i2]);
formIllustration.elements["deleteOk"].value = true;
sendIllustrationForm(token);
});
};
for (var _i2 in Illustrations) {
_loop2(_i2);
}
if (Illustrations.length < config.nbIllustrationsMax || config.nbIllustrationsMax === 0) {
var newBtn = "<a href='#newIllustration' id='newIllustration' class='button'>" + addIllustrationTxt + "</a>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "p", newBtn, "", [], {}, false);
document.getElementById("newIllustration").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formIllustration.style.display = "block";
formIllustration.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
window.location.assign("#illustrations");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configIllustrations, formIllustration);
});
}
}; // Envoi des données d'une illustration.
var sendIllustrationForm = function sendIllustrationForm(token) {
var divResponseIllustration = document.getElementById("responseIllustration");
divResponseIllustration.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formIllustration);
var datasWithFiles = new FormData(formIllustration); // car il me manque les informations du fichier avec la fonction getDatasFromInputs
var xhrIllustrationDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrIllustrationDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configIllustrations.illustrationsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrIllustrationDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configIllustrations.illustrationsRoute + datas.id);else xhrIllustrationDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configIllustrations.illustrationsRoute);
xhrIllustrationDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showIllustrationInfos(response.questionnaire.Illustrations, token); // le serveur retourne une version actualisée de la liste des liens
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divIllustrations, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#illustrationsList");
showNextQuestionnaires(token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseIllustration, "p", serverError, "", ["error"]);
}
};
xhrIllustrationDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrIllustrationDatas.send(datasWithFiles);
}; // Affiche les données d'une question + ses réponses possibles dans le formulaire adhoc
var showFormQuestionInfos = function showFormQuestionInfos(Question) {
// On commence par cacher et vider tous les formulaires annexes
hideAllForms(); // Puis on affiche celui concerné
formQuestion.style.display = "block";
for (var data in Question.Question) {
if (formQuestion.elements[data] !== undefined) formQuestion.elements[data].value = Question.Question[data];
} // + Les contraintes de champ & les valeurs par défaut
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires.Question, formQuestion);
for (var _data in Question.Choices) {
if (formQuestion.elements["choiceText" + _data] !== undefined) {
formQuestion.elements["choiceText" + _data].value = Question.Choices[_data].text;
if (Question.Choices[_data].isCorrect == true) formQuestion.elements["choiceIsCorrect" + _data].checked = true;
formQuestion.elements["idChoice" + _data].value = Question.Choices[_data].id;
}
}
}; // Affiche les infos des questions du quiz affiché :
var showQuestionInfos = function showQuestionInfos(Questions, token) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "h2", introTitleForQuestion);
var listQuestions = "";
for (var i in Questions) {
listQuestions += "<li>" + Questions[i].Question.rank + " - " + Questions[i].Question.text + "<br><a href='#updateQuestion" + Questions[i].Question.id + "' id='#updateQuestion" + Questions[i].Question.id + "' class='button'>" + updateBtnTxt + "</a> <a href='#deleteQuestion" + Questions[i].Question.id + "' id='#deleteQuestion" + Questions[i].Question.id + "' class='button'>" + deleteBtnTxt + "</a></li>";
}
if (listQuestions === "") listQuestions = "<li>" + introNoQuestion + "</li>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "ul", listQuestions, "", [], "", false); // à intégrer d'abord dans le DOM pour pouvoir ajouter les Listeners ensuite
var _loop3 = function _loop3(_i3) {
document.getElementById("#updateQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
window.location.assign("#questions");
});
document.getElementById("#deleteQuestion" + Questions[_i3].Question.id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionInfos(Questions[_i3]);
formQuestion.elements["deleteOk"].value = true;
sendQuestionForm(token);
});
};
for (var _i3 in Questions) {
_loop3(_i3);
}
if (Questions.length < config.nbQuestionsMax || config.nbQuestionsMax === 0) {
var newBtn = "<a href='#newQuestion' id='newQuestion' class='button'>" + addQuestionTxt + "</a>";
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "p", newBtn, "", [], {}, false);
document.getElementById("newQuestion").addEventListener("click", function (e) {
e.preventDefault();
hideAllForms();
formQuestion.style.display = "block";
formQuestion.elements["QuestionnaireId"].value = formQuestionnaire.elements["id"].value;
formQuestion.elements["rank"].value = Questions.length === 0 ? configQuestionnaires.Question.rank.defaultValue : Questions.length + 1;
window.location.assign("#questions");
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires.Question, formQuestion);
});
}
}; // Envoi des données d'une question et de ses réponse. Peut être généré par le bouton submit ou par le lien "supprimer".
var sendQuestionForm = function sendQuestionForm(token) {
var divResponseQuestion = document.getElementById("responseQuestion");
divResponseQuestion.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestion);
var xhrQuestionDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.deleteOk)) xhrQuestionDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionsRoute + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionsRoute + datas.id); // mise à jour d'une question
else xhrQuestionDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionsRoute); // nouvelle question
xhrQuestionDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if ((this.status === 200 || this.status === 201) && response.message != undefined && response.questionnaire != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
showQuestionInfos(response.questionnaire.Questions, token); // le serveur me retourne une version actualisée de la liste des questions
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestions, "p", response.message, "", ["success"], "", false);
hideAllForms();
window.location.assign("#questionsList");
showNextQuestionnaires(token); // car peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponseQuestion, "p", serverError, "", ["error"]);
}
};
xhrQuestionDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionDatas.setRequestHeader("Authorization", "Bearer " + token);
xhrQuestionDatas.send(JSON.stringify(datas));
}; // Affichant les infos connues concernant un questionnaire et ses dépendances
var showFormQuestionnaireInfos = function showFormQuestionnaireInfos(id, token) {
var xhrGetInfos = new XMLHttpRequest();
xhrGetInfos.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getQuestionnaireRoutes + "/" + id);
xhrGetInfos.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && response.Questionnaire != undefined) {
formQuestionnaire.reset(); // pour ne pas garder les données déjà affichées si vide dans ce qui est retourné
for (var data in response.Questionnaire) {
if (formQuestionnaire.elements[data] !== undefined) {
if (data === "publishingAt" && response.Questionnaire[data] !== null) formQuestionnaire.elements[data].value = Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.Questionnaire[data], "form"); // !! revoir car format pouvant poser soucis si navigateur ne gère pas les champs de type "date"
else formQuestionnaire.elements[data].value = response.Questionnaire[data];
}
}
deleteCheckBox.style.display = "block";
} // ajouter gestion des retours en erreur ?
if (response.Tags != undefined) {
var classification = "";
for (var i in response.Tags) {
if (i == 0) classification += response.Tags[i].name;else classification += "," + response.Tags[i].name;
}
formQuestionnaire.elements["classification"].value = classification;
}
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response.Group)) formQuestionnaire.elements["group"].value = response.Group.Group.title + " (" + response.Group.Group.id + ")";
divLinks.style.display = "block";
divQuestions.style.display = "block";
divIllustrations.style.display = "block";
if (response.Links != undefined) showLinkInfos(response.Links, token);
if (response.Questions != undefined) showQuestionInfos(response.Questions, token);
if (response.Illustrations != undefined) showIllustrationInfos(response.Illustrations, token);
helpPublishingAt.style.display = "none"; // info uniquement utile pour "placer" un nouveau quiz
// à revoir : remplacer lien pour un bouton + reset complet du formulaire, y compris champs hidden :
btnNewQuestionnaire.style.display = "block";
btnNewQuestionnaire.setAttribute("href", configTemplate.questionnairesManagementPage);
btnPreviewQuestionnaire.style.display = "block";
if (response.Questionnaire["isPublished"] === false) btnPreviewQuestionnaire.setAttribute("href", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + configQuestionnaires.previewQuestionnaireRoutes + "/" + id + "/" + token);else btnPreviewQuestionnaire.setAttribute("href", config.siteUrl + configQuestionnaires.publishedQuestionnaireRoutes + response.Questionnaire["slug"] + ".html");
}
};
xhrGetInfos.send();
}; // Affiche les questionnaires bientôt publiés.
var showNextQuestionnaires = function showNextQuestionnaires(token) {
var xhrNextQuestionnaires = new XMLHttpRequest();
xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + configQuestionnaires.getListNextQuestionnaires);
xhrNextQuestionnaires.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response.questionnaires)) {
var listHTML = "",
dayStr,
optionsDayStr = {
weekday: 'long'
};
for (var i in response.questionnaires) {
dayStr = new Intl.DateTimeFormat(lang, optionsDayStr).format(new Date(response.questionnaires[i].datePublishing));
listHTML += "<li>" + dayStr + " " + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(response.questionnaires[i].datePublishing, "fr") + ": <a href='" + configTemplate.questionnairesManagementPage + "?id=" + response.questionnaires[i].id + "' id='questionnaire_" + response.questionnaires[i].id + "'>" + response.questionnaires[i].title + "</a>";
if (response.questionnaires[i].isPublishable === false) listHTML += " <span class='error'>(" + questionnaireNeedBeCompleted + ")</li>";
listHTML += "</li>";
}
if (response.questionnaires.length !== 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "h3", nextQuestionnairesList.replace("#NB", response.questionnaires.length));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpPublishingAt, "em", nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["dateFormat"])(new Date(response.dateNeeded), "fr"));
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false);
for (var _i4 in response.questionnaires) {
document.getElementById("questionnaire_" + response.questionnaires[_i4].id).addEventListener("click", function (e) {
e.preventDefault();
showFormQuestionnaireInfos(e.target.id.split("_")[1], token);
window.location.assign("#questionnaires");
});
}
} // ajouter gestion erreurs reçues du serveur ?
}
};
xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + token);
xhrNextQuestionnaires.send();
};
var initialise = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var isConnected, user, urlDatas;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return Object(_tools_users_js__WEBPACK_IMPORTED_MODULE_7__["checkSession"])(["manager", "admin"], "/" + configTemplate.connectionPage, {
message: needBeConnected,
color: "error"
}, window.location);
case 3:
isConnected = _context.sent;
if (isConnected) {
divMain.style.display = "block";
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message"))) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("message", true).color], "", false);
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["removeLocaly"])("message");
}
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_1__["getLocaly"])("user", true); // Mise à jour du lien "compte" du header :
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["updateAccountLink"])(user.status, configTemplate); // Initialisation des formulaires :
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires, formSearch);
Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["setAttributesToInputs"])(configQuestionnaires.Questionnaire, formQuestionnaire); // Vide/cache les éléments inutiles en mode création :
btnPreviewQuestionnaire.style.display = "none";
deleteCheckBox.style.display = "none";
hideAllForms(); // Si un id est passé par l'url, on essaye d'afficher le questionnaire :
urlDatas = Object(_tools_url_js__WEBPACK_IMPORTED_MODULE_6__["getUrlParams"])();
if (urlDatas && urlDatas.id !== undefined) showFormQuestionnaireInfos(urlDatas.id, user.token); // les prochaines publications :
showNextQuestionnaires(user.token); // Lancement d'une recherche :
formSearch.addEventListener("submit", function (e) {
e.preventDefault();
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formSearch);
var xhrSearch = new XMLHttpRequest();
xhrSearch.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + configQuestionnaires.searchAdminQuestionnairesRoute);
xhrSearch.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
if (response.length === 0) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", searchQuestionnaireWithNoResult, "", ["info"]);else {
var selectHTML = "<option value=''></option>";
for (var i in response) {
selectHTML += "<option value='" + response[i].id + "'>" + response[i].title + "</option>";
}
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "select", selectHTML, "selectSearch");
var searchSelect = document.getElementById("selectSearch");
searchSelect.addEventListener("change", function () {
if (searchSelect.value !== "") showFormQuestionnaireInfos(searchSelect.value, user.token);
});
}
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divSearchResult, "p", serverError, "", ["error"]);
}
};
xhrSearch.setRequestHeader("Content-Type", "application/json");
xhrSearch.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrSearch.send(JSON.stringify(datas));
}); // Aide à la saisie pour le classement du quiz
inputClassification.addEventListener("input", function (e) {
divResponse.innerHTML = "";
var tags = inputClassification.value.split(",");
tags.reverse();
var lastTag = tags[0].trim();
if (lastTag.length >= 2) {
var xhrSearchTags = new XMLHttpRequest();
xhrSearchTags.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + configQuestionnaires.tagsSearchRoute);
xhrSearchTags.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 200 && Array.isArray(response)) {
helpClassification.innerHTML = "";
for (var i in response) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpClassification, "a", response[i].name, "#tag" + response[i].id, ["info"], {
href: "#tag" + response[i].id
}, false);
document.getElementById("#tag" + response[i].id).addEventListener("click", function (e) {
e.preventDefault();
tags[0] = e.target.innerHTML;
tags.reverse();
inputClassification.value = tags.join(",");
helpClassification.innerHTML = "";
});
}
}
}
};
xhrSearchTags.setRequestHeader("Content-Type", "application/json");
xhrSearchTags.setRequestHeader("Authorization", "Bearer " + user.token);
xhrSearchTags.send(JSON.stringify({
search: lastTag
}));
}
}); // Aide à la sélection d'un groupe pour le quiz
inputGroup.addEventListener("input", function (e) {
formQuestionnaire["GroupId"].value = "";
var groupInput = inputGroup.value.trim();
if (groupInput.length >= configQuestionnaires.searchGroups.minlength) {
var xhrSearchGroups = new XMLHttpRequest();
xhrSearchGroups.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.groupRoutes + configQuestionnaires.searchGroupsRoute);
xhrSearchGroups.onreadystatechange = function () {
var _this = this;
if (this.readyState == XMLHttpRequest.DONE) {
(function () {
var response = JSON.parse(_this.responseText);
if (_this.status === 200 && Array.isArray(response)) {
helpGroup.innerHTML = "";
var _loop4 = function _loop4(i) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(helpGroup, "a", response[i].title, "#group" + response[i].id, ["info"], {
href: "#group" + response[i].id
}, false);
document.getElementById("#group" + response[i].id).addEventListener("click", function (e) {
e.preventDefault();
inputGroup.value = response[i].title + " (" + response[i].id + ")";
formQuestionnaire["GroupId"].value = response[i].id;
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(response[i].maxRank)) inputRankInGroup.value = response[i].maxRank + 1;else inputRankInGroup.value = 1;
helpGroup.innerHTML = "";
});
};
for (var i in response) {
_loop4(i);
}
}
})();
}
};
xhrSearchGroups.setRequestHeader("Content-Type", "application/json");
xhrSearchGroups.setRequestHeader("Authorization", "Bearer " + user.token);
xhrSearchGroups.send(JSON.stringify({
searchGroups: groupInput
}));
}
}); // Traitement de l'envoi du formulaire des infos de base du quiz
formQuestionnaire.addEventListener("submit", function (e) {
e.preventDefault();
divResponse.innerHTML = "";
var datas = Object(_tools_forms_js__WEBPACK_IMPORTED_MODULE_4__["getDatasFromInputs"])(formQuestionnaire);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.rankInGroup) && Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.GroupId)) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", needGroupIfRank, "", ["error"]);else {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.rankInGroup) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.GroupId)) datas.rankInGroup = 1;
var xhrQuestionnaireDatas = new XMLHttpRequest();
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id) && datas.deleteOk !== undefined) xhrQuestionnaireDatas.open("DELETE", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + "/" + datas.id);else if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_5__["isEmpty"])(datas.id)) xhrQuestionnaireDatas.open("PUT", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + "/" + datas.id);else xhrQuestionnaireDatas.open("POST", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + configQuestionnaires.questionnaireRoutes + "/");
xhrQuestionnaireDatas.onreadystatechange = function () {
if (this.readyState == XMLHttpRequest.DONE) {
var response = JSON.parse(this.responseText);
if (this.status === 201 && response.id != undefined) {
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", addOkMessage, "", ["success"]);
datas.id = response.id;
showNextQuestionnaires(user.token); // peut avoir évolué suivant ce qui s'est passé
} else if (this.status === 200 && response.message != undefined) {
if (Array.isArray(response.message)) response.message = response.message.join("<br>");else response.message = response.message;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.message, "", ["success"]);
showNextQuestionnaires(user.token); // peut avoir évolué suivant ce qui s'est passé
} else if (response.errors) {
if (Array.isArray(response.errors)) response.errors = response.errors.join("<br>");else response.errors = serverError;
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", response.errors, "", ["error"]);
} else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divResponse, "p", serverError, "", ["error"]);
if (datas.deleteOk === undefined && response.errors === undefined) showFormQuestionnaireInfos(datas.id, user.token); // on actualise les données
else if (response.errors === undefined) {
formQuestionnaire.reset();
divLinks.innerHTML = "";
divIllustrations.innerHTML = "";
divQuestions.innerHTML = "";
}
}
};
xhrQuestionnaireDatas.setRequestHeader("Content-Type", "application/json");
xhrQuestionnaireDatas.setRequestHeader("Authorization", "Bearer " + user.token);
if (datas) xhrQuestionnaireDatas.send(JSON.stringify(datas));
}
});
formLink.addEventListener("submit", function (e) {
e.preventDefault();
sendLinkForm(user.token);
});
formIllustration.addEventListener("submit", function (e) {
e.preventDefault();
sendIllustrationForm(user.token);
});
formQuestion.addEventListener("submit", function (e) {
e.preventDefault();
sendQuestionForm(user.token);
});
}
_context.next = 11;
break;
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](0);
console.error(_context.t0);
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_2__["addElement"])(divCrash, "p", serverError, "", ["error"]);
case 11:
case "end":
return _context.stop();
}
}
}, _callee, null, [[0, 7]]);
}));
return function initialise() {
return _ref.apply(this, arguments);
};
}();
initialise();
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_3__["helloDev"])();
/***/ }),
/***/ "./src/tools/clientstorage.js":
/*!************************************!*\
!*** ./src/tools/clientstorage.js ***!
\************************************/
/*! exports provided: saveLocaly, getLocaly, removeLocaly */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveLocaly", function() { return saveLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLocaly", function() { return getLocaly; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLocaly", function() { return removeLocaly; });
// FONCTIONS UTILES AU STOCKAGE LOCAL (SESSION, COOKIES, INDEXDB, ETC.)
// Revenir pour gérer le cas où local.storage n'est pas connu pour utiliser cookie
var saveLocaly = function saveLocaly(name, data) {
localStorage.setItem(name, JSON.stringify(data));
};
var getLocaly = function getLocaly(name) {
var json = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (json) return JSON.parse(localStorage.getItem(name));else return localStorage.getItem(name);
};
var removeLocaly = function removeLocaly(name) {
localStorage.removeItem(name);
};
/***/ }),
/***/ "./src/tools/dom.js":
/*!**************************!*\
!*** ./src/tools/dom.js ***!
\**************************/
/*! exports provided: addElement */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addElement", function() { return addElement; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
// Fonction associant les attributs fournis à un champ de formulaire
var addElement = function addElement(eltParent, eltType) {
var eltContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
var eltId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";
var eltClass = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
var eltAttributes = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
var replace = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltType) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltParent)) return false;else {
var newElement = document.createElement(eltType);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltId)) // tester si l'id n'est pas déjà utilisé dans le DOM ?
newElement.id = eltId;
if (Array.isArray(eltClass) && eltClass.length != 0) {
for (var i in eltClass) {
newElement.classList.add(eltClass[i]);
}
}
if (_typeof(eltAttributes) === "object") // !! tous les objets ne sont pas ok
{
for (var attributName in eltAttributes) {
newElement.setAttribute(attributName, eltAttributes[attributName]);
}
}
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(eltContent)) newElement.innerHTML = eltContent.replace(/\n/g, "<br>"); // innerHTML permet d'ajouter du texte ayant lui-même des balises, etc.
if (replace) eltParent.innerHTML = "";
eltParent.appendChild(newElement);
}
};
/***/ }),
/***/ "./src/tools/everywhere.js":
/*!*********************************!*\
!*** ./src/tools/everywhere.js ***!
\*********************************/
/*! exports provided: helloDev, updateAccountLink */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "helloDev", function() { return helloDev; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccountLink", function() { return updateAccountLink; });
// Ce script fournit des fonctions utilisées sur toutes les pages du site
var helloDev = function helloDev() {
console.log("**** Hello ami développeur :-)\n\nLe code de WikiLerni est libre et vous pouvez le trouver si Gitlab :\nhttps://gitlab.com/lefablab/wikilerni\n\nPour les suggestions d'amélioration ou questions : dev@wililerni.com ****");
return true;
};
var updateAccountLink = function updateAccountLink(status, configTemplate) {
var link = document.getElementById("accountHeadLink");
var homePage = status + "HomePage";
link.href = "/" + configTemplate[homePage];
};
/***/ }),
/***/ "./src/tools/forms.js":
/*!****************************!*\
!*** ./src/tools/forms.js ***!
\****************************/
/*! exports provided: setAttributesToInputs, getDatasFromInputs, empyForm, empyAndHideForm */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAttributesToInputs", function() { return setAttributesToInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDatasFromInputs", function() { return getDatasFromInputs; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyForm", function() { return empyForm; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empyAndHideForm", function() { return empyAndHideForm; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
// Fonction associant les attributs fournis à un champ de formulaire
var setAttributesToInputs = function setAttributesToInputs(inputsConf, myForm) {
for (var i in myForm.elements) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(myForm.elements[i].id)) {
var idInput = myForm.elements[i].id;
if (inputsConf[idInput] !== undefined) {
var inputHTML = document.getElementById(idInput);
for (var attribute in inputsConf[idInput]) {
inputHTML.setAttribute(attribute, inputsConf[idInput][attribute]);
}
}
}
}
return true;
}; // Récupère toutes les valeurs de champs en omettant les checkbox non cochées, etc.
var getDatasFromInputs = function getDatasFromInputs(myForm) {
var datas = {};
var formData = new FormData(myForm);
var _iterator = _createForOfIteratorHelper(formData.entries()),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var entrie = _step.value;
datas[entrie[0]] = entrie[1];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return datas;
}; // Vide tous les champs d'un formulaire, y compris hidden, checkbox, etc.
// Revoir pour les select
var empyForm = function empyForm(myForm) {
var formData = new FormData(myForm);
var _iterator2 = _createForOfIteratorHelper(formData.entries()),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var entrie = _step2.value;
if (myForm.elements[entrie[0]].type == "checkbox" || myForm.elements[entrie[0]].type == "radio") myForm.elements[entrie[0]].checked = false;else myForm.elements[entrie[0]].value = "";
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return true;
}; // Vide et cache le formulaire
var empyAndHideForm = function empyAndHideForm(myForm) {
empyForm(myForm);
myForm.style.display = "none";
};
/***/ }),
/***/ "./src/tools/url.js":
/*!**************************!*\
!*** ./src/tools/url.js ***!
\**************************/
/*! exports provided: getUrlParams */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrlParams", function() { return getUrlParams; });
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_0__);
// Fonction récupérant les paramètres passés par l'url
var getUrlParams = function getUrlParams() {
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_0__["isEmpty"])(location.search)) return false;
var parameters = location.search.substring(1).split("&");
if (!Array.isArray(parameters) || parameters.length === 0) return false;
var param,
datas = {};
for (var i in parameters) {
param = parameters[i].split("=");
if (param.length === 2) datas[param[0]] = decodeURI(param[1]);
}
return datas;
};
/***/ }),
/***/ "./src/tools/users.js":
/*!****************************!*\
!*** ./src/tools/users.js ***!
\****************************/
/*! exports provided: getTimeDifference, setSession, checkAnswerDatas, checkSession */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTimeDifference", function() { return getTimeDifference; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSession", function() { return setSession; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkAnswerDatas", function() { return checkAnswerDatas; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkSession", function() { return checkSession; });
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../config/instance.js */ "../config/instance.js");
/* harmony import */ var _config_instance_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_config_instance_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../config/users.js */ "../config/users.js");
/* harmony import */ var _config_users_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_config_users_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _clientstorage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clientstorage.js */ "./src/tools/clientstorage.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../tools/main */ "../tools/main.js");
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_3__);
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
var lang = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0];
var configTemplate = __webpack_require__("../views sync recursive ^\\.\\/.*\\.js$")("./" + _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["theme"] + "/config/" + lang + ".js");
var getTimeDifference = function getTimeDifference() {
// multiplier par -1, car c'est ce qu'il faut "ajouter" à l'heure UTC pour revenir en heure locale qui m'intéresse et non l'inverse
var timeLocal = new Date().getTimezoneOffset() * -1;
if (timeLocal > _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMax"] || timeLocal < _config_users_js__WEBPACK_IMPORTED_MODULE_1__["timeDifferenceMin"]) return 0;else return timeLocal;
}; // J'utilise le stockage local du navigateur pour enregistrer les données permettant de reconnaître l'utilisateur par la suite
// Seul le serveur pourra vérifier que les identifiants sont (toujours) valides.
var setSession = function setSession(userId, token, durationTS) {
var storageUser = {
id: userId,
token: token,
duration: durationTS
};
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", storageUser);
}; // Vérifie qu'il y a des données locales concernant le résultat d'un quiz ou d'un groupe de quizs
// Et les ajoute aux données envoyées par les formulaires d'inscription/connexion si c'est le cas
var checkAnswerDatas = function checkAnswerDatas(datas) {
var lastAnswer = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("lastAnswer");
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(lastAnswer)) {
var answer = JSON.parse(lastAnswer);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.duration) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbCorrectAnswers) && !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.nbQuestions) && (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId) || !Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.GroupId))) {
datas.duration = answer.duration;
datas.nbCorrectAnswers = answer.nbCorrectAnswers;
datas.nbQuestions = answer.nbQuestions;
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(answer.QuestionnaireId)) datas.QuestionnaireId = answer.QuestionnaireId;else datas.GroupId = answer.GroupId;
}
}
return datas;
}; // Cette fonction teste la connexion de l'utilisateur d'une page
// On peut fournis une liste de statuts acceptés (si vide = tous), ainsi qu'une url de redirection si non connecté, un message d'erreur à afficher sur la page de destination et l'url sur laquelle revenir une fois connecté
var checkSession = /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var status,
urlRedirection,
message,
urlWanted,
_args = arguments;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
status = _args.length > 0 && _args[0] !== undefined ? _args[0] : [];
urlRedirection = _args.length > 1 ? _args[1] : undefined;
message = _args.length > 2 ? _args[2] : undefined;
urlWanted = _args.length > 3 ? _args[3] : undefined;
return _context.abrupt("return", new Promise(function (resolve, reject) {
var userDatas = Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["getLocaly"])("user");
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(userDatas)) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var user = JSON.parse(userDatas);
if (Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.id) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.token) || Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(user.duration) || user.duration < Date.now()) {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else {
var xhr = new XMLHttpRequest();
xhr.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["userRoutes"] + _config_users_js__WEBPACK_IMPORTED_MODULE_1__["checkLoginRoute"] + user.token);
xhr.onload = function () {
var response = JSON.parse(xhr.responseText);
if (xhr.status === 200 && response.isValid && response.id != undefined) {
if (response.id === user.id) {
user.name = response.name;
user.language = response.language;
user.timeDifference = response.timeDifference;
user.status = response.status; // c'est le token qui sert à vérifier le statut à chaque requête à l'API
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("user", user); // si il s'agit d'un "user" et que son abonnement a expiré, je le redirige vers la caisse :-)
if (response.status === "user" && response.nbDaysOk <= 0) {
var urlAccount = _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["siteUrl"] + "/" + configTemplate.accountPage;
if (window.location.href.indexOf(urlAccount) === -1) window.location.assign("/" + configTemplate.accountPage + "#subscribe"); // passée directement ici, l'ancre #subscribe ne fonctionne pas !?
resolve(true);
} else {
if (status.length !== 0 && status.indexOf(response.status) === -1) {
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
} else resolve(true);
}
} else {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
} else {
Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["removeLocaly"])("user");
redirectUser(urlRedirection, message, urlWanted);
resolve(false);
}
};
xhr.onerror = function () {
return reject(xhr.statusText);
};
xhr.send();
}
}
}));
case 5:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function checkSession() {
return _ref.apply(this, arguments);
};
}(); // Cette fonction sert à la précédente en cas de connexion non valide
var redirectUser = function redirectUser(urlRedirection, message, urlWanted) {
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(message)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("message", message);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlWanted)) Object(_clientstorage_js__WEBPACK_IMPORTED_MODULE_2__["saveLocaly"])("url", urlWanted);
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_3__["isEmpty"])(urlRedirection)) window.location.assign(urlRedirection);
};
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbGx1c3RyYXRpb25zLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvaW5zdGFuY2UuanMiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9saW5rcy5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL2lsbHVzdHJhdGlvbiQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9saW5rJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9uJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9pbGx1c3RyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvbGluay5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFuYWdlUXVlc3Rpb25uYWlyZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZm9ybXMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL3VybC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsiaW5zdGFuY2UiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsImlsbHVzdHJhdGlvbnNSb3V0ZSIsIklsbHVzdHJhdGlvbiIsImFsdCIsIm1heGxlbmd0aCIsInRpdGxlIiwiY2FwdGlvbiIsImltYWdlIiwicmVxdWlyZWQiLCJhY2NlcHQiLCJtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb24iLCJqb2luIiwiZGlySWxsdXN0cmF0aW9uc1RtcCIsImRpcklsbHVzdHJhdGlvbnMiLCJ1c2VycyIsInF1ZXN0aW9ubmFpcmVzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZXMiLCJkaXJXZWJRdWVzdGlvbm5haXJlcyIsImxpbmtzUm91dGUiLCJMaW5rIiwidXJsIiwiYW5jaG9yIiwicXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMiLCJnZXRRdWVzdGlvbm5haXJlUm91dGVzIiwiZ2V0UmFuZG9tUXVlc3Rpb25uYWlyZXNSb3V0ZSIsImdldFN0YXRzUXVlc3Rpb25uYWlyZXMiLCJwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlcyIsInB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJyZWdlbmVyYXRlSFRNTCIsInNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzUm91dGUiLCJncm91cFJvdXRlcyIsImdldEdyb3VwUm91dGUiLCJwcmV2aWV3R3JvdXBSb3V0ZXMiLCJzZWFyY2hHcm91cHNSb3V0ZSIsInF1ZXN0aW9uc1JvdXRlIiwidGFnc1NlYXJjaFJvdXRlIiwiZ2V0QWRtaW5TdGF0cyIsImdldFByZXZpb3VzQW5zd2VycyIsImdldFN0YXRzQW5zd2VycyIsInNhdmVBbnN3ZXJzUm91dGUiLCJRdWVzdGlvbm5haXJlIiwic2x1ZyIsImludHJvZHVjdGlvbiIsInNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiR3JvdXAiLCJRdWVzdGlvbiIsInRleHQiLCJyYW5rIiwibWluIiwiZGVmYXVsdFZhbHVlIiwiQ2hvaWNlIiwic2VhcmNoIiwic2VhcmNoR3JvdXBzIiwiZGlyQ2FjaGVHcm91cHMiLCJkaXJDYWNoZVRhZ3MiLCJkaXJIVE1MR3JvdXBzIiwiZGlySFRNTE5ld3MiLCJkaXJIVE1MVGFncyIsImRpcldlYkdyb3VwcyIsImRpcldlYk5ld3MiLCJkaXJXZWJUYWdzIiwibmJSYW5kb21SZXN1bHRzIiwibmJUYWdzTWluIiwibmJUYWdzTWF4IiwidXNlclJvdXRlcyIsImNoZWNrRGVsZXRlTGlua1JvdXRlIiwiY2hlY2tJZklzRW1haWxmcmVlUm91dGUiLCJjaGVja0xvZ2luUm91dGUiLCJjaGVja05ld0xvZ2luTGlua1JvdXRlIiwiY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlIiwiY29ubmVjdGlvblJvdXRlIiwiY29ubmVjdGlvbldpdGhMaW5rUm91dGUiLCJjcmVhdGVVc2VyUm91dGUiLCJnZXRHb2RDaGlsZHMiLCJnZXRHb2RmYXRoZXJSb3V0ZSIsImdldExvZ2luTGlua1JvdXRlIiwiZ2V0UGF5bWVudHMiLCJnZXRVc2VySW5mb3MiLCJnZXRVc2Vyc1F1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hVc2VyUm91dGUiLCJzaWdudXBDb21wbGV0aW9uUm91dGUiLCJzdWJzY3JpYmVSb3V0ZSIsInVuc3Vic2NyaWJlUm91dGUiLCJ1cGRhdGVVc2VySW5mb3MiLCJ2YWxpZGF0ZVVzZXJSb3V0ZSIsIm5hbWUiLCJlbWFpbCIsIm5ld1Bhc3N3b3JkIiwiY29kZUdvZGZhdGhlciIsImNndU9rIiwidmFsdWUiLCJ0aW1lRGlmZmVyZW5jZU1pbiIsInRpbWVEaWZmZXJlbmNlTWF4IiwiZGlyQ2FjaGVVc2Vyc1dpdGhvdXRBbnN3ZXJzIiwiYWRkQnRuVHh0IiwiYWRkT2tNZXNzYWdlIiwiYWxlcnROZXdXaW5kb3ciLCJiYWRVcmwiLCJidG5MaW5rVG9RdWVzdGlvbm5haXJlIiwiYnRuUHJvcG9zZUNvbm5lY3Rpb24iLCJidG5Qcm9wb3NlU3Vic2NyaWJlIiwiYnRuU2hvd09uV2ViU2l0ZSIsImRlbGV0ZUJ0blR4dCIsImRlbGV0ZUZhaWxNZXNzYWdlIiwiZGVsZXRlT2tNZXNzYWdlIiwiZmFpbEF1dGgiLCJmYWlsQXV0aENyb24iLCJmYWlsQXV0aEhlYWRlciIsImZhaWxBdXRoSWQiLCJmYWlsQXV0aFRva2VuIiwibmVlZGVkUGFyYW1zIiwibmV4dFBhZ2UiLCJub3RBbGxvd2VkIiwibm90UmVxdWlyZWQiLCJub3RWYWxpZEZvcm1hdCIsInByZXZpb3VzUGFnZSIsInNlcnZlckVycm9yIiwic2VydmVyRXJyb3JBZG1pbiIsInNpdGVIVE1MVGl0bGUiLCJzaXRlTWV0YURlc2NyaXB0aW9uIiwic2NyaXB0VGltaW5nQWxlcnQiLCJzY3JpcHRUaW1pbmdJbmZvIiwic3RhdHNBZG1pbiIsInN1YnNjcmlwdGlvbkNhbGwiLCJ1cGRhdGVCdG5UeHQiLCJ1cGRhdGVPa01lc3NhZ2UiLCJhZGRlZE9rTWVzc2FnZSIsImFkZElsbHVzdHJhdGlvblR4dCIsImRlZmF1bHRBbHQiLCJkZWxldGVkT2tNZXNzYWdlIiwiaW50cm9Ob0lsbHVzdHJhdGlvbiIsImludHJvVGl0bGVGb3JJbGx1c3RyYXRpb24iLCJuZWVkR29vZEZpbGUiLCJuZWVkR29vZExvbmdBbHQiLCJuZWVkR29vZExvbmdDYXB0aW9uIiwibmVlZEdvb2RMb25nVGl0bGUiLCJuZWVkR29vZExvbmdVcmwiLCJuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUiLCJuZWVkUXVlc3Rpb25uYWlyZUZvcklsbHVzdHJhdGlvbiIsIm5lZWRVbmlxdWVVcmwiLCJuZWVkVXJsIiwibm90Rm91bmQiLCJ1cGRhdGVkT2tNZXNzYWdlIiwiYWRkTGlua1R4dCIsImRlZmF1bHRWYWx1ZUZvckxpbmsiLCJpbnRyb05vTGluayIsImludHJvVGl0bGVGb3JMaW5rIiwibmVlZEFuY2hvciIsIm5lZWRHb29kTG9uZ0FuY2hvciIsIm5lZWRNYXhMaW5rc0ZvclF1ZXN0aW9ubmFpcmUiLCJuZWVkTm90VG9vTG9uZ1VybCIsIm5lZWRRdWVzdGlvbm5haXJlIiwibmVlZFZhbGlkVXJsIiwiYWRkUXVlc3Rpb25UeHQiLCJpbnRyb05vUXVlc3Rpb24iLCJpbnRyb1RpdGxlRm9yUXVlc3Rpb24iLCJuZWVkTWF4UXVlc3Rpb25zIiwibmVlZE5vdFRvb0xvbmdUZXh0IiwibmVlZE51bWJlckZvclJhbmsiLCJuZWVkVGV4dCIsImJ0blNlbmRSZXNwb25zZSIsImJ0blNoYXJlUXVpelR4dCIsImJ0blNoYXJlUXVpek1haWxCb2R5IiwiYnRuU2hvd1F1ZXN0aW9ubmFpcmUiLCJjb3JyZWN0QW5zd2VyVHh0IiwiZXN0aW1hdGVkVGltZSIsImVzdGltYXRlZFRpbWVPcHRpb24iLCJzaG9ydCIsIm1lZGl1bSIsImxvbmciLCJleHBsYW5hdGlvbkJlZm9yZVR4dCIsImhhdmVCZWVuUHVibGlzaGVkIiwiaGF2ZUJlZW5SZWdlbmVyYXRlZCIsImxhc3RVcGRhdGVkIiwibGlua0dvVG9OZXh0RWxlbWVudCIsImxpbmtHb1RvUXVpeiIsIm5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGUiLCJuZWVkRXN0aW1hdGVkVGltZSIsIm5lZWRHcm91cElmUmFuayIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkS25vd0lmSXNQdWJsaXNoZWQiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZFRpdGxlIiwibmV4dERhdGVXaXRob3V0UXVlc3Rpb25uYWlyZSIsIm5leHRRdWVzdGlvbm5haXJlc0xpc3QiLCJxdWVzdGlvbm5haXJlc05hbWUiLCJxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkIiwicHVibGlzaGVkQXQiLCJwdWJsaXNoZWRCeSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVSZXN1bHRUaXRsZSIsInNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoTm9SZXN1bHQiLCJzZWFyY2hRdWVzdGlvbm5haXJlV2l0aFJlc3VsdCIsIndyb25nQW5zd2VyVHh0IiwiYWxyZWFkeUNvbm5lY3RlZCIsImJhZExpbmtWYWxpZGF0aW9uTWVzc2FnZSIsImJhZFBhc3N3b3JkIiwiYnllYnllTWVzc2FnZSIsImNvbm5lY3Rpb25PayIsImNyZWF0aW9uT2tNZXNzYWdlIiwiY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZSIsImRlbGV0ZUluYWN0aXZlVXNlcnNNZXNzYWdlIiwiZW1haWxOb3RGb3VuZCIsImZvcm1zRW1haWxMYWJlbCIsImZvcm1zRW1haWxQbGFjZWhvbGRlciIsImZvcm1zQ0dVT2tMYWJlbCIsImZvcm1zU3VibWl0VHh0IiwiZ29kZmF0aGVyRm91bmQiLCJnb2RmYXRoZXJOb3RGb3VuZCIsImluZm9zQWRtaW5Hb2RmYXRoZXIiLCJpbmZvc0FkbWluTmJHb2RDaGlsZHMiLCJpbmZvc1VzZXJGb3JBZG1pbiIsImluZm9zVXNlck5iR29kQ2hpbGRzIiwiaW5mb3NVc2VyTm9Hb2RjaGlsZHMiLCJtYWlsRGVsZXRlQm9keUhUTUwiLCJtYWlsRGVsZXRlQm9keVR4dCIsIm1haWxEZWxldGVMaW5rQWxyZWFkeU1lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtPa01lc3NhZ2UiLCJtYWlsRGVsZXRlTGlua1R4dCIsIm1haWxEZWxldGVTdWJqZWN0IiwibWFpbExvZ2luTGlua0JvZHlIVE1MIiwibWFpbExvZ2luTGlua0JvZHlUeHQiLCJtYWlsTG9naW5MaW5rTWVzc2FnZSIsIm1haWxMb2dpbkxpbmtTdWJqZWN0IiwibWFpbExvZ2luTGlua1R4dCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlIVE1MIiwibWFpbFRoYW5rR29kZmF0aGVyQm9keVR4dCIsIm1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJTdWJqZWN0IiwibWFpbFVwZGF0ZUxvZ2luQm9keUhUTUwiLCJtYWlsVXBkYXRlTG9naW5Cb2R5VHh0IiwibWFpbFVwZGF0ZUxvZ2luTGlua01lc3NhZ2UiLCJtYWlsVXBkYXRlTG9naW5MaW5rVHh0IiwibWFpbFVwZGF0ZUxvZ2luT2tNZXNzYWdlIiwibWFpbFVwZGF0ZUxvZ2luU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5SFRNTCIsIm1haWxWYWxpZGF0aW9uTGlua1NCb2R5VHh0IiwibWFpbFZhbGlkYXRpb25MaW5rU3ViamVjdCIsIm1haWxWYWxpZGF0aW9uTGlua1R4dCIsIm1haWxWYWxpZGF0aW9uTWVzc2FnZSIsIm1haWxXZWxjb21lQm9keUhUTUwiLCJtYWlsV2VsY29tZUJvZHlUeHQiLCJtYWlsV2VsY29tZUxpbmtUeHQiLCJtYWlsV2VsY29tZVN1YmplY3QiLCJuZWVkQmVDb25uZWN0ZWQiLCJuZWVkQ2hvb3NlTG9naW5XYXkiLCJuZWVkRW1haWwiLCJuZWVkS25vd05ld3NsZXR0ZXJPayIsIm5lZWRMb25nUGFzc1dvcmQiLCJuZWVkTWF4VGltZURpZmZlcmVuY2UiLCJuZWVkTWluVGltZURpZmZlcmVuY2UiLCJuZWVkTmFtZSIsIm5lZWROb3RUb29Mb25nTmFtZSIsIm5lZWROb3RUb29Mb25nRW1haWwiLCJuZWVkUGFzc1dvcmQiLCJuZWVkU01UUCIsIm5lZWRTTVRQTm90Rm91bmQiLCJuZWVkU3RhdHVzIiwibmVlZFRpbWVEaWZmZXJlbmNlIiwibmVlZFVHQ09rIiwibmVlZFVuaXF1ZUVtYWlsIiwibmVlZFZhbGlkYXRpb25Ub0xvZ2luIiwibmVlZFZhbGlkTGFzdENvbm5lY3Rpb25EYXRlIiwicGFzc3dvcmRDb3BpZWQiLCJzZWFyY2hVc2Vyc1dpdGhvdXRSZXN1bHQiLCJ0b29NYW55TG9naW5GYWlscyIsInVwZGF0ZWRGYWlsZWRHb2RmYXRoZXJOb3RGb3VuZCIsInVwZGF0ZWROZWVkR29vZEVtYWlsIiwidXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIiwidXBkYXRlZE5lZWRVbmlxdWVFbWFpbCIsInVwZGF0ZWROZWVkVmFsaWRhdGVkVXNlciIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZSIsInZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZUFkbWluIiwidmFsaWRhdGlvbk1lc3NhZ2UiLCJ2YWxpZGF0aW9uTWVzc2FnZUFkbWluIiwid2VsY29tZU1lc3NhZ2UiLCJUb29sIiwibXlWYXIiLCJ1bmRlZmluZWQiLCJ0cmltIiwibXlTdHJpbmciLCJpc0VtcHR5IiwibWF4IiwibGVuZ3RoIiwic3Vic3RyaW5nIiwibWFwT2JqIiwicmVwbGFjZUVsdHMiLCJSZWdFeHAiLCJPYmplY3QiLCJrZXlzIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsImkiLCJoZWFkTGlua3MiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ0YWdzTGlzdFR4dCIsImFib3V0UGFnZSIsImNndVBhZ2UiLCJkZWxldGVMaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJ1c2VySG9tZVBhZ2VUeHQiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJtYWlsUmVjaXBpZW50VHh0IiwibGljZW5jZVR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJ0YWdMaXN0VGl0bGUiLCJ0YWdMaXN0TWV0YURlc2MiLCJ0YWdMaXN0SW50cm8iLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwiZXhwbGFuYXRpb25FbGVtZW50VHh0IiwidHdpdHRlckFjY291bnQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsImNvbmZpZyIsImNvbmZpZ0lsbHVzdHJhdGlvbnMiLCJjb25maWdMaW5rcyIsImNvbmZpZ1F1ZXN0aW9ubmFpcmVzIiwiY29uZmlnVGVtcGxhdGUiLCJidG5OZXdRdWVzdGlvbm5haXJlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImJ0blByZXZpZXdRdWVzdGlvbm5haXJlIiwiZGVsZXRlQ2hlY2tCb3giLCJkaXZDcmFzaCIsImRpdklsbHVzdHJhdGlvbnMiLCJkaXZMaW5rcyIsImRpdk1haW4iLCJkaXZNZXNzYWdlIiwiZGl2UXVlc3Rpb25uYWlyZXMiLCJkaXZRdWVzdGlvbnMiLCJkaXZSZXNwb25zZSIsImRpdlNlYXJjaFJlc3VsdCIsImZvcm1MaW5rIiwiZm9ybUlsbHVzdHJhdGlvbiIsImZvcm1RdWVzdGlvbiIsImZvcm1RdWVzdGlvbm5haXJlIiwiZm9ybVNlYXJjaCIsImhlbHBDbGFzc2lmaWNhdGlvbiIsImhlbHBHcm91cCIsImhlbHBQdWJsaXNoaW5nQXQiLCJpbnB1dENsYXNzaWZpY2F0aW9uIiwiaW5wdXRHcm91cCIsImlucHV0UmFua0luR3JvdXAiLCJoaWRlQWxsRm9ybXMiLCJlbXB5QW5kSGlkZUZvcm0iLCJzaG93Rm9ybUxpbmtJbmZvcyIsInN0eWxlIiwiZGlzcGxheSIsInNldEF0dHJpYnV0ZXNUb0lucHV0cyIsImRhdGEiLCJlbGVtZW50cyIsInNob3dMaW5rSW5mb3MiLCJMaW5rcyIsInRva2VuIiwiYWRkRWxlbWVudCIsImxpc3RMaW5rcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImFzc2lnbiIsInNlbmRMaW5rRm9ybSIsIm5ld0J0biIsImRpdlJlc3BvbnNlTGluayIsImlubmVySFRNTCIsImRhdGFzIiwiZ2V0RGF0YXNGcm9tSW5wdXRzIiwieGhyTGlua0RhdGFzIiwiWE1MSHR0cFJlcXVlc3QiLCJkZWxldGVPayIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInJlc3BvbnNlIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzIiwibWVzc2FnZSIsInF1ZXN0aW9ubmFpcmUiLCJBcnJheSIsImlzQXJyYXkiLCJzaG93TmV4dFF1ZXN0aW9ubmFpcmVzIiwiZXJyb3JzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJzdHJpbmdpZnkiLCJzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zIiwicmVtb3ZlQXR0cmlidXRlIiwic2hvd0lsbHVzdHJhdGlvbkluZm9zIiwiSWxsdXN0cmF0aW9ucyIsImxpc3RJbGx1c3RyYXRpb25zIiwic2VuZElsbHVzdHJhdGlvbkZvcm0iLCJkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiIsImRhdGFzV2l0aEZpbGVzIiwiRm9ybURhdGEiLCJ4aHJJbGx1c3RyYXRpb25EYXRhcyIsInNob3dGb3JtUXVlc3Rpb25JbmZvcyIsIkNob2ljZXMiLCJpc0NvcnJlY3QiLCJjaGVja2VkIiwic2hvd1F1ZXN0aW9uSW5mb3MiLCJRdWVzdGlvbnMiLCJsaXN0UXVlc3Rpb25zIiwic2VuZFF1ZXN0aW9uRm9ybSIsImRpdlJlc3BvbnNlUXVlc3Rpb24iLCJ4aHJRdWVzdGlvbkRhdGFzIiwic2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MiLCJ4aHJHZXRJbmZvcyIsInJlc2V0IiwiZGF0ZUZvcm1hdCIsIlRhZ3MiLCJjbGFzc2lmaWNhdGlvbiIsInNldEF0dHJpYnV0ZSIsInhock5leHRRdWVzdGlvbm5haXJlcyIsImxpc3RIVE1MIiwiZGF5U3RyIiwib3B0aW9uc0RheVN0ciIsIndlZWtkYXkiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJmb3JtYXQiLCJkYXRlUHVibGlzaGluZyIsImlzUHVibGlzaGFibGUiLCJkYXRlTmVlZGVkIiwidGFyZ2V0Iiwic3BsaXQiLCJpbml0aWFsaXNlIiwiY2hlY2tTZXNzaW9uIiwiY29sb3IiLCJpc0Nvbm5lY3RlZCIsImdldExvY2FseSIsInJlbW92ZUxvY2FseSIsInVzZXIiLCJ1cGRhdGVBY2NvdW50TGluayIsInVybERhdGFzIiwiZ2V0VXJsUGFyYW1zIiwieGhyU2VhcmNoIiwic2VsZWN0SFRNTCIsInNlYXJjaFNlbGVjdCIsInRhZ3MiLCJyZXZlcnNlIiwibGFzdFRhZyIsInhoclNlYXJjaFRhZ3MiLCJncm91cElucHV0IiwieGhyU2VhcmNoR3JvdXBzIiwibWF4UmFuayIsInJhbmtJbkdyb3VwIiwiR3JvdXBJZCIsInhoclF1ZXN0aW9ubmFpcmVEYXRhcyIsImNvbnNvbGUiLCJlcnJvciIsImhlbGxvRGV2Iiwic2F2ZUxvY2FseSIsImxvY2FsU3RvcmFnZSIsInNldEl0ZW0iLCJqc29uIiwiZ2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlbHRQYXJlbnQiLCJlbHRUeXBlIiwiZWx0Q29udGVudCIsImVsdElkIiwiZWx0Q2xhc3MiLCJlbHRBdHRyaWJ1dGVzIiwibmV3RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJhdHRyaWJ1dE5hbWUiLCJhcHBlbmRDaGlsZCIsImxvZyIsImxpbmsiLCJob21lUGFnZSIsImlucHV0c0NvbmYiLCJteUZvcm0iLCJpZElucHV0IiwiaW5wdXRIVE1MIiwiYXR0cmlidXRlIiwiZm9ybURhdGEiLCJlbnRyaWVzIiwiZW50cmllIiwiZW1weUZvcm0iLCJ0eXBlIiwicGFyYW1ldGVycyIsInBhcmFtIiwiZGVjb2RlVVJJIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJsYXN0QW5zd2VyIiwiYW5zd2VyIiwibmJDb3JyZWN0QW5zd2VycyIsIm5iUXVlc3Rpb25zIiwiUXVlc3Rpb25uYWlyZUlkIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsInhociIsIm9ubG9hZCIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50IiwiaW5kZXhPZiIsIm9uZXJyb3IiLCJzdGF0dXNUZXh0Il0sIm1hcHBpbmdzIjoiO1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkEsSUFBTUEsUUFBUSxHQUFHQyxtQkFBTyxDQUFDLHlDQUFELENBQXhCOztBQUVBQyxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJO0FBQ0FDLG9CQUFrQixFQUFFLGdCQUZ4QjtBQUdJO0FBQ0FDLGNBQVksRUFDWjtBQUNJQyxPQUFHLEVBQUU7QUFBRUMsZUFBUyxFQUFFO0FBQWIsS0FEVDtBQUVJQyxTQUFLLEVBQUU7QUFBRUQsZUFBUyxFQUFFO0FBQWIsS0FGWDtBQUdJRSxXQUFPLEVBQUU7QUFBRUYsZUFBUyxFQUFFO0FBQWIsS0FIYjtBQUlJRyxTQUFLLEVBQUU7QUFBRUMsY0FBUSxFQUFFLElBQVo7QUFBa0JDLFlBQU0sRUFBRVosUUFBUSxDQUFDYSx3QkFBVCxDQUFrQ0MsSUFBbEMsQ0FBdUMsR0FBdkM7QUFBMUI7QUFKWCxHQUxKO0FBV0k7QUFDQUMscUJBQW1CLEVBQUcsTUFaMUI7QUFhSUMsa0JBQWdCLEVBQUU7QUFidEIsQ0FEQSxDOzs7Ozs7Ozs7Ozs7Ozs7QUNGQSxJQUFNQyxLQUFLLEdBQUdoQixtQkFBTyxDQUFDLG1DQUFELENBQXJCOztBQUNBLElBQU1pQixjQUFjLEdBQUdqQixtQkFBTyxDQUFDLHFEQUFELENBQTlCOztBQUVBQyxNQUFNLENBQUNDLE9BQVA7QUFFSWdCLFFBQU0sRUFBRSwyQkFGWjtBQUdJQyxTQUFPLEVBQUUsdUJBSGI7QUFJSUMsV0FBUyxFQUFFLFNBSmY7QUFLSUMsWUFBVSxFQUFFLG1CQUxoQjtBQU1JQyxZQUFVLEVBQUUsbUJBTmhCO0FBT0lDLGFBQVcsRUFBRSx1QkFQakI7QUFRSUMsV0FBUyxFQUFFLElBUmY7QUFTSUMsT0FBSyxFQUFFLFdBVFg7QUFTd0I7QUFDcEJDLGdCQUFjLEVBQUUsQ0FBQyxJQUFELENBVnBCO0FBVTJCO0FBQ3ZCQyxVQUFRLEVBQUUsbUJBWGQ7QUFZSUMsb0JBQWtCLEVBQUUsSUFaeEI7QUFZOEI7QUFDMUJDLG9CQUFrQixFQUFFLEtBYnhCO0FBYStCO0FBQzNCQywwQkFBd0IsRUFBRSxHQWQ5QjtBQWNtQztBQUMvQkMsOEJBQTRCLEVBQUUsQ0FmbEM7QUFlcUM7QUFDakNDLGtDQUFnQyxFQUFFLEtBaEJ0QztBQWdCNkM7QUFDekNDLDJCQUF5QixFQUFFLElBakIvQjtBQWtCSUMsOEJBQTRCLEVBQUUsS0FsQmxDO0FBbUJJQyw2QkFBMkIsRUFBRSxVQW5CakM7QUFvQklDLCtCQUE2QixFQUFFLElBcEJuQztBQW9Cd0M7QUFDcENDLDRCQUEwQixFQUFFLElBckJoQztBQXNCSUMsZ0NBQThCLEVBQUUsUUF0QnBDO0FBc0I4QztBQUMxQ0MseUJBQXVCLEVBQUUsRUF2QjdCO0FBd0JJQyx5Q0FBdUMsRUFBRSxDQXhCN0M7QUF5QklDLDBDQUF3QyxFQUFFLEVBekI5QztBQTBCSUMsMkNBQXlDLEVBQUUsQ0ExQi9DO0FBMkJJQyxtQ0FBaUMsRUFBRSxHQTNCdkM7QUE0Qkk7QUFDQUMsZ0JBQWMsRUFBRSxDQTdCcEI7QUE2QnVCO0FBQ25CQyxnQkFBYyxFQUFFLENBOUJwQjtBQThCdUI7QUFDbkJDLGNBQVksRUFBRSxFQS9CbEI7QUFnQ0lDLHFCQUFtQixFQUFFLEVBaEN6QjtBQWdDNEI7QUFDeEJDLCtCQUE2QixFQUFDLENBakNsQztBQWlDcUM7QUFDakNDLDZCQUEyQixFQUFDLEVBbENoQztBQWtDb0M7QUFDaENDLGtDQUFnQyxFQUFFLEVBbkN0QztBQW1DMEM7QUFDdENDLHlCQUF1QixFQUFFLENBcEM3QjtBQXFDSUMsd0JBQXNCLEVBQUcsY0FyQzdCO0FBcUM2QztBQUN6QztBQUNBQyw0QkFBMEIsRUFBRSxDQXZDaEM7QUF3Q0lDLDRCQUEwQixFQUFFLENBeENoQztBQXlDSTtBQUNBQyxvQkFBa0IsRUFBRSxDQTFDeEI7QUEyQ0lDLG9CQUFrQixFQUFFLENBM0N4QjtBQTRDSUMsNEJBQTBCLEVBQUUsT0E1Q2hDO0FBNEN3QztBQUNwQzdDLDBCQUF3QixFQUFFLENBQUUsV0FBRixFQUFlLFlBQWYsRUFBNkIsV0FBN0IsRUFBMEMsV0FBMUMsRUFBdUQsV0FBdkQsQ0E3QzlCO0FBOENJO0FBQ0E4QywyQkFBeUIsRUFBRSxHQS9DL0I7QUFnRElDLHFDQUFtQyxFQUFFLEdBaER6QztBQWlESTtBQUNBQyxZQUFVLEVBQUUsQ0FsRGhCO0FBbURJQyxZQUFVLEVBQUU7QUFuRGhCLHNEQXFEb0IsQ0FyRHBCLHNEQXNEb0IsQ0F0RHBCLG9EQXVEa0IsRUF2RGxCLHlEQXlEdUI3QyxLQUFLLENBQUM4QyxRQUFOLENBQWVDLFNBekR0QyxxREEwRG1CL0MsS0FBSyxDQUFDZ0QsYUExRHpCLDREQTJEMEJoRCxLQUFLLENBQUNpRCxvQkEzRGhDLDhEQTRENEJoRCxjQUFjLENBQUNpRCxzQkE1RDNDLHlEQTZEdUJqRCxjQUFjLENBQUNrRCxpQkE3RHRDLG1FQThEaUNsRCxjQUFjLENBQUNtRCwyQkE5RGhELDZEQStEMkJuRCxjQUFjLENBQUNvRCxxQkEvRDFDLDREQWdFMEJwRCxjQUFjLENBQUNxRCxvQkFoRXpDLG9COzs7Ozs7Ozs7OztBQ0hBckUsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBcUUsWUFBVSxFQUFFLFFBRmhCO0FBR0k7QUFDQUMsTUFBSSxFQUNKO0FBQ0lDLE9BQUcsRUFBRTtBQUFFbkUsZUFBUyxFQUFFLEdBQWI7QUFBa0JJLGNBQVEsRUFBRTtBQUE1QixLQURUO0FBRUlnRSxVQUFNLEVBQUU7QUFBRXBFLGVBQVMsRUFBRSxHQUFiO0FBQWtCSSxjQUFRLEVBQUU7QUFBNUI7QUFGWjtBQUxKLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQVQsTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSTtBQUNBeUUscUJBQW1CLEVBQUUsZ0JBRnpCO0FBRTBDO0FBQ3RDQywyQkFBeUIsRUFBRSw2QkFIL0I7QUFJSUMsd0JBQXNCLEVBQUUsTUFKNUI7QUFLSUMsOEJBQTRCLEVBQUcsWUFMbkM7QUFNSUMsd0JBQXNCLEVBQUcsU0FON0I7QUFPSUMsNEJBQTBCLEVBQUUsVUFQaEM7QUFRSUMsOEJBQTRCLEVBQUUsUUFSbEM7QUFTSUMsZ0JBQWMsRUFBRSxrQkFUcEI7QUFVSUMsZ0NBQThCLEVBQUcsY0FWckM7QUFXSUMsMkJBQXlCLEVBQUcsU0FYaEM7QUFZSTtBQUNBQyxhQUFXLEVBQUUsUUFiakI7QUFjSUMsZUFBYSxFQUFFLE9BZG5CO0FBZUlDLG9CQUFrQixFQUFFLFVBZnhCO0FBZ0JJQyxtQkFBaUIsRUFBRyxTQWhCeEI7QUFpQkk7QUFDQUMsZ0JBQWMsRUFBRSxZQWxCcEI7QUFtQkk7QUFDQUMsaUJBQWUsRUFBRSxlQXBCckI7QUFxQkk7QUFDQUMsZUFBYSxFQUFFLGlCQXRCbkI7QUF1QklDLG9CQUFrQixFQUFFLGdCQXZCeEI7QUF3QklDLGlCQUFlLEVBQUcsdUJBeEJ0QjtBQXdCOEM7QUFDMUNDLGtCQUFnQixFQUFFLFVBekJ0QjtBQXlCaUM7QUFDN0I7QUFDQUMsZUFBYSxFQUNiO0FBQ0l4RixTQUFLLEVBQUU7QUFBRUQsZUFBUyxFQUFFLEdBQWI7QUFBa0JJLGNBQVEsRUFBRTtBQUE1QixLQURYO0FBRUlzRixRQUFJLEVBQUU7QUFBRTFGLGVBQVMsRUFBRTtBQUFiLEtBRlY7QUFFOEI7QUFDMUIyRixnQkFBWSxFQUFFO0FBQUV2RixjQUFRLEVBQUU7QUFBWjtBQUhsQixHQTVCSjtBQWlDSXdGLHNCQUFvQixFQUFHO0FBQUVuQyxhQUFTLEVBQUUsQ0FBYjtBQUFnQnJELFlBQVEsRUFBRTtBQUExQixHQWpDM0I7QUFrQ0l5RixPQUFLLEVBQ0w7QUFDSTVGLFNBQUssRUFBRTtBQUFFRCxlQUFTLEVBQUUsR0FBYjtBQUFrQkksY0FBUSxFQUFFO0FBQTVCLEtBRFg7QUFFSXNGLFFBQUksRUFBRTtBQUFFMUYsZUFBUyxFQUFFO0FBQWIsS0FGVixDQUU4Qjs7QUFGOUIsR0FuQ0o7QUF1Q0k4RixVQUFRLEVBQ1I7QUFDSUMsUUFBSSxFQUFFO0FBQUUvRixlQUFTLEVBQUUsR0FBYjtBQUFrQkksY0FBUSxFQUFFO0FBQTVCLEtBRFY7QUFFSTRGLFFBQUksRUFBRTtBQUFFNUYsY0FBUSxFQUFFLElBQVo7QUFBa0I2RixTQUFHLEVBQUMsQ0FBdEI7QUFBeUJDLGtCQUFZLEVBQUM7QUFBdEM7QUFGVixHQXhDSjtBQTRDSUMsUUFBTSxFQUNOO0FBQ0lKLFFBQUksRUFBRTtBQUFFL0YsZUFBUyxFQUFFLEdBQWI7QUFBa0JJLGNBQVEsRUFBRTtBQUE1QjtBQURWLEdBN0NKO0FBZ0RJZ0csUUFBTSxFQUFFO0FBQUUzQyxhQUFTLEVBQUUsQ0FBYjtBQUFnQnJELFlBQVEsRUFBRTtBQUExQixHQWhEWjtBQWlESWlHLGNBQVksRUFBRTtBQUFFNUMsYUFBUyxFQUFFLENBQWI7QUFBZ0JyRCxZQUFRLEVBQUU7QUFBMUIsR0FqRGxCO0FBa0RJO0FBQ0FrRyxnQkFBYyxFQUFHLDZCQW5EckI7QUFvREkxQyx3QkFBc0IsRUFBRyxzQkFwRDdCO0FBcURJQyxtQkFBaUIsRUFBRyxnQ0FyRHhCO0FBc0RJMEMsY0FBWSxFQUFHLDJCQXREbkI7QUF1REl6Qyw2QkFBMkIsRUFBRyw0QkF2RGxDO0FBd0RJO0FBQ0EwQyxlQUFhLEVBQUcsc0JBekRwQjtBQTBESXpDLHVCQUFxQixFQUFHLG1CQTFENUI7QUEyREkwQyxhQUFXLEVBQUcsb0JBM0RsQjtBQTRESUMsYUFBVyxFQUFHLG9CQTVEbEI7QUE2REk7QUFDQUMsY0FBWSxFQUFHLFNBOURuQjtBQStESTNDLHNCQUFvQixFQUFHLE1BL0QzQjtBQWdFSTRDLFlBQVUsRUFBRyxRQWhFakI7QUFpRUlDLFlBQVUsRUFBRyxRQWpFakI7QUFrRUk7QUFDQUMsaUJBQWUsRUFBRyxDQW5FdEI7O0FBb0VJO0FBQ0F4RSxnQkFBYyxFQUFFLENBckVwQjtBQXNFSUMsZ0JBQWMsRUFBRSxDQXRFcEI7QUF1RUlDLGNBQVksRUFBRSxFQXZFbEI7QUF3RUl1RSxXQUFTLEVBQUUsQ0F4RWY7QUF5RUlDLFdBQVMsRUFBRSxDQXpFZixDQXlFa0I7O0FBekVsQixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUFySCxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJO0FBQ0FxSCxZQUFVLEVBQUUsT0FGaEI7QUFHSUMsc0JBQW9CLEVBQUUsaUJBSDFCO0FBSUlDLHlCQUF1QixFQUFFLGNBSjdCO0FBS0lDLGlCQUFlLEVBQUUsY0FMckI7QUFNSUMsd0JBQXNCLEVBQUUsbUJBTjVCO0FBT0lDLDBCQUF3QixFQUFFLGNBUDlCO0FBUUlDLGlCQUFlLEVBQUUsUUFSckI7QUFTSUMseUJBQXVCLEVBQUUsaUJBVDdCO0FBVUlDLGlCQUFlLEVBQUUsU0FWckI7QUFXSXBDLGVBQWEsRUFBRSxpQkFYbkI7QUFZSXFDLGNBQVksRUFBRSxnQkFabEI7QUFhSUMsbUJBQWlCLEVBQUUsaUJBYnZCO0FBY0lDLG1CQUFpQixFQUFFLGVBZHZCO0FBZUlDLGFBQVcsRUFBRSx5QkFmakI7QUFnQklDLGNBQVksRUFBRSxPQWhCbEI7QUFpQklDLDZCQUEyQixFQUFFLDBCQWpCakM7QUFpQjREO0FBQ3hEQyxpQkFBZSxFQUFFLFVBbEJyQjtBQW1CSUMsdUJBQXFCLEVBQUUsb0JBbkIzQjtBQW9CSUMsZ0JBQWMsRUFBRSxTQXBCcEI7QUFxQklDLGtCQUFnQixFQUFFLHFCQXJCdEI7QUFzQklDLGlCQUFlLEVBQUUsVUF0QnJCO0FBdUJJQyxtQkFBaUIsRUFBRSxZQXZCdkI7QUF3Qkk7QUFDQUMsTUFBSSxFQUFFO0FBQUV0SSxhQUFTLEVBQUUsRUFBYjtBQUFpQkksWUFBUSxFQUFFO0FBQTNCLEdBekJWO0FBMEJJbUksT0FBSyxFQUFFO0FBQUV2SSxhQUFTLEVBQUUsR0FBYjtBQUFrQkksWUFBUSxFQUFFO0FBQTVCLEdBMUJYO0FBMkJJb0QsVUFBUSxFQUFFO0FBQUVDLGFBQVMsRUFBRSxDQUFiO0FBQWdCekQsYUFBUyxFQUFDLEVBQTFCO0FBQThCSSxZQUFRLEVBQUU7QUFBeEMsR0EzQmQ7QUEyQjhEO0FBQzFEb0ksYUFBVyxFQUFFO0FBQUUvRSxhQUFTLEVBQUUsQ0FBYjtBQUFnQnpELGFBQVMsRUFBQztBQUExQixHQTVCakI7QUE2Qkl5SSxlQUFhLEVBQUU7QUFBRXpJLGFBQVMsRUFBRTtBQUFiLEdBN0JuQjtBQThCSTBJLE9BQUssRUFBRTtBQUFFQyxTQUFLLEVBQUUsTUFBVDtBQUFpQnZJLFlBQVEsRUFBRTtBQUEzQixHQTlCWDtBQStCSWdHLFFBQU0sRUFBRTtBQUFFM0MsYUFBUyxFQUFFLENBQWI7QUFBZ0JyRCxZQUFRLEVBQUU7QUFBMUIsR0EvQlo7QUFnQ0l3SSxtQkFBaUIsRUFBRSxDQUFDLEdBaEN4QjtBQWlDSUMsbUJBQWlCLEVBQUUsR0FqQ3ZCO0FBa0NJO0FBQ0FuRixlQUFhLEVBQUcsYUFuQ3BCO0FBb0NJQyxzQkFBb0IsRUFBRyxvQ0FwQzNCO0FBcUNJbUYsNkJBQTJCLEVBQUc7QUFyQ2xDLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUU7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0U7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEOzs7Ozs7Ozs7OztBQ3RCQW5KLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0ltSixXQUFTLEVBQUUsU0FEZjtBQUVJQyxjQUFZLEVBQUcsd0NBRm5CO0FBR0lDLGdCQUFjLEVBQUUsa0JBSHBCO0FBSUlDLFFBQU0sRUFBRywrQ0FKYjtBQUtJQyx3QkFBc0IsRUFBRyxZQUw3QjtBQU1JQyxzQkFBb0IsRUFBRSxpQkFOMUI7QUFPSUMscUJBQW1CLEVBQUUscUJBUHpCO0FBUUlDLGtCQUFnQixFQUFFLHNCQVJ0QjtBQVNJQyxjQUFZLEVBQUUsV0FUbEI7QUFVSUMsbUJBQWlCLEVBQUcsa0RBVnhCO0FBV0lDLGlCQUFlLEVBQUcsd0NBWHRCO0FBWUlDLFVBQVEsRUFBRyw0QkFaZjtBQWFJQyxjQUFZLEVBQUcscURBYm5CO0FBY0lDLGdCQUFjLEVBQUcsa0NBZHJCO0FBZUlDLFlBQVUsRUFBRywyQkFmakI7QUFnQklDLGVBQWEsRUFBRywyQ0FoQnBCO0FBaUJJQyxjQUFZLEVBQUcsc0RBakJuQjtBQWtCSUMsVUFBUSxFQUFHLGVBbEJmO0FBbUJJQyxZQUFVLEVBQUcsMkRBbkJqQjtBQW9CSUMsYUFBVyxFQUFHLGFBcEJsQjtBQXFCSUMsZ0JBQWMsRUFBRyxvQkFyQnJCO0FBc0JJQyxjQUFZLEVBQUcsaUJBdEJuQjtBQXVCSUMsYUFBVyxFQUFHLDRHQXZCbEI7QUF3QklDLGtCQUFnQixFQUFHLHdCQXhCdkI7QUF5QklDLGVBQWEsRUFBRyw0Q0F6QnBCO0FBMEJJQyxxQkFBbUIsRUFBRyxtTUExQjFCO0FBMkJJQyxtQkFBaUIsRUFBRyxtRUEzQnhCO0FBNEJJQyxrQkFBZ0IsRUFBRyx1RUE1QnZCO0FBNkJJQyxZQUFVLEVBQUcsbWhCQTdCakI7QUE4QklDLGtCQUFnQixFQUFFLGtCQTlCdEI7QUErQklDLGNBQVksRUFBRSxVQS9CbEI7QUFnQ0lDLGlCQUFlLEVBQUc7QUFoQ3RCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQW5MLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0ltTCxnQkFBYyxFQUFFLHdDQURwQjtBQUVJQyxvQkFBa0IsRUFBRSwwQkFGeEI7QUFHSUMsWUFBVSxFQUFHLHNCQUhqQjtBQUlJQyxrQkFBZ0IsRUFBRSxzQ0FKdEI7QUFLSUMscUJBQW1CLEVBQUcscUNBTDFCO0FBTUlDLDJCQUF5QixFQUFHLHVCQU5oQztBQU9JQyxjQUFZLEVBQUcsb0NBUG5CO0FBUUlDLGlCQUFlLEVBQUcsNEVBUnRCO0FBU0lDLHFCQUFtQixFQUFHLCtFQVQxQjtBQVVJQyxtQkFBaUIsRUFBRyw4RUFWeEI7QUFXSUMsaUJBQWUsRUFBRywyREFYdEI7QUFZSUMsc0NBQW9DLEVBQUcsaUZBWjNDO0FBYUlDLGtDQUFnQyxFQUFHLDZHQWJ2QztBQWNJQyxlQUFhLEVBQUcsOENBZHBCO0FBZUlDLFNBQU8sRUFBRyx3Q0FmZDtBQWdCSUMsVUFBUSxFQUFFLDBEQWhCZDtBQWlCSUMsa0JBQWdCLEVBQUU7QUFqQnRCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQXBNLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0ltTCxnQkFBYyxFQUFFLDRCQURwQjtBQUVJaUIsWUFBVSxFQUFFLGlCQUZoQjtBQUdJQyxxQkFBbUIsRUFBRSwrQkFIekI7QUFJSWYsa0JBQWdCLEVBQUUsOEJBSnRCO0FBS0lnQixhQUFXLEVBQUcsNEJBTGxCO0FBTUlDLG1CQUFpQixFQUFHLG9CQU54QjtBQU9JQyxZQUFVLEVBQUcsMENBUGpCO0FBUUlDLG9CQUFrQixFQUFHLDZFQVJ6QjtBQVNJQyw4QkFBNEIsRUFBRywwRUFUbkM7QUFVSUMsbUJBQWlCLEVBQUcsaUVBVnhCO0FBV0lDLG1CQUFpQixFQUFHLDhDQVh4QjtBQVlJWCxTQUFPLEVBQUcsaUNBWmQ7QUFhSVksY0FBWSxFQUFHLGlEQWJuQjtBQWNJWCxVQUFRLEVBQUcsOENBZGY7QUFlSUMsa0JBQWdCLEVBQUU7QUFmdEIsQ0FEQSxDOzs7Ozs7Ozs7OztBQ0FBcE0sTUFBTSxDQUFDQyxPQUFQLEdBQ0E7QUFDSW9KLGNBQVksRUFBRSxpQ0FEbEI7QUFFSTBELGdCQUFjLEVBQUUsc0JBRnBCO0FBR0lqRCxpQkFBZSxFQUFFLG1DQUhyQjtBQUlJa0QsaUJBQWUsRUFBRSwrQ0FKckI7QUFLSUMsdUJBQXFCLEVBQUUsNEJBTDNCO0FBTUlDLGtCQUFnQixFQUFFLGdGQU50QjtBQU9JQyxvQkFBa0IsRUFBRSx5REFQeEI7QUFRSUMsbUJBQWlCLEVBQUcsb0ZBUnhCO0FBU0lQLG1CQUFpQixFQUFFLCtDQVR2QjtBQVVJUSxVQUFRLEVBQUUsMkNBVmQ7QUFXSWxCLFVBQVEsRUFBRSxxREFYZDtBQVlJaEIsaUJBQWUsRUFBRTtBQVpyQixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUFuTCxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJd0osc0JBQW9CLEVBQUUsaUJBRDFCO0FBQzRDO0FBQ3hDQyxxQkFBbUIsRUFBRSxxQkFGekI7QUFFK0M7QUFDM0M0RCxpQkFBZSxFQUFFLHNCQUhyQjtBQUlJQyxpQkFBZSxFQUFFLGVBSnJCO0FBS0lDLHNCQUFvQixFQUFFLGdGQUwxQjtBQU1JQyxzQkFBb0IsRUFBRSxvQkFOMUI7QUFPSUMsa0JBQWdCLEVBQUUsZUFQdEI7QUFRSUMsZUFBYSxFQUFFLDZCQVJuQjtBQVNJQyxxQkFBbUIsRUFDbkI7QUFDSUMsU0FBSyxFQUFFLFFBRFg7QUFFSUMsVUFBTSxFQUFFLFNBRlo7QUFHSUMsUUFBSSxFQUFFO0FBSFYsR0FWSjtBQWVJQyxzQkFBb0IsRUFBRSxXQWYxQjtBQWdCSUMsbUJBQWlCLEVBQUcsOENBaEJ4QjtBQWlCSUMscUJBQW1CLEVBQUcsb0hBakIxQjtBQWtCSUMsYUFBVyxFQUFFLDJCQWxCakI7QUFtQklDLHFCQUFtQixFQUFFLGlCQW5CekI7QUFvQklDLGNBQVksRUFBRSxpQkFwQmxCO0FBcUJJQywyQkFBeUIsRUFBRSwwREFyQi9CO0FBc0JJQyxtQkFBaUIsRUFBRSw4REF0QnZCO0FBdUJJQyxpQkFBZSxFQUFFLDZFQXZCckI7QUF3QklDLGtCQUFnQixFQUFFLHdEQXhCdEI7QUF5QklDLHVCQUFxQixFQUFFLHVDQXpCM0I7QUEwQklDLGNBQVksRUFBRSwrQ0ExQmxCO0FBMkJJQyxxQkFBbUIsRUFBRSw4REEzQnpCO0FBNEJJeEIsbUJBQWlCLEVBQUUsc0ZBNUJ2QjtBQTZCSXlCLFdBQVMsRUFBRSx5Q0E3QmY7QUE4Qkk1QyxlQUFhLEVBQUUsaUNBOUJuQjtBQStCSUMsU0FBTyxFQUFFLHNDQS9CYjtBQWdDSTRDLDhCQUE0QixFQUFFLHVDQWhDbEM7QUFpQ0lDLHdCQUFzQixFQUFFLDZDQWpDNUI7QUFrQ0lDLG9CQUFrQixFQUFFLE1BbEN4QjtBQW1DSUMsOEJBQTRCLEVBQUUsZ0JBbkNsQztBQW9DSUMsYUFBVyxFQUFFLE1BcENqQjtBQXFDSUMsYUFBVyxFQUFFLGlCQXJDakI7QUFzQ0lDLGdDQUE4QixFQUFHLCtCQXRDckM7QUF1Q0lDLGlDQUErQixFQUFHLGlEQXZDdEM7QUF3Q0lDLCtCQUE2QixFQUFHLHdEQXhDcEM7QUF5Q0lDLGdCQUFjLEVBQUU7QUF6Q3BCLENBREEsQzs7Ozs7Ozs7Ozs7QUNBQXZQLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0l1UCxrQkFBZ0IsRUFBRSxtQ0FEdEI7QUFFSUMsMEJBQXdCLEVBQUUsNklBRjlCO0FBR0lDLGFBQVcsRUFBRSxrRUFIakI7QUFJSUMsZUFBYSxFQUFFLDJGQUpuQjtBQUtJQyxjQUFZLEVBQUUsb0JBTGxCO0FBTUlDLG1CQUFpQixFQUFFLDhDQU52QjtBQU9JQyxpQ0FBK0IsRUFBRSxzREFQckM7QUFRSWpHLG1CQUFpQixFQUFFLHlEQVJ2QjtBQVNJa0csNEJBQTBCLEVBQUUsbURBVGhDO0FBVUlqRyxpQkFBZSxFQUFFLG9DQVZyQjtBQVdJa0csZUFBYSxFQUFFLG9FQVhuQjtBQVlJQyxpQkFBZSxFQUFFLFVBWnJCO0FBYUlDLHVCQUFxQixFQUFFLHNCQWIzQjtBQWNJQyxpQkFBZSxFQUFFLDRJQWRyQjtBQWVJQyxnQkFBYyxFQUFFLGVBZnBCO0FBZ0JJQyxnQkFBYyxFQUFFLDRGQWhCcEI7QUFpQklDLG1CQUFpQixFQUFFLHFGQWpCdkI7QUFrQklDLHFCQUFtQixFQUFFLHFDQWxCekI7QUFtQklDLHVCQUFxQixFQUFFLHFCQW5CM0I7QUFvQklDLG1CQUFpQixFQUFFLGdMQXBCdkI7QUFxQklDLHNCQUFvQixFQUFFLGdGQXJCMUI7QUFzQklDLHNCQUFvQixFQUFFLHlGQXRCMUI7QUF1QklDLG9CQUFrQixFQUFHLDhIQXZCekI7QUF3QklDLG1CQUFpQixFQUFHLDBIQXhCeEI7QUF5QklDLDhCQUE0QixFQUFFLHFFQXpCbEM7QUEwQklDLDJCQUF5QixFQUFFLGtFQTFCL0I7QUEyQklDLHVCQUFxQixFQUFFLHdKQTNCM0I7QUE0QklDLHlCQUF1QixFQUFFLHVFQTVCN0I7QUE2QklDLG1CQUFpQixFQUFHLFlBN0J4QjtBQThCSUMsbUJBQWlCLEVBQUcsMkNBOUJ4QjtBQStCSUMsdUJBQXFCLEVBQUcsaUhBL0I1QjtBQWdDSUMsc0JBQW9CLEVBQUcsK0dBaEMzQjtBQWlDSUMsc0JBQW9CLEVBQUcsaUpBakMzQjtBQWtDSUMsc0JBQW9CLEVBQUcsMEJBbEMzQjtBQW1DSUMsa0JBQWdCLEVBQUcsZUFuQ3ZCO0FBb0NJQyw0QkFBMEIsRUFBRyx5UUFwQ2pDO0FBcUNJQywyQkFBeUIsRUFBRyxvUEFyQ2hDO0FBc0NJQywyQkFBeUIsRUFBRyw0QkF0Q2hDO0FBdUNJQywyQkFBeUIsRUFBRyxTQXZDaEM7QUF3Q0lDLHlCQUF1QixFQUFHLG9JQXhDOUI7QUF5Q0lDLHdCQUFzQixFQUFHLGdJQXpDN0I7QUEwQ0lDLDRCQUEwQixFQUFFLGtUQTFDaEM7QUEyQ0lDLHdCQUFzQixFQUFHLFVBM0M3QjtBQTRDSUMsMEJBQXdCLEVBQUUsNERBNUM5QjtBQTZDSUMsd0JBQXNCLEVBQUcsNkNBN0M3QjtBQThDSUMsNkJBQTJCLEVBQUcsc0lBOUNsQztBQStDSUMsNEJBQTBCLEVBQUcsa0lBL0NqQztBQWdESUMsMkJBQXlCLEVBQUcsb0NBaERoQztBQWlESUMsdUJBQXFCLEVBQUcscUJBakQ1QjtBQWtESUMsdUJBQXFCLEVBQUUsa0tBbEQzQjtBQW1ESUMscUJBQW1CLEVBQUcscXJCQW5EMUI7QUFvRElDLG9CQUFrQixFQUFHLHdvQkFwRHpCO0FBcURJQyxvQkFBa0IsRUFBRyw0QkFyRHpCO0FBc0RJQyxvQkFBa0IsRUFBRyxhQXREekI7QUF1RElDLGlCQUFlLEVBQUUscURBdkRyQjtBQXdESUMsb0JBQWtCLEVBQUUsNkhBeER4QjtBQXlESUMsV0FBUyxFQUFFLHVDQXpEZjtBQTBESUMsc0JBQW9CLEVBQUcsOEVBMUQzQjtBQTJESXBFLGNBQVksRUFBRywyQkEzRG5CO0FBNERJcUUsa0JBQWdCLEVBQUcsb0VBNUR2QjtBQTZESUMsdUJBQXFCLEVBQUcsb0ZBN0Q1QjtBQThESUMsdUJBQXFCLEVBQUcsb0ZBOUQ1QjtBQStESUMsVUFBUSxFQUFFLHdDQS9EZDtBQWdFSUMsb0JBQWtCLEVBQUUsOEVBaEV4QjtBQWlFSUMscUJBQW1CLEVBQUUsNEVBakV6QjtBQWtFSUMsY0FBWSxFQUFHLG1DQWxFbkI7QUFtRUlDLFVBQVEsRUFBRyw0QkFuRWY7QUFvRUlDLGtCQUFnQixFQUFHLG1DQXBFdkI7QUFxRUlDLFlBQVUsRUFBRyxzQkFyRWpCO0FBc0VJQyxvQkFBa0IsRUFBRyw2REF0RXpCO0FBdUVJQyxXQUFTLEVBQUcsbURBdkVoQjtBQXdFSUMsaUJBQWUsRUFBRSx1S0F4RXJCO0FBeUVJQyx1QkFBcUIsRUFBRywrSUF6RTVCO0FBMEVJQyw2QkFBMkIsRUFBRyxpREExRWxDO0FBMkVJQyxnQkFBYyxFQUFFLDJJQTNFcEI7QUE0RUlDLDBCQUF3QixFQUFFLG1DQTVFOUI7QUE2RUlDLG1CQUFpQixFQUFHLDZKQTdFeEI7QUE4RUlDLGdDQUE4QixFQUFHLHlFQTlFckM7QUErRUlDLHNCQUFvQixFQUFHLDhGQS9FM0I7QUFnRklDLDBCQUF3QixFQUFHLCtIQWhGL0I7QUFpRklDLHdCQUFzQixFQUFHLDhIQWpGN0I7QUFrRklDLDBCQUF3QixFQUFFLGtHQWxGOUI7QUFtRklsSSxrQkFBZ0IsRUFBRSw2Q0FuRnRCO0FBb0ZJbUksMEJBQXdCLEVBQUUsb0hBcEY5QjtBQXFGSUMsK0JBQTZCLEVBQUUsOEJBckZuQztBQXNGSUMsbUJBQWlCLEVBQUUsdUlBdEZ2QjtBQXVGSUMsd0JBQXNCLEVBQUUsOEJBdkY1QjtBQXdGSUMsZ0JBQWMsRUFBRTtBQXhGcEIsQ0FEQSxDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0lBRU1DLEk7Ozs7Ozs7NEJBRWFDLEssRUFDZjtBQUNJLFVBQUdBLEtBQUssS0FBR0MsU0FBUixJQUFxQkQsS0FBSyxLQUFHLElBQWhDLEVBQ0ksT0FBTyxJQUFQLENBREosS0FHQTtBQUNJQSxhQUFLLElBQUUsRUFBUCxDQURKLENBQ2M7O0FBQ1ZBLGFBQUssR0FBQ0EsS0FBSyxDQUFDRSxJQUFOLEVBQU47QUFDQSxZQUFHRixLQUFLLEtBQUcsRUFBWCxFQUNJLE9BQU8sSUFBUCxDQURKLEtBR0ksT0FBTyxLQUFQO0FBQ1A7QUFDSjs7O2tDQUVvQkcsUSxFQUNyQjtBQUNJLFVBQUdKLElBQUksQ0FBQ0ssT0FBTCxDQUFhRCxRQUFiLENBQUgsRUFDSUEsUUFBUSxHQUFDLElBQVQsQ0FESixLQUdBO0FBQ0lBLGdCQUFRLElBQUUsRUFBVixDQURKLENBQ2lCOztBQUNiQSxnQkFBUSxHQUFDQSxRQUFRLENBQUNELElBQVQsRUFBVDtBQUNIO0FBQ0QsYUFBT0MsUUFBUDtBQUNIOzs7d0NBRzBCQSxRLEVBQVVFLEcsRUFDckM7QUFDSUYsY0FBUSxJQUFFLEVBQVYsQ0FESixDQUNpQjs7QUFDZCxVQUFHQSxRQUFRLENBQUNHLE1BQVQsR0FBa0JELEdBQXJCLEVBQ0tGLFFBQVEsR0FBQ0EsUUFBUSxDQUFDSSxTQUFULENBQW1CLENBQW5CLEVBQXVCRixHQUFHLEdBQUMsQ0FBM0IsSUFBK0IsS0FBeEM7QUFDSixhQUFPRixRQUFQO0FBQ0gsSyxDQUVEOzs7OytCQUNrQkEsUSxFQUFVSyxNLEVBQzVCO0FBQ0ksVUFBTUMsV0FBVyxHQUFHLElBQUlDLE1BQUosQ0FBV0MsTUFBTSxDQUFDQyxJQUFQLENBQVlKLE1BQVosRUFBb0J6VSxJQUFwQixDQUF5QixHQUF6QixDQUFYLEVBQXlDLElBQXpDLENBQXBCO0FBQ0EsYUFBT29VLFFBQVEsQ0FBQ1UsT0FBVCxDQUFpQkosV0FBakIsRUFBOEIsVUFBQ0ssT0FBRCxFQUNyQztBQUNJLGVBQU9OLE1BQU0sQ0FBQ00sT0FBRCxDQUFiO0FBQ0gsT0FITSxDQUFQO0FBSUgsSyxDQUVEOzs7O2lDQUNvQnJQLEcsRUFBSzRPLEcsRUFDekI7QUFDSTVPLFNBQUcsR0FBR3NQLElBQUksQ0FBQ0MsSUFBTCxDQUFVdlAsR0FBVixDQUFOO0FBQ0E0TyxTQUFHLEdBQUdVLElBQUksQ0FBQ0UsS0FBTCxDQUFXWixHQUFYLENBQU47QUFDQSxhQUFPVSxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWlCYixHQUFHLEdBQUc1TyxHQUF2QixDQUFYLElBQTBDQSxHQUFqRDtBQUNILEssQ0FFRDs7OzsrQkFDa0IwUCxVLEVBQ2xCO0FBQUEsVUFEOEJDLElBQzlCLHVFQURtQyxJQUNuQztBQUNJLFVBQUdyQixJQUFJLENBQUNLLE9BQUwsQ0FBYWUsVUFBYixDQUFILEVBQ0ksT0FBTyxFQUFQO0FBQ0osVUFBSUUsTUFBTSxHQUFDLElBQUlDLElBQUosQ0FBU0gsVUFBVCxDQUFYO0FBQ0EsVUFBSUksS0FBSyxHQUFDRixNQUFNLENBQUNHLE9BQVAsS0FBaUIsRUFBM0I7QUFDQSxVQUFHRCxLQUFLLENBQUNqQixNQUFOLEtBQWUsQ0FBbEIsRUFDSWlCLEtBQUssR0FBQyxNQUFJQSxLQUFWO0FBQ0osVUFBSUUsUUFBUSxHQUFFSixNQUFNLENBQUNLLFFBQVAsS0FBa0IsQ0FBbkIsR0FBc0IsRUFBbkM7QUFDQSxVQUFHRCxRQUFRLENBQUNuQixNQUFULEtBQWtCLENBQXJCLEVBQ0ltQixRQUFRLEdBQUMsTUFBSUEsUUFBYjtBQUNKLFVBQUlFLE1BQU0sR0FBQ04sTUFBTSxDQUFDTyxXQUFQLEVBQVg7QUFDQSxVQUFHUixJQUFJLEtBQUcsSUFBVixFQUNJLE9BQU9HLEtBQUssR0FBQyxHQUFOLEdBQVVFLFFBQVYsR0FBbUIsR0FBbkIsR0FBdUJFLE1BQTlCLENBREosS0FFSyxJQUFJUCxJQUFJLEtBQUcsTUFBWCxFQUFrQjtBQUNuQixlQUFPTyxNQUFNLEdBQUMsR0FBUCxHQUFXRixRQUFYLEdBQW9CLEdBQXBCLEdBQXdCRixLQUEvQixDQURDLEtBR0QsT0FBT0UsUUFBUSxHQUFDLEdBQVQsR0FBYUYsS0FBYixHQUFtQixHQUFuQixHQUF1QkksTUFBOUI7QUFDUCxLLENBRUQ7QUFDQTs7OztnQ0FDb0JFLFEsRUFBVUMsUSxFQUM5QjtBQUNJLFVBQU1DLEtBQUssR0FBQ0YsUUFBUSxHQUFDZCxJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLE1BQWVZLFFBQVEsR0FBQ0QsUUFBeEIsQ0FBWCxDQUFyQjtBQUNBLFVBQU1HLE9BQU8sR0FBQyxvREFBZDtBQUNBLFVBQU1DLE1BQU0sR0FBQyw4QkFBYjtBQUNBLFVBQUlqVCxRQUFRLEdBQUNnVCxPQUFPLENBQUNqQixJQUFJLENBQUNFLEtBQUwsQ0FBV0YsSUFBSSxDQUFDRyxNQUFMLEtBQWNjLE9BQU8sQ0FBQzFCLE1BQWpDLENBQUQsQ0FBcEI7O0FBQ0EsV0FBSSxJQUFJNEIsQ0FBQyxHQUFDLENBQVYsRUFBWUEsQ0FBQyxHQUFFSCxLQUFLLEdBQUMsQ0FBckIsRUFBd0JHLENBQUMsRUFBekIsRUFDQTtBQUNJLFlBQUlBLENBQUMsR0FBRyxDQUFMLEtBQVcsQ0FBZCxFQUNJbFQsUUFBUSxJQUFFaVQsTUFBTSxDQUFDbEIsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjZSxNQUFNLENBQUMzQixNQUFoQyxDQUFELENBQWhCLENBREosS0FHSXRSLFFBQVEsSUFBRWdULE9BQU8sQ0FBQ2pCLElBQUksQ0FBQ0UsS0FBTCxDQUFXRixJQUFJLENBQUNHLE1BQUwsS0FBY2MsT0FBTyxDQUFDMUIsTUFBakMsQ0FBRCxDQUFqQjtBQUNQOztBQUNEdFIsY0FBUSxJQUFFZ1QsT0FBTyxDQUFDakIsSUFBSSxDQUFDRSxLQUFMLENBQVdGLElBQUksQ0FBQ0csTUFBTCxLQUFjYyxPQUFPLENBQUMxQixNQUFqQyxDQUFELENBQWpCO0FBQ0EsYUFBT3RSLFFBQVA7QUFDSDs7Ozs7O0FBR0w3RCxNQUFNLENBQUNDLE9BQVAsR0FBaUIyVSxJQUFqQixDOzs7Ozs7Ozs7OztBQ25HQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEOzs7Ozs7Ozs7OztBQ3ZCQTVVLE1BQU0sQ0FBQ0MsT0FBUCxHQUNBO0FBQ0krVyxXQUFTLEVBQ1QsQ0FDSTtBQUFFdlMsVUFBTSxFQUFFLFNBQVY7QUFBcUJ3UyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDO0FBQVA7QUFBakMsR0FESixFQUVJO0FBQUV6UyxVQUFNLEVBQUUsWUFBVjtBQUF3QndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsaUJBQVA7QUFBMEJDLFFBQUUsRUFBRTtBQUE5QjtBQUFwQyxHQUZKLEVBR0k7QUFBRTFTLFVBQU0sRUFBRSxVQUFWO0FBQXNCd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQztBQUFQO0FBQWxDLEdBSEosRUFJSTtBQUFFelMsVUFBTSxFQUFFLFNBQVY7QUFBcUJ3UyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDO0FBQVA7QUFBakMsR0FKSixDQUZKO0FBUUlFLFdBQVMsRUFDVCxDQUNJO0FBQUUzUyxVQUFNLEVBQUUsU0FBVjtBQUFxQndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUFqQyxHQURKLEVBRUk7QUFBRXpTLFVBQU0sRUFBRSxrQkFBVjtBQUE4QndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsd0JBQVA7QUFBaUNHLFNBQUcsRUFBRTtBQUF0QztBQUExQyxHQUZKLEVBR0k7QUFBRTVTLFVBQU0sRUFBRSxzQkFBVjtBQUFrQ3dTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUM7QUFBUDtBQUE5QyxHQUhKLEVBSUk7QUFBRXpTLFVBQU0sRUFBRSxRQUFWO0FBQW9Cd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxXQUFQO0FBQW9CRyxTQUFHLEVBQUU7QUFBekI7QUFBaEMsR0FKSixFQUtJO0FBQUU1UyxVQUFNLEVBQUUsUUFBVjtBQUFvQndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsV0FBUDtBQUFvQkcsU0FBRyxFQUFFO0FBQXpCO0FBQWhDLEdBTEosQ0FUSjtBQWdCSUMseUJBQXVCLEVBQUUsRUFoQjdCO0FBaUJJQyxjQUFZLEVBQUcsY0FqQm5CO0FBa0JJQyxlQUFhLEVBQUcsWUFsQnBCO0FBbUJJQyxpQkFBZSxFQUFHLGNBbkJ0QjtBQW9CSUMsZUFBYSxFQUFHLGtCQXBCcEI7QUFxQklDLGdCQUFjLEVBQUcsZ0JBckJyQjtBQXNCSUMsYUFBVyxFQUFFLGFBdEJqQjtBQXVCSUMsOEJBQTRCLEVBQUUsb0JBdkJsQztBQXdCSUMscUJBQW1CLEVBQUUsMkJBeEJ6QjtBQXlCSUMsOEJBQTRCLEVBQUcsRUF6Qm5DO0FBMEJJQyxpQkFBZSxFQUFHLGFBMUJ0QjtBQTJCSUMsWUFBVSxFQUFFLDBCQTNCaEI7QUE0QklDLFlBQVUsRUFBRSxzQkE1QmhCO0FBNkJJQyxRQUFNLEVBQUUsa1NBN0JaO0FBOEJJQyxZQUFVLEVBQUUsdUJBOUJoQjtBQStCSUMsUUFBTSxFQUFFLCtjQS9CWjtBQWdDSUMsd0JBQXNCLEVBQUUsMENBaEM1QjtBQWlDSUMsd0JBQXNCLEVBQUUsaURBakM1QjtBQWtDSUMsa0JBQWdCLEVBQUUsNEJBbEN0QjtBQW1DSUMsZ0JBQWMsRUFBRSwyaUNBbkNwQjtBQW9DSUMsa0JBQWdCLEVBQUUsK0ZBcEN0QjtBQXFDSUMsYUFBVyxFQUFFO0FBckNqQixDQURBLEM7Ozs7Ozs7Ozs7O0FDQUEzWSxNQUFNLENBQUNDLE9BQVAsR0FDQTtBQUNJO0FBQ0ErVyxXQUFTLEVBQ1QsQ0FDSTtBQUFFdlMsVUFBTSxFQUFFLFNBQVY7QUFBcUJ3UyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLGVBQVA7QUFBd0JHLFNBQUcsRUFBRTtBQUE3QjtBQUFqQyxHQURKLEVBRUk7QUFBRTVTLFVBQU0sRUFBRSxXQUFWO0FBQXVCd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxTQUFQO0FBQWtCQyxRQUFFLEVBQUMsZUFBckI7QUFBc0M3VyxXQUFLLEVBQUM7QUFBNUM7QUFBbkMsR0FGSixFQUdJO0FBQUVtRSxVQUFNLEVBQUUsWUFBVjtBQUF3QndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsaUJBQVA7QUFBMEJDLFFBQUUsRUFBRSxpQkFBOUI7QUFBaUQ3VyxXQUFLLEVBQUM7QUFBdkQ7QUFBcEMsR0FISixFQUlJO0FBQUVtRSxVQUFNLEVBQUUsVUFBVjtBQUFzQndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsZ0JBQVA7QUFBeUI1VyxXQUFLLEVBQUM7QUFBL0I7QUFBbEMsR0FKSixFQUtJO0FBQUVtRSxVQUFNLEVBQUUsU0FBVjtBQUFxQndTLGNBQVUsRUFBRTtBQUFFQyxVQUFJLEVBQUMsR0FBUDtBQUFZNVcsV0FBSyxFQUFDO0FBQWxCO0FBQWpDLEdBTEosQ0FISjtBQVVJOFcsV0FBUyxFQUNULENBQ0k7QUFBRTNTLFVBQU0sRUFBRSxNQUFWO0FBQWtCd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxpRUFBUDtBQUEwRTVXLFdBQUssRUFBQztBQUFoRjtBQUE5QixHQURKLEVBRUk7QUFBRW1FLFVBQU0sRUFBRSxTQUFWO0FBQXFCd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxlQUFQO0FBQXdCNVcsV0FBSyxFQUFDO0FBQTlCO0FBQWpDLEdBRkosRUFHSTtBQUFFbUUsVUFBTSxFQUFFLGtCQUFWO0FBQThCd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyx3QkFBUDtBQUFpQ0csU0FBRyxFQUFFO0FBQXRDO0FBQTFDLEdBSEosRUFJSTtBQUFFNVMsVUFBTSxFQUFFLHNCQUFWO0FBQWtDd1MsY0FBVSxFQUFFO0FBQUVDLFVBQUksRUFBQyxlQUFQO0FBQXdCNVcsV0FBSyxFQUFDO0FBQTlCO0FBQTlDLEdBSkosRUFLSTtBQUFFbUUsVUFBTSxFQUFFLFdBQVY7QUFBdUJ3UyxjQUFVLEVBQUU7QUFBRUMsVUFBSSxFQUFDLGVBQVA7QUFBd0JHLFNBQUcsRUFBRTtBQUE3QjtBQUFuQyxHQUxKLENBWEo7QUFrQklPLGFBQVcsRUFBRSxhQWxCakI7QUFtQklnQixXQUFTLEVBQUUsZUFuQmY7QUFvQklwQixlQUFhLEVBQUUsWUFwQm5CO0FBcUJJcUIsU0FBTyxFQUFFLGNBckJiO0FBc0JJbEIsZ0JBQWMsRUFBRyxnQkF0QnJCO0FBdUJJbUIsZ0JBQWMsRUFBRyxrQkF2QnJCO0FBd0JJQyxlQUFhLEVBQUcsZUF4QnBCO0FBeUJJdEIsaUJBQWUsRUFBRyxjQXpCdEI7QUEwQkl1QixrQkFBZ0IsRUFBRyxrQkExQnZCO0FBMkJJbkIsOEJBQTRCLEVBQUUsb0JBM0JsQztBQTRCSW9CLGNBQVksRUFBRyxtQkE1Qm5CO0FBNkJJdkIsZUFBYSxFQUFHLGtCQTdCcEI7QUE4Qkl3QixtQkFBaUIsRUFBRSxhQTlCdkI7QUErQkkzQixjQUFZLEVBQUcsY0EvQm5CO0FBZ0NJNEIsaUJBQWUsRUFBRyxvQkFoQ3RCO0FBaUNJckIscUJBQW1CLEVBQUUsMkJBakN6QjtBQWtDSXNCLG9CQUFrQixFQUFHLG9CQWxDekI7O0FBbUNJO0FBQ0FuQixZQUFVLEVBQUUsMEJBcENoQjtBQXFDSVMsa0JBQWdCLEVBQUUsK0ZBckN0QjtBQXNDSVcsa0JBQWdCLEVBQUUsb0JBdEN0QjtBQXVDSUMsWUFBVSxFQUFFLDZRQXZDaEI7O0FBd0NJO0FBQ0FDLGFBQVcsRUFBRSxnQkF6Q2pCO0FBMENJckIsWUFBVSxFQUFFLHNCQTFDaEI7QUEyQ0lDLFFBQU0sRUFBRSwwVEEzQ1o7QUE0Q0lDLFlBQVUsRUFBRSxnQ0E1Q2hCO0FBNkNJQyxRQUFNLEVBQUUsbWJBN0NaO0FBOENJbUIsaUJBQWUsRUFBRSxnQ0E5Q3JCO0FBK0NJQyxxQkFBbUIsRUFBRSxnQ0EvQ3pCOztBQWdESTtBQUNBbkIsd0JBQXNCLEVBQUUsZ0VBakQ1QjtBQWtESUMsd0JBQXNCLEVBQUUsc0ZBbEQ1QjtBQW1ESW1CLGVBQWEsRUFBRSwwTkFuRG5COztBQW9ESTtBQUNBQyxjQUFZLEVBQUUsbUVBckRsQjtBQXNESUMsaUJBQWUsRUFBRSxtRkF0RHJCO0FBdURJQyxjQUFZLEVBQUUsdUtBdkRsQjs7QUF3REk7QUFDQUMsdUJBQXFCLEVBQUUsV0F6RDNCO0FBMERJQyxpQ0FBK0IsRUFBRSwwQ0ExRHJDO0FBMkRJdkIsa0JBQWdCLEVBQUUsNEJBM0R0QjtBQTRESUMsZ0JBQWMsRUFBRSw2dkJBNURwQjtBQTZESXVCLHVCQUFxQixFQUFFLGtmQTdEM0I7O0FBOERJO0FBQ0FoQyxpQkFBZSxFQUFHLGFBL0R0QjtBQWdFSWlDLGdCQUFjLEVBQUUsV0FoRXBCO0FBaUVJM0MseUJBQXVCLEVBQUUsRUFqRTdCO0FBa0VJNEMsK0JBQTZCLEVBQUUsQ0FsRW5DO0FBbUVJbkMsOEJBQTRCLEVBQUc7QUFuRW5DLENBREEsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBLElBQU05QixJQUFJLEdBQUN4VSxrRUFBYyxDQUFDLENBQUQsQ0FBekI7O0FBQ0EsSUFBTTBZLE1BQU0sR0FBR3BhLG1CQUFPLENBQUMsdURBQUQsQ0FBdEI7O0FBQ0EsSUFBTXFhLG1CQUFtQixHQUFHcmEsbUJBQU8sQ0FBQyxpRUFBRCxDQUFuQzs7QUFDQSxJQUFNc2EsV0FBVyxHQUFHdGEsbUJBQU8sQ0FBQyxpREFBRCxDQUEzQjs7QUFDQSxJQUFNdWEsb0JBQW9CLEdBQUd2YSxtQkFBTyxDQUFDLG1FQUFELENBQXBDOztBQUNBLElBQU13YSxjQUFjLEdBQUd4YSwrREFBUSxJQUFjLEdBQUN5Qix5REFBZixHQUFxQixVQUFyQixHQUFnQ3lVLElBQWhDLEdBQXFDLEtBQXRDLENBQTlCLEMsQ0FFQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0NBR0E7O2VBQ2tFbFcsbUVBQVEsSUFBYSxHQUFDa1csSUFBZCxHQUFtQixVQUFwQixDO0lBQWpFNU0sWSxZQUFBQSxZO0lBQWNPLFksWUFBQUEsWTtJQUFjYyxXLFlBQUFBLFc7SUFBYVEsWSxZQUFBQSxZOztnQkFDMENuTCx3RUFBUSxJQUFhLEdBQUNrVyxJQUFkLEdBQW1CLGVBQXBCLEM7SUFBMUY1SyxrQixhQUFBQSxrQjtJQUFvQkMsVSxhQUFBQSxVO0lBQVlFLG1CLGFBQUFBLG1CO0lBQXFCQyx5QixhQUFBQSx5Qjs7Z0JBQ2UxTCxnRUFBUSxJQUFhLEdBQUNrVyxJQUFkLEdBQW1CLE9BQXBCLEM7SUFBM0U1SixVLGFBQUFBLFU7SUFBWUMsbUIsYUFBQUEsbUI7SUFBcUJDLFcsYUFBQUEsVztJQUFhQyxpQixhQUFBQSxpQjs7Z0JBQ2F6TSxvRUFBUSxJQUFhLEdBQUNrVyxJQUFkLEdBQW1CLFdBQXBCLEM7SUFBbEVsSixjLGFBQUFBLGM7SUFBZ0JDLGUsYUFBQUEsZTtJQUFpQkMscUIsYUFBQUEscUI7O2dCQUN3R2xOLHlFQUFRLElBQWEsR0FBQ2tXLElBQWQsR0FBbUIsZ0JBQXBCLEM7SUFBaEp6SCxlLGFBQUFBLGU7SUFBaUJNLDRCLGFBQUFBLDRCO0lBQThCQyxzQixhQUFBQSxzQjtJQUF3QkUsNEIsYUFBQUEsNEI7SUFBOEJJLCtCLGFBQUFBLCtCOztnQkFDakZ0UCxnRUFBUSxJQUFhLEdBQUNrVyxJQUFkLEdBQW1CLE9BQXBCLEM7SUFBM0JyRCxlLGFBQUFBLGUsRUFFUjs7O0FBQ0EsSUFBTTRILG1CQUFtQixHQUFHQyxRQUFRLENBQUNDLGNBQVQsQ0FBd0Isc0JBQXhCLENBQTVCO0FBQ0EsSUFBTUMsdUJBQXVCLEdBQUdGLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixzQkFBeEIsQ0FBaEM7QUFDQSxJQUFNRSxjQUFjLEdBQUdILFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixlQUF4QixDQUF2QjtBQUNBLElBQU1HLFFBQVEsR0FBR0osUUFBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLENBQWpCO0FBQ0EsSUFBTUksZ0JBQWdCLEdBQUdMLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixtQkFBeEIsQ0FBekI7QUFDQSxJQUFNSyxRQUFRLEdBQUdOLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixXQUF4QixDQUFqQjtBQUNBLElBQU1NLE9BQU8sR0FBR1AsUUFBUSxDQUFDQyxjQUFULENBQXdCLGNBQXhCLENBQWhCO0FBQ0EsSUFBTU8sVUFBVSxHQUFHUixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBeEIsQ0FBbkI7QUFDQSxJQUFNUSxpQkFBaUIsR0FBR1QsUUFBUSxDQUFDQyxjQUFULENBQXdCLG9CQUF4QixDQUExQjtBQUNBLElBQU1TLFlBQVksR0FBR1YsUUFBUSxDQUFDQyxjQUFULENBQXdCLGVBQXhCLENBQXJCO0FBQ0EsSUFBTVUsV0FBVyxHQUFHWCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsVUFBeEIsQ0FBcEI7QUFDQSxJQUFNVyxlQUFlLEdBQUdaLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixjQUF4QixDQUF4QjtBQUNBLElBQU1ZLFFBQVEsR0FBR2IsUUFBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLENBQWpCO0FBQ0EsSUFBTWEsZ0JBQWdCLEdBQUdkLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixlQUF4QixDQUF6QjtBQUNBLElBQU1jLFlBQVksR0FBR2YsUUFBUSxDQUFDQyxjQUFULENBQXdCLFdBQXhCLENBQXJCO0FBQ0EsSUFBTWUsaUJBQWlCLEdBQUdoQixRQUFRLENBQUNDLGNBQVQsQ0FBd0IsZ0JBQXhCLENBQTFCO0FBQ0EsSUFBTWdCLFVBQVUsR0FBR2pCLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixRQUF4QixDQUFuQjtBQUNBLElBQU1pQixrQkFBa0IsR0FBR2xCLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixvQkFBeEIsQ0FBM0I7QUFDQSxJQUFNa0IsU0FBUyxHQUFHbkIsUUFBUSxDQUFDQyxjQUFULENBQXdCLFdBQXhCLENBQWxCO0FBQ0EsSUFBTW1CLGdCQUFnQixHQUFHcEIsUUFBUSxDQUFDQyxjQUFULENBQXdCLGtCQUF4QixDQUF6QjtBQUNBLElBQU1vQixtQkFBbUIsR0FBR3JCLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixnQkFBeEIsQ0FBNUI7QUFDQSxJQUFNcUIsVUFBVSxHQUFHdEIsUUFBUSxDQUFDQyxjQUFULENBQXdCLE9BQXhCLENBQW5CO0FBQ0EsSUFBTXNCLGdCQUFnQixHQUFHdkIsUUFBUSxDQUFDQyxjQUFULENBQXdCLGFBQXhCLENBQXpCLEMsQ0FFQTs7QUFDQSxJQUFNdUIsWUFBWSxHQUFHLFNBQWZBLFlBQWUsR0FDckI7QUFDSUMseUVBQWUsQ0FBQ1osUUFBRCxDQUFmO0FBQ0EsTUFBR2hQLG1CQUFtQixJQUFFLENBQXhCLEVBQ0ltTyxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsUUFBeEIsRUFBa0MxUixLQUFsQyxHQUF3Q3NELG1CQUF4QztBQUNKNFAseUVBQWUsQ0FBQ1gsZ0JBQUQsQ0FBZjtBQUNBVyx5RUFBZSxDQUFDVixZQUFELENBQWY7QUFDSCxDQVBELEMsQ0FTQTs7O0FBQ0EsSUFBTVcsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFDNVgsSUFBRCxFQUMxQjtBQUNJO0FBQ0EwWCxjQUFZLEdBRmhCLENBR0k7O0FBQ0FYLFVBQVEsQ0FBQ2MsS0FBVCxDQUFlQyxPQUFmLEdBQXVCLE9BQXZCLENBSkosQ0FLSTs7QUFDQUMsK0VBQXFCLENBQUNqQyxXQUFXLENBQUM5VixJQUFiLEVBQW1CK1csUUFBbkIsQ0FBckI7O0FBQ0EsT0FBSSxJQUFJaUIsSUFBUixJQUFnQmhZLElBQWhCLEVBQ0E7QUFDSSxRQUFHK1csUUFBUSxDQUFDa0IsUUFBVCxDQUFrQkQsSUFBbEIsTUFBMEJ6SCxTQUE3QixFQUNJd0csUUFBUSxDQUFDa0IsUUFBVCxDQUFrQkQsSUFBbEIsRUFBd0J2VCxLQUF4QixHQUE4QnpFLElBQUksQ0FBQ2dZLElBQUQsQ0FBbEM7QUFDUDtBQUNKLENBYkQsQyxDQWVBOzs7QUFDQSxJQUFNRSxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUNDLEtBQUQsRUFBUUMsS0FBUixFQUN0QjtBQUNJQyxrRUFBVSxDQUFDN0IsUUFBRCxFQUFXLElBQVgsRUFBaUJ2TyxpQkFBakIsQ0FBVjtBQUNBLE1BQUlxUSxTQUFTLEdBQUMsRUFBZDs7QUFDQSxPQUFJLElBQUk5RixDQUFSLElBQWEyRixLQUFiO0FBQ0lHLGFBQVMsSUFBRSxrQkFBZ0JILEtBQUssQ0FBQzNGLENBQUQsQ0FBTCxDQUFTdlMsR0FBekIsR0FBNkIsb0JBQTdCLEdBQWtEa1ksS0FBSyxDQUFDM0YsQ0FBRCxDQUFMLENBQVN0UyxNQUEzRCxHQUFrRSw4QkFBbEUsR0FBaUdpWSxLQUFLLENBQUMzRixDQUFELENBQUwsQ0FBU0ksRUFBMUcsR0FBNkcsbUJBQTdHLEdBQWlJdUYsS0FBSyxDQUFDM0YsQ0FBRCxDQUFMLENBQVNJLEVBQTFJLEdBQTZJLG9CQUE3SSxHQUFrS2pNLFlBQWxLLEdBQStLLDJCQUEvSyxHQUEyTXdSLEtBQUssQ0FBQzNGLENBQUQsQ0FBTCxDQUFTSSxFQUFwTixHQUF1TixtQkFBdk4sR0FBMk91RixLQUFLLENBQUMzRixDQUFELENBQUwsQ0FBU0ksRUFBcFAsR0FBdVAsb0JBQXZQLEdBQTRRdk4sWUFBNVEsR0FBeVIsV0FBcFM7QUFESjs7QUFFQSxNQUFHaVQsU0FBUyxLQUFHLEVBQWYsRUFDSUEsU0FBUyxHQUFDLFNBQU90USxXQUFQLEdBQW1CLE9BQTdCO0FBQ0pxUSxrRUFBVSxDQUFDN0IsUUFBRCxFQUFXLElBQVgsRUFBaUI4QixTQUFqQixFQUE0QixFQUE1QixFQUFnQyxFQUFoQyxFQUFvQyxFQUFwQyxFQUF3QyxLQUF4QyxDQUFWLENBUEosQ0FPNkQ7O0FBUDdELDZCQVFZOUYsRUFSWjtBQVVRMEQsWUFBUSxDQUFDQyxjQUFULENBQXdCLGdCQUFjZ0MsS0FBSyxDQUFDM0YsRUFBRCxDQUFMLENBQVNJLEVBQS9DLEVBQW1EMkYsZ0JBQW5ELENBQW9FLE9BQXBFLEVBQTZFLFVBQVNDLENBQVQsRUFDN0U7QUFDSUEsT0FBQyxDQUFDQyxjQUFGO0FBQ0FiLHVCQUFpQixDQUFDTyxLQUFLLENBQUMzRixFQUFELENBQU4sQ0FBakI7QUFDQWtHLFlBQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUIsUUFBdkI7QUFDSCxLQUxEO0FBTUExQyxZQUFRLENBQUNDLGNBQVQsQ0FBd0IsZ0JBQWNnQyxLQUFLLENBQUMzRixFQUFELENBQUwsQ0FBU0ksRUFBL0MsRUFBbUQyRixnQkFBbkQsQ0FBb0UsT0FBcEUsRUFBNkUsVUFBU0MsQ0FBVCxFQUM3RTtBQUNJQSxPQUFDLENBQUNDLGNBQUY7QUFDQWIsdUJBQWlCLENBQUNPLEtBQUssQ0FBQzNGLEVBQUQsQ0FBTixDQUFqQjtBQUNBdUUsY0FBUSxDQUFDa0IsUUFBVCxDQUFrQixVQUFsQixFQUE4QnhULEtBQTlCLEdBQW9DLElBQXBDO0FBQ0FvVSxrQkFBWSxDQUFDVCxLQUFELENBQVo7QUFDSCxLQU5EO0FBaEJSOztBQVFJLE9BQUksSUFBSTVGLEVBQVIsSUFBYTJGLEtBQWIsRUFDQTtBQUFBLFVBRFEzRixFQUNSO0FBY0M7O0FBQ0QsTUFBRzJGLEtBQUssQ0FBQ3ZILE1BQU4sR0FBZWdGLE1BQU0sQ0FBQ3ZXLFVBQXRCLElBQW9DdVcsTUFBTSxDQUFDdlcsVUFBUCxLQUFzQixDQUE3RCxFQUNBO0FBQ0ksUUFBSXlaLE1BQU0sR0FBQyxvREFBa0RoUixVQUFsRCxHQUE2RCxNQUF4RTtBQUNBdVEsb0VBQVUsQ0FBQzdCLFFBQUQsRUFBVyxHQUFYLEVBQWdCc0MsTUFBaEIsRUFBd0IsRUFBeEIsRUFBNEIsRUFBNUIsRUFBZ0MsRUFBaEMsRUFBcUMsS0FBckMsQ0FBVjtBQUNBNUMsWUFBUSxDQUFDQyxjQUFULENBQXdCLFNBQXhCLEVBQW1Db0MsZ0JBQW5DLENBQW9ELE9BQXBELEVBQTZELFVBQVNDLENBQVQsRUFDN0Q7QUFDSUEsT0FBQyxDQUFDQyxjQUFGO0FBQ0FmLGtCQUFZO0FBQ1pYLGNBQVEsQ0FBQ2MsS0FBVCxDQUFlQyxPQUFmLEdBQXVCLE9BQXZCO0FBQ0FmLGNBQVEsQ0FBQ2tCLFFBQVQsQ0FBa0IsaUJBQWxCLEVBQXFDeFQsS0FBckMsR0FBMkN5UyxpQkFBaUIsQ0FBQ2UsUUFBbEIsQ0FBMkIsSUFBM0IsRUFBaUN4VCxLQUE1RTtBQUNBaVUsWUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixRQUF2QjtBQUNBYixtRkFBcUIsQ0FBQ2pDLFdBQUQsRUFBY2lCLFFBQWQsQ0FBckI7QUFDSCxLQVJEO0FBU0g7QUFDSixDQXZDRCxDLENBeUNBOzs7QUFDQSxJQUFNOEIsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ1QsS0FBRCxFQUNyQjtBQUNJLE1BQU1XLGVBQWUsR0FBQzdDLFFBQVEsQ0FBQ0MsY0FBVCxDQUF3QixjQUF4QixDQUF0QjtBQUNBNEMsaUJBQWUsQ0FBQ0MsU0FBaEIsR0FBMEIsRUFBMUI7QUFDQSxNQUFJQyxLQUFLLEdBQUNDLDBFQUFrQixDQUFDbkMsUUFBRCxDQUE1QjtBQUNBLE1BQU1vQyxZQUFZLEdBQUcsSUFBSUMsY0FBSixFQUFyQjtBQUNBLE1BQUcsQ0FBQzFJLDJEQUFPLENBQUN1SSxLQUFLLENBQUNyRyxFQUFQLENBQVIsSUFBdUIsQ0FBQ2xDLDJEQUFPLENBQUN1SSxLQUFLLENBQUNJLFFBQVAsQ0FBbEMsRUFDSUYsWUFBWSxDQUFDRyxJQUFiLENBQWtCLFFBQWxCLEVBQTRCNWMsMERBQU0sR0FBQ29aLFdBQVcsQ0FBQy9WLFVBQW5CLEdBQThCa1osS0FBSyxDQUFDckcsRUFBaEUsRUFESixLQUVLLElBQUcsQ0FBQ2xDLDJEQUFPLENBQUN1SSxLQUFLLENBQUNyRyxFQUFQLENBQVgsRUFDRHVHLFlBQVksQ0FBQ0csSUFBYixDQUFrQixLQUFsQixFQUF5QjVjLDBEQUFNLEdBQUNvWixXQUFXLENBQUMvVixVQUFuQixHQUE4QmtaLEtBQUssQ0FBQ3JHLEVBQTdELEVBREMsS0FHRHVHLFlBQVksQ0FBQ0csSUFBYixDQUFrQixNQUFsQixFQUEwQjVjLDBEQUFNLEdBQUNvWixXQUFXLENBQUMvVixVQUE3Qzs7QUFDSm9aLGNBQVksQ0FBQ0ksa0JBQWIsR0FBa0MsWUFDbEM7QUFDSSxRQUFJLEtBQUtDLFVBQUwsSUFBbUJKLGNBQWMsQ0FBQ0ssSUFBdEMsRUFDQTtBQUNJLFVBQUlDLFFBQVEsR0FBQ0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS0MsWUFBaEIsQ0FBYjs7QUFDQSxVQUFJLENBQUMsS0FBS0MsTUFBTCxLQUFnQixHQUFoQixJQUF1QixLQUFLQSxNQUFMLEtBQWdCLEdBQXhDLEtBQWdESixRQUFRLENBQUNLLE9BQVQsSUFBa0J4SixTQUFsRSxJQUErRW1KLFFBQVEsQ0FBQ00sYUFBVCxJQUF3QnpKLFNBQTNHLEVBQ0E7QUFDSSxZQUFHMEosS0FBSyxDQUFDQyxPQUFOLENBQWNSLFFBQVEsQ0FBQ0ssT0FBdkIsQ0FBSCxFQUNJTCxRQUFRLENBQUNLLE9BQVQsR0FBbUJMLFFBQVEsQ0FBQ0ssT0FBVCxDQUFpQjFkLElBQWpCLENBQXNCLE1BQXRCLENBQW5CLENBREosS0FHSXFkLFFBQVEsQ0FBQ0ssT0FBVCxHQUFtQkwsUUFBUSxDQUFDSyxPQUE1QjtBQUNKN0IscUJBQWEsQ0FBQ3dCLFFBQVEsQ0FBQ00sYUFBVCxDQUF1QjdCLEtBQXhCLEVBQStCQyxLQUEvQixDQUFiLENBTEosQ0FLdUQ7O0FBQ25EQyx3RUFBVSxDQUFDN0IsUUFBRCxFQUFXLEdBQVgsRUFBZ0JrRCxRQUFRLENBQUNLLE9BQXpCLEVBQWtDLEVBQWxDLEVBQXNDLENBQUMsU0FBRCxDQUF0QyxFQUFtRCxFQUFuRCxFQUF1RCxLQUF2RCxDQUFWO0FBQ0FyQyxvQkFBWTtBQUNaZ0IsY0FBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixZQUF2QjtBQUNBdUIsOEJBQXNCLENBQUMvQixLQUFELENBQXRCLENBVEosQ0FTa0M7QUFDakMsT0FYRCxNQVlLLElBQUlzQixRQUFRLENBQUNVLE1BQWIsRUFDTDtBQUNJLFlBQUdILEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFRLENBQUNVLE1BQXZCLENBQUgsRUFDSVYsUUFBUSxDQUFDVSxNQUFULEdBQWtCVixRQUFRLENBQUNVLE1BQVQsQ0FBZ0IvZCxJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURKLEtBR0lxZCxRQUFRLENBQUNVLE1BQVQsR0FBa0JqVSxXQUFsQjtBQUNKa1Msd0VBQVUsQ0FBQ1UsZUFBRCxFQUFrQixHQUFsQixFQUF1QlcsUUFBUSxDQUFDVSxNQUFoQyxFQUF3QyxFQUF4QyxFQUE0QyxDQUFDLE9BQUQsQ0FBNUMsQ0FBVjtBQUNILE9BUEksTUFTRC9CLGdFQUFVLENBQUNVLGVBQUQsRUFBa0IsR0FBbEIsRUFBdUI1UyxXQUF2QixFQUFvQyxFQUFwQyxFQUF3QyxDQUFDLE9BQUQsQ0FBeEMsQ0FBVjtBQUNQO0FBQ0osR0E1QkQ7O0FBNkJBZ1QsY0FBWSxDQUFDa0IsZ0JBQWIsQ0FBOEIsY0FBOUIsRUFBOEMsa0JBQTlDO0FBQ0FsQixjQUFZLENBQUNrQixnQkFBYixDQUE4QixlQUE5QixFQUErQyxZQUFVakMsS0FBekQ7QUFDQWUsY0FBWSxDQUFDbUIsSUFBYixDQUFrQlgsSUFBSSxDQUFDWSxTQUFMLENBQWV0QixLQUFmLENBQWxCO0FBQ0gsQ0E1Q0QsQyxDQThDQTs7O0FBQ0EsSUFBTXVCLHlCQUF5QixHQUFHLFNBQTVCQSx5QkFBNEIsQ0FBQzVlLFlBQUQsRUFDbEM7QUFDSTtBQUNBOGIsY0FBWSxHQUZoQixDQUdJOztBQUNBVixrQkFBZ0IsQ0FBQ2EsS0FBakIsQ0FBdUJDLE9BQXZCLEdBQStCLE9BQS9CLENBSkosQ0FLSTs7QUFDQUMsK0VBQXFCLENBQUNsQyxtQkFBbUIsQ0FBQ2phLFlBQXJCLEVBQW1Db2IsZ0JBQW5DLENBQXJCLENBTkosQ0FPSTs7QUFDQUEsa0JBQWdCLENBQUNpQixRQUFqQixDQUEwQixPQUExQixFQUFtQ3dDLGVBQW5DLENBQW1ELFVBQW5EOztBQUNBLE9BQUksSUFBSXpDLElBQVIsSUFBZ0JwYyxZQUFoQixFQUNBO0FBQ0ksUUFBR29iLGdCQUFnQixDQUFDaUIsUUFBakIsQ0FBMEJELElBQTFCLE1BQWtDekgsU0FBckMsRUFDSXlHLGdCQUFnQixDQUFDaUIsUUFBakIsQ0FBMEJELElBQTFCLEVBQWdDdlQsS0FBaEMsR0FBc0M3SSxZQUFZLENBQUNvYyxJQUFELENBQWxEO0FBQ1A7QUFDSixDQWZELEMsQ0FpQkE7OztBQUNBLElBQU0wQyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQUNDLGFBQUQsRUFBZ0J2QyxLQUFoQixFQUM5QjtBQUNJQyxrRUFBVSxDQUFDOUIsZ0JBQUQsRUFBbUIsSUFBbkIsRUFBeUJyUCx5QkFBekIsQ0FBVjtBQUNBLE1BQUkwVCxpQkFBaUIsR0FBQyxFQUF0Qjs7QUFDQSxPQUFJLElBQUlwSSxDQUFSLElBQWFtSSxhQUFiO0FBQ0lDLHFCQUFpQixJQUFFLGtCQUFnQjVFLGNBQWMsQ0FBQ3ZDLGVBQS9CLEdBQStDa0gsYUFBYSxDQUFDbkksQ0FBRCxDQUFiLENBQWlCdlMsR0FBaEUsR0FBb0UsOEJBQXBFLEdBQW1HK1YsY0FBYyxDQUFDdkMsZUFBbEgsR0FBa0lrSCxhQUFhLENBQUNuSSxDQUFELENBQWIsQ0FBaUJ2UyxHQUFuSixHQUF1SixTQUF2SixHQUFpSzhHLFVBQWpLLEdBQTRLLGlFQUE1SyxHQUE4TzRULGFBQWEsQ0FBQ25JLENBQUQsQ0FBYixDQUFpQkksRUFBL1AsR0FBa1EsMkJBQWxRLEdBQThSK0gsYUFBYSxDQUFDbkksQ0FBRCxDQUFiLENBQWlCSSxFQUEvUyxHQUFrVCxtQkFBbFQsR0FBc1VqTSxZQUF0VSxHQUFtVixtQ0FBblYsR0FBdVhnVSxhQUFhLENBQUNuSSxDQUFELENBQWIsQ0FBaUJJLEVBQXhZLEdBQTJZLDJCQUEzWSxHQUF1YStILGFBQWEsQ0FBQ25JLENBQUQsQ0FBYixDQUFpQkksRUFBeGIsR0FBMmIsbUJBQTNiLEdBQStjdk4sWUFBL2MsR0FBNGQsV0FBL2U7QUFESjs7QUFFQSxNQUFHdVYsaUJBQWlCLEtBQUssRUFBekIsRUFDSUEsaUJBQWlCLEdBQUMsU0FBTzNULG1CQUFQLEdBQTJCLE9BQTdDO0FBQ0pvUixrRUFBVSxDQUFDOUIsZ0JBQUQsRUFBbUIsSUFBbkIsRUFBeUJxRSxpQkFBekIsRUFBNEMsRUFBNUMsRUFBZ0QsRUFBaEQsRUFBb0QsRUFBcEQsRUFBd0QsS0FBeEQsQ0FBVixDQVBKLENBTzZFOztBQVA3RSwrQkFRWXBJLEdBUlo7QUFVUTBELFlBQVEsQ0FBQ0MsY0FBVCxDQUF3Qix3QkFBc0J3RSxhQUFhLENBQUNuSSxHQUFELENBQWIsQ0FBaUJJLEVBQS9ELEVBQW1FMkYsZ0JBQW5FLENBQW9GLE9BQXBGLEVBQTZGLFVBQVNDLENBQVQsRUFDN0Y7QUFDSUEsT0FBQyxDQUFDQyxjQUFGO0FBQ0ErQiwrQkFBeUIsQ0FBQ0csYUFBYSxDQUFDbkksR0FBRCxDQUFkLENBQXpCO0FBQ0FrRyxZQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCLGdCQUF2QjtBQUNILEtBTEQ7QUFNQTFDLFlBQVEsQ0FBQ0MsY0FBVCxDQUF3Qix3QkFBc0J3RSxhQUFhLENBQUNuSSxHQUFELENBQWIsQ0FBaUJJLEVBQS9ELEVBQW1FMkYsZ0JBQW5FLENBQW9GLE9BQXBGLEVBQTZGLFVBQVNDLENBQVQsRUFDN0Y7QUFDSUEsT0FBQyxDQUFDQyxjQUFGO0FBQ0ErQiwrQkFBeUIsQ0FBQ0csYUFBYSxDQUFDbkksR0FBRCxDQUFkLENBQXpCO0FBQ0F3RSxzQkFBZ0IsQ0FBQ2lCLFFBQWpCLENBQTBCLFVBQTFCLEVBQXNDeFQsS0FBdEMsR0FBNEMsSUFBNUM7QUFDQW9XLDBCQUFvQixDQUFDekMsS0FBRCxDQUFwQjtBQUNILEtBTkQ7QUFoQlI7O0FBUUksT0FBSSxJQUFJNUYsR0FBUixJQUFhbUksYUFBYixFQUNBO0FBQUEsV0FEUW5JLEdBQ1I7QUFjQzs7QUFDRCxNQUFHbUksYUFBYSxDQUFDL0osTUFBZCxHQUF1QmdGLE1BQU0sQ0FBQzVXLGtCQUE5QixJQUFvRDRXLE1BQU0sQ0FBQzVXLGtCQUFQLEtBQThCLENBQXJGLEVBQ0E7QUFDSSxRQUFJOFosTUFBTSxHQUFDLG9FQUFrRWhTLGtCQUFsRSxHQUFxRixNQUFoRztBQUNBdVIsb0VBQVUsQ0FBQzlCLGdCQUFELEVBQW1CLEdBQW5CLEVBQXdCdUMsTUFBeEIsRUFBZ0MsRUFBaEMsRUFBb0MsRUFBcEMsRUFBd0MsRUFBeEMsRUFBNkMsS0FBN0MsQ0FBVjtBQUNBNUMsWUFBUSxDQUFDQyxjQUFULENBQXdCLGlCQUF4QixFQUEyQ29DLGdCQUEzQyxDQUE0RCxPQUE1RCxFQUFxRSxVQUFTQyxDQUFULEVBQ3JFO0FBQ0lBLE9BQUMsQ0FBQ0MsY0FBRjtBQUNBZixrQkFBWTtBQUNaVixzQkFBZ0IsQ0FBQ2EsS0FBakIsQ0FBdUJDLE9BQXZCLEdBQStCLE9BQS9CO0FBQ0FkLHNCQUFnQixDQUFDaUIsUUFBakIsQ0FBMEIsaUJBQTFCLEVBQTZDeFQsS0FBN0MsR0FBbUR5UyxpQkFBaUIsQ0FBQ2UsUUFBbEIsQ0FBMkIsSUFBM0IsRUFBaUN4VCxLQUFwRjtBQUNBaVUsWUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixnQkFBdkI7QUFDQWIsbUZBQXFCLENBQUNsQyxtQkFBRCxFQUFzQm1CLGdCQUF0QixDQUFyQjtBQUNILEtBUkQ7QUFTSDtBQUNKLENBdkNELEMsQ0F5Q0E7OztBQUNBLElBQU02RCxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQUN6QyxLQUFELEVBQzdCO0FBQ0ksTUFBTTBDLHVCQUF1QixHQUFDNUUsUUFBUSxDQUFDQyxjQUFULENBQXdCLHNCQUF4QixDQUE5QjtBQUNBMkUseUJBQXVCLENBQUM5QixTQUF4QixHQUFrQyxFQUFsQztBQUNBLE1BQUlDLEtBQUssR0FBQ0MsMEVBQWtCLENBQUNsQyxnQkFBRCxDQUE1QjtBQUNBLE1BQUkrRCxjQUFjLEdBQUMsSUFBSUMsUUFBSixDQUFhaEUsZ0JBQWIsQ0FBbkIsQ0FKSixDQUl1RDs7QUFDbkQsTUFBTWlFLG9CQUFvQixHQUFHLElBQUk3QixjQUFKLEVBQTdCO0FBQ0EsTUFBRyxDQUFDMUksMkRBQU8sQ0FBQ3VJLEtBQUssQ0FBQ3JHLEVBQVAsQ0FBUixJQUF1QixDQUFDbEMsMkRBQU8sQ0FBQ3VJLEtBQUssQ0FBQ0ksUUFBUCxDQUFsQyxFQUNJNEIsb0JBQW9CLENBQUMzQixJQUFyQixDQUEwQixRQUExQixFQUFvQzVjLDBEQUFNLEdBQUNtWixtQkFBbUIsQ0FBQ2xhLGtCQUEzQixHQUE4Q3NkLEtBQUssQ0FBQ3JHLEVBQXhGLEVBREosS0FFSyxJQUFHLENBQUNsQywyREFBTyxDQUFDdUksS0FBSyxDQUFDckcsRUFBUCxDQUFYLEVBQ0RxSSxvQkFBb0IsQ0FBQzNCLElBQXJCLENBQTBCLEtBQTFCLEVBQWlDNWMsMERBQU0sR0FBQ21aLG1CQUFtQixDQUFDbGEsa0JBQTNCLEdBQThDc2QsS0FBSyxDQUFDckcsRUFBckYsRUFEQyxLQUdEcUksb0JBQW9CLENBQUMzQixJQUFyQixDQUEwQixNQUExQixFQUFrQzVjLDBEQUFNLEdBQUNtWixtQkFBbUIsQ0FBQ2xhLGtCQUE3RDs7QUFDSnNmLHNCQUFvQixDQUFDMUIsa0JBQXJCLEdBQTBDLFlBQzFDO0FBQ0ksUUFBSSxLQUFLQyxVQUFMLElBQW1CSixjQUFjLENBQUNLLElBQXRDLEVBQ0E7QUFDSSxVQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtDLFlBQWhCLENBQWI7O0FBQ0EsVUFBSSxDQUFDLEtBQUtDLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUIsS0FBS0EsTUFBTCxLQUFnQixHQUF4QyxLQUFnREosUUFBUSxDQUFDSyxPQUFULElBQWtCeEosU0FBbEUsSUFBK0VtSixRQUFRLENBQUNNLGFBQVQsSUFBd0J6SixTQUEzRyxFQUNBO0FBQ0ksWUFBRzBKLEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFRLENBQUNLLE9BQXZCLENBQUgsRUFDSUwsUUFBUSxDQUFDSyxPQUFULEdBQW1CTCxRQUFRLENBQUNLLE9BQVQsQ0FBaUIxZCxJQUFqQixDQUFzQixNQUF0QixDQUFuQixDQURKLEtBR0lxZCxRQUFRLENBQUNLLE9BQVQsR0FBbUJMLFFBQVEsQ0FBQ0ssT0FBNUI7QUFDSlcsNkJBQXFCLENBQUNoQixRQUFRLENBQUNNLGFBQVQsQ0FBdUJXLGFBQXhCLEVBQXVDdkMsS0FBdkMsQ0FBckIsQ0FMSixDQUt1RTs7QUFDbkVDLHdFQUFVLENBQUM5QixnQkFBRCxFQUFtQixHQUFuQixFQUF3Qm1ELFFBQVEsQ0FBQ0ssT0FBakMsRUFBMEMsRUFBMUMsRUFBOEMsQ0FBQyxTQUFELENBQTlDLEVBQTJELEVBQTNELEVBQStELEtBQS9ELENBQVY7QUFDQXJDLG9CQUFZO0FBQ1pnQixjQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCLG9CQUF2QjtBQUNBdUIsOEJBQXNCLENBQUMvQixLQUFELENBQXRCLENBVEosQ0FTa0M7QUFDakMsT0FYRCxNQVlLLElBQUlzQixRQUFRLENBQUNVLE1BQWIsRUFDTDtBQUNJLFlBQUdILEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFRLENBQUNVLE1BQXZCLENBQUgsRUFDSVYsUUFBUSxDQUFDVSxNQUFULEdBQWtCVixRQUFRLENBQUNVLE1BQVQsQ0FBZ0IvZCxJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURKLEtBR0lxZCxRQUFRLENBQUNVLE1BQVQsR0FBa0JqVSxXQUFsQjtBQUNKa1Msd0VBQVUsQ0FBQ3lDLHVCQUFELEVBQTBCLEdBQTFCLEVBQStCcEIsUUFBUSxDQUFDVSxNQUF4QyxFQUFnRCxFQUFoRCxFQUFvRCxDQUFDLE9BQUQsQ0FBcEQsQ0FBVjtBQUNILE9BUEksTUFTRC9CLGdFQUFVLENBQUN5Qyx1QkFBRCxFQUEwQixHQUExQixFQUErQjNVLFdBQS9CLEVBQTRDLEVBQTVDLEVBQWdELENBQUMsT0FBRCxDQUFoRCxDQUFWO0FBQ1A7QUFDSixHQTVCRDs7QUE2QkE4VSxzQkFBb0IsQ0FBQ1osZ0JBQXJCLENBQXNDLGVBQXRDLEVBQXVELFlBQVVqQyxLQUFqRTtBQUNBNkMsc0JBQW9CLENBQUNYLElBQXJCLENBQTBCUyxjQUExQjtBQUNILENBNUNELEMsQ0E4Q0E7OztBQUNBLElBQU1HLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQ3RaLFFBQUQsRUFDOUI7QUFDSTtBQUNBOFYsY0FBWSxHQUZoQixDQUdJOztBQUNBVCxjQUFZLENBQUNZLEtBQWIsQ0FBbUJDLE9BQW5CLEdBQTJCLE9BQTNCOztBQUNBLE9BQUksSUFBSUUsSUFBUixJQUFnQnBXLFFBQVEsQ0FBQ0EsUUFBekIsRUFDQTtBQUNJLFFBQUdxVixZQUFZLENBQUNnQixRQUFiLENBQXNCRCxJQUF0QixNQUE4QnpILFNBQWpDLEVBQ0kwRyxZQUFZLENBQUNnQixRQUFiLENBQXNCRCxJQUF0QixFQUE0QnZULEtBQTVCLEdBQWtDN0MsUUFBUSxDQUFDQSxRQUFULENBQWtCb1csSUFBbEIsQ0FBbEM7QUFDUCxHQVRMLENBVUk7OztBQUNBRCwrRUFBcUIsQ0FBQ2hDLG9CQUFvQixDQUFDblUsUUFBdEIsRUFBZ0NxVixZQUFoQyxDQUFyQjs7QUFDQSxPQUFJLElBQUllLEtBQVIsSUFBZ0JwVyxRQUFRLENBQUN1WixPQUF6QixFQUNBO0FBQ0ksUUFBR2xFLFlBQVksQ0FBQ2dCLFFBQWIsQ0FBc0IsZUFBYUQsS0FBbkMsTUFBMkN6SCxTQUE5QyxFQUNBO0FBQ0kwRyxrQkFBWSxDQUFDZ0IsUUFBYixDQUFzQixlQUFhRCxLQUFuQyxFQUF5Q3ZULEtBQXpDLEdBQStDN0MsUUFBUSxDQUFDdVosT0FBVCxDQUFpQm5ELEtBQWpCLEVBQXVCblcsSUFBdEU7QUFDQSxVQUFHRCxRQUFRLENBQUN1WixPQUFULENBQWlCbkQsS0FBakIsRUFBdUJvRCxTQUF2QixJQUFrQyxJQUFyQyxFQUNJbkUsWUFBWSxDQUFDZ0IsUUFBYixDQUFzQixvQkFBa0JELEtBQXhDLEVBQThDcUQsT0FBOUMsR0FBc0QsSUFBdEQ7QUFDSnBFLGtCQUFZLENBQUNnQixRQUFiLENBQXNCLGFBQVdELEtBQWpDLEVBQXVDdlQsS0FBdkMsR0FBNkM3QyxRQUFRLENBQUN1WixPQUFULENBQWlCbkQsS0FBakIsRUFBdUJwRixFQUFwRTtBQUNIO0FBQ0o7QUFDSixDQXZCRCxDLENBeUJBOzs7QUFDQSxJQUFNMEksaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFDQyxTQUFELEVBQVluRCxLQUFaLEVBQzFCO0FBQ0lDLGtFQUFVLENBQUN6QixZQUFELEVBQWUsSUFBZixFQUFxQmxPLHFCQUFyQixDQUFWO0FBQ0EsTUFBSThTLGFBQWEsR0FBQyxFQUFsQjs7QUFDQSxPQUFJLElBQUloSixDQUFSLElBQWErSSxTQUFiO0FBQ0lDLGlCQUFhLElBQUUsU0FBT0QsU0FBUyxDQUFDL0ksQ0FBRCxDQUFULENBQWE1USxRQUFiLENBQXNCRSxJQUE3QixHQUFrQyxLQUFsQyxHQUF3Q3laLFNBQVMsQ0FBQy9JLENBQUQsQ0FBVCxDQUFhNVEsUUFBYixDQUFzQkMsSUFBOUQsR0FBbUUsOEJBQW5FLEdBQWtHMFosU0FBUyxDQUFDL0ksQ0FBRCxDQUFULENBQWE1USxRQUFiLENBQXNCZ1IsRUFBeEgsR0FBMkgsdUJBQTNILEdBQW1KMkksU0FBUyxDQUFDL0ksQ0FBRCxDQUFULENBQWE1USxRQUFiLENBQXNCZ1IsRUFBekssR0FBNEssbUJBQTVLLEdBQWdNak0sWUFBaE0sR0FBNk0sK0JBQTdNLEdBQTZPNFUsU0FBUyxDQUFDL0ksQ0FBRCxDQUFULENBQWE1USxRQUFiLENBQXNCZ1IsRUFBblEsR0FBc1EsdUJBQXRRLEdBQThSMkksU0FBUyxDQUFDL0ksQ0FBRCxDQUFULENBQWE1USxRQUFiLENBQXNCZ1IsRUFBcFQsR0FBdVQsbUJBQXZULEdBQTJVdk4sWUFBM1UsR0FBd1YsV0FBdlc7QUFESjs7QUFFQSxNQUFHbVcsYUFBYSxLQUFLLEVBQXJCLEVBQ0lBLGFBQWEsR0FBQyxTQUFPL1MsZUFBUCxHQUF1QixPQUFyQztBQUNKNFAsa0VBQVUsQ0FBQ3pCLFlBQUQsRUFBZSxJQUFmLEVBQXFCNEUsYUFBckIsRUFBb0MsRUFBcEMsRUFBd0MsRUFBeEMsRUFBNEMsRUFBNUMsRUFBZ0QsS0FBaEQsQ0FBVixDQVBKLENBT3FFOztBQVByRSwrQkFRWWhKLEdBUlo7QUFVUTBELFlBQVEsQ0FBQ0MsY0FBVCxDQUF3QixvQkFBa0JvRixTQUFTLENBQUMvSSxHQUFELENBQVQsQ0FBYTVRLFFBQWIsQ0FBc0JnUixFQUFoRSxFQUFvRTJGLGdCQUFwRSxDQUFxRixPQUFyRixFQUE4RixVQUFTQyxDQUFULEVBQzlGO0FBQ0lBLE9BQUMsQ0FBQ0MsY0FBRjtBQUNBeUMsMkJBQXFCLENBQUNLLFNBQVMsQ0FBQy9JLEdBQUQsQ0FBVixDQUFyQjtBQUNBa0csWUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixZQUF2QjtBQUNILEtBTEQ7QUFNQTFDLFlBQVEsQ0FBQ0MsY0FBVCxDQUF3QixvQkFBa0JvRixTQUFTLENBQUMvSSxHQUFELENBQVQsQ0FBYTVRLFFBQWIsQ0FBc0JnUixFQUFoRSxFQUFvRTJGLGdCQUFwRSxDQUFxRixPQUFyRixFQUE4RixVQUFTQyxDQUFULEVBQzlGO0FBQ0lBLE9BQUMsQ0FBQ0MsY0FBRjtBQUNBeUMsMkJBQXFCLENBQUNLLFNBQVMsQ0FBQy9JLEdBQUQsQ0FBVixDQUFyQjtBQUNBeUUsa0JBQVksQ0FBQ2dCLFFBQWIsQ0FBc0IsVUFBdEIsRUFBa0N4VCxLQUFsQyxHQUF3QyxJQUF4QztBQUNBZ1gsc0JBQWdCLENBQUNyRCxLQUFELENBQWhCO0FBQ0gsS0FORDtBQWhCUjs7QUFRSSxPQUFJLElBQUk1RixHQUFSLElBQWErSSxTQUFiLEVBQ0E7QUFBQSxXQURRL0ksR0FDUjtBQWNDOztBQUNELE1BQUcrSSxTQUFTLENBQUMzSyxNQUFWLEdBQW1CZ0YsTUFBTSxDQUFDdlgsY0FBMUIsSUFBNEN1WCxNQUFNLENBQUN2WCxjQUFQLEtBQTBCLENBQXpFLEVBQ0E7QUFDSSxRQUFJeWEsTUFBTSxHQUFDLDREQUEwRHRRLGNBQTFELEdBQXlFLE1BQXBGO0FBQ0E2UCxvRUFBVSxDQUFDekIsWUFBRCxFQUFlLEdBQWYsRUFBb0JrQyxNQUFwQixFQUE0QixFQUE1QixFQUFnQyxFQUFoQyxFQUFvQyxFQUFwQyxFQUF5QyxLQUF6QyxDQUFWO0FBQ0E1QyxZQUFRLENBQUNDLGNBQVQsQ0FBd0IsYUFBeEIsRUFBdUNvQyxnQkFBdkMsQ0FBd0QsT0FBeEQsRUFBaUUsVUFBU0MsQ0FBVCxFQUNqRTtBQUNJQSxPQUFDLENBQUNDLGNBQUY7QUFDQWYsa0JBQVk7QUFDWlQsa0JBQVksQ0FBQ1ksS0FBYixDQUFtQkMsT0FBbkIsR0FBMkIsT0FBM0I7QUFDQWIsa0JBQVksQ0FBQ2dCLFFBQWIsQ0FBc0IsaUJBQXRCLEVBQXlDeFQsS0FBekMsR0FBK0N5UyxpQkFBaUIsQ0FBQ2UsUUFBbEIsQ0FBMkIsSUFBM0IsRUFBaUN4VCxLQUFoRjtBQUNBd1Msa0JBQVksQ0FBQ2dCLFFBQWIsQ0FBc0IsTUFBdEIsRUFBOEJ4VCxLQUE5QixHQUFxQzhXLFNBQVMsQ0FBQzNLLE1BQVYsS0FBbUIsQ0FBcEIsR0FBeUJtRixvQkFBb0IsQ0FBQ25VLFFBQXJCLENBQThCRSxJQUE5QixDQUFtQ0UsWUFBNUQsR0FBMkV1WixTQUFTLENBQUMzSyxNQUFWLEdBQWlCLENBQWhJO0FBQ0E4SCxZQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCLFlBQXZCO0FBQ0FiLG1GQUFxQixDQUFDaEMsb0JBQW9CLENBQUNuVSxRQUF0QixFQUFnQ3FWLFlBQWhDLENBQXJCO0FBQ0gsS0FURDtBQVVIO0FBQ0osQ0F4Q0QsQyxDQTBDQTs7O0FBQ0EsSUFBTXdFLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FBQ3JELEtBQUQsRUFDekI7QUFDSSxNQUFNc0QsbUJBQW1CLEdBQUN4RixRQUFRLENBQUNDLGNBQVQsQ0FBd0Isa0JBQXhCLENBQTFCO0FBQ0F1RixxQkFBbUIsQ0FBQzFDLFNBQXBCLEdBQThCLEVBQTlCO0FBQ0EsTUFBSUMsS0FBSyxHQUFDQywwRUFBa0IsQ0FBQ2pDLFlBQUQsQ0FBNUI7QUFDQSxNQUFNMEUsZ0JBQWdCLEdBQUcsSUFBSXZDLGNBQUosRUFBekI7QUFDQSxNQUFHLENBQUMxSSwyREFBTyxDQUFDdUksS0FBSyxDQUFDckcsRUFBUCxDQUFSLElBQXVCLENBQUNsQywyREFBTyxDQUFDdUksS0FBSyxDQUFDSSxRQUFQLENBQWxDLEVBQ0lzQyxnQkFBZ0IsQ0FBQ3JDLElBQWpCLENBQXNCLFFBQXRCLEVBQWdDNWMsMERBQU0sR0FBQ3FaLG9CQUFvQixDQUFDOVUsY0FBNUIsR0FBMkNnWSxLQUFLLENBQUNyRyxFQUFqRixFQURKLEtBRUssSUFBRyxDQUFDbEMsMkRBQU8sQ0FBQ3VJLEtBQUssQ0FBQ3JHLEVBQVAsQ0FBWCxFQUNEK0ksZ0JBQWdCLENBQUNyQyxJQUFqQixDQUFzQixLQUF0QixFQUE2QjVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzlVLGNBQTVCLEdBQTJDZ1ksS0FBSyxDQUFDckcsRUFBOUUsRUFEQyxDQUNpRjtBQURqRixPQUdEK0ksZ0JBQWdCLENBQUNyQyxJQUFqQixDQUFzQixNQUF0QixFQUE4QjVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzlVLGNBQTFELEVBVlIsQ0FVa0Y7O0FBQzlFMGEsa0JBQWdCLENBQUNwQyxrQkFBakIsR0FBc0MsWUFDdEM7QUFDSSxRQUFJLEtBQUtDLFVBQUwsSUFBbUJKLGNBQWMsQ0FBQ0ssSUFBdEMsRUFDQTtBQUNJLFVBQUlDLFFBQVEsR0FBQ0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS0MsWUFBaEIsQ0FBYjs7QUFDQSxVQUFJLENBQUMsS0FBS0MsTUFBTCxLQUFnQixHQUFoQixJQUF1QixLQUFLQSxNQUFMLEtBQWdCLEdBQXhDLEtBQWdESixRQUFRLENBQUNLLE9BQVQsSUFBa0J4SixTQUFsRSxJQUErRW1KLFFBQVEsQ0FBQ00sYUFBVCxJQUF3QnpKLFNBQTNHLEVBQ0E7QUFDSSxZQUFHMEosS0FBSyxDQUFDQyxPQUFOLENBQWNSLFFBQVEsQ0FBQ0ssT0FBdkIsQ0FBSCxFQUNJTCxRQUFRLENBQUNLLE9BQVQsR0FBbUJMLFFBQVEsQ0FBQ0ssT0FBVCxDQUFpQjFkLElBQWpCLENBQXNCLE1BQXRCLENBQW5CLENBREosS0FHSXFkLFFBQVEsQ0FBQ0ssT0FBVCxHQUFtQkwsUUFBUSxDQUFDSyxPQUE1QjtBQUNKdUIseUJBQWlCLENBQUM1QixRQUFRLENBQUNNLGFBQVQsQ0FBdUJ1QixTQUF4QixFQUFtQ25ELEtBQW5DLENBQWpCLENBTEosQ0FLK0Q7O0FBQzNEQyx3RUFBVSxDQUFDekIsWUFBRCxFQUFlLEdBQWYsRUFBb0I4QyxRQUFRLENBQUNLLE9BQTdCLEVBQXNDLEVBQXRDLEVBQTBDLENBQUMsU0FBRCxDQUExQyxFQUF1RCxFQUF2RCxFQUEyRCxLQUEzRCxDQUFWO0FBQ0FyQyxvQkFBWTtBQUNaZ0IsY0FBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixnQkFBdkI7QUFDQXVCLDhCQUFzQixDQUFDL0IsS0FBRCxDQUF0QixDQVRKLENBU2tDO0FBQ2pDLE9BWEQsTUFZSyxJQUFJc0IsUUFBUSxDQUFDVSxNQUFiLEVBQ0w7QUFDSSxZQUFHSCxLQUFLLENBQUNDLE9BQU4sQ0FBY1IsUUFBUSxDQUFDVSxNQUF2QixDQUFILEVBQ0lWLFFBQVEsQ0FBQ1UsTUFBVCxHQUFrQlYsUUFBUSxDQUFDVSxNQUFULENBQWdCL2QsSUFBaEIsQ0FBcUIsTUFBckIsQ0FBbEIsQ0FESixLQUdJcWQsUUFBUSxDQUFDVSxNQUFULEdBQWtCalUsV0FBbEI7QUFDSmtTLHdFQUFVLENBQUNxRCxtQkFBRCxFQUFzQixHQUF0QixFQUEyQmhDLFFBQVEsQ0FBQ1UsTUFBcEMsRUFBNEMsRUFBNUMsRUFBZ0QsQ0FBQyxPQUFELENBQWhELENBQVY7QUFDSCxPQVBJLE1BU0QvQixnRUFBVSxDQUFDcUQsbUJBQUQsRUFBc0IsR0FBdEIsRUFBMkJ2VixXQUEzQixFQUF3QyxFQUF4QyxFQUE0QyxDQUFDLE9BQUQsQ0FBNUMsQ0FBVjtBQUNQO0FBQ0osR0E1QkQ7O0FBNkJBd1Ysa0JBQWdCLENBQUN0QixnQkFBakIsQ0FBa0MsY0FBbEMsRUFBa0Qsa0JBQWxEO0FBQ0FzQixrQkFBZ0IsQ0FBQ3RCLGdCQUFqQixDQUFrQyxlQUFsQyxFQUFtRCxZQUFVakMsS0FBN0Q7QUFDQXVELGtCQUFnQixDQUFDckIsSUFBakIsQ0FBc0JYLElBQUksQ0FBQ1ksU0FBTCxDQUFldEIsS0FBZixDQUF0QjtBQUNILENBNUNELEMsQ0E4Q0E7OztBQUNBLElBQU0yQywwQkFBMEIsR0FBRyxTQUE3QkEsMEJBQTZCLENBQUNoSixFQUFELEVBQUt3RixLQUFMLEVBQ25DO0FBQ0ksTUFBTXlELFdBQVcsR0FBRyxJQUFJekMsY0FBSixFQUFwQjtBQUNBeUMsYUFBVyxDQUFDdkMsSUFBWixDQUFpQixLQUFqQixFQUF3QjVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRDRWLG9CQUFvQixDQUFDMVYsc0JBQXJFLEdBQTRGLEdBQTVGLEdBQWdHdVMsRUFBeEg7O0FBQ0FpSixhQUFXLENBQUN0QyxrQkFBWixHQUFpQyxZQUNqQztBQUNJLFFBQUksS0FBS0MsVUFBTCxJQUFtQkosY0FBYyxDQUFDSyxJQUF0QyxFQUNBO0FBQ0ksVUFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiOztBQUNBLFVBQUksS0FBS0MsTUFBTCxLQUFnQixHQUFoQixJQUF1QkosUUFBUSxDQUFDblksYUFBVCxJQUEwQmdQLFNBQXJELEVBQ0E7QUFDSTJHLHlCQUFpQixDQUFDNEUsS0FBbEIsR0FESixDQUM4Qjs7QUFDMUIsYUFBSSxJQUFJOUQsSUFBUixJQUFnQjBCLFFBQVEsQ0FBQ25ZLGFBQXpCLEVBQ0E7QUFDSSxjQUFHMlYsaUJBQWlCLENBQUNlLFFBQWxCLENBQTJCRCxJQUEzQixNQUFtQ3pILFNBQXRDLEVBQ0E7QUFDSSxnQkFBR3lILElBQUksS0FBRyxjQUFQLElBQXlCMEIsUUFBUSxDQUFDblksYUFBVCxDQUF1QnlXLElBQXZCLE1BQStCLElBQTNELEVBQ0lkLGlCQUFpQixDQUFDZSxRQUFsQixDQUEyQkQsSUFBM0IsRUFBaUN2VCxLQUFqQyxHQUF1Q3NYLDhEQUFVLENBQUNyQyxRQUFRLENBQUNuWSxhQUFULENBQXVCeVcsSUFBdkIsQ0FBRCxFQUErQixNQUEvQixDQUFqRCxDQURKLENBQzRGO0FBRDVGLGlCQUdHZCxpQkFBaUIsQ0FBQ2UsUUFBbEIsQ0FBMkJELElBQTNCLEVBQWlDdlQsS0FBakMsR0FBdUNpVixRQUFRLENBQUNuWSxhQUFULENBQXVCeVcsSUFBdkIsQ0FBdkM7QUFDTjtBQUNKOztBQUNMM0Isc0JBQWMsQ0FBQ3dCLEtBQWYsQ0FBcUJDLE9BQXJCLEdBQTZCLE9BQTdCO0FBQ0MsT0FoQkwsQ0FnQks7OztBQUNELFVBQUc0QixRQUFRLENBQUNzQyxJQUFULElBQWlCekwsU0FBcEIsRUFDQTtBQUNJLFlBQUkwTCxjQUFjLEdBQUMsRUFBbkI7O0FBQ0EsYUFBSSxJQUFJekosQ0FBUixJQUFha0gsUUFBUSxDQUFDc0MsSUFBdEIsRUFDQTtBQUNJLGNBQUd4SixDQUFDLElBQUUsQ0FBTixFQUNJeUosY0FBYyxJQUFFdkMsUUFBUSxDQUFDc0MsSUFBVCxDQUFjeEosQ0FBZCxFQUFpQnBPLElBQWpDLENBREosS0FHSTZYLGNBQWMsSUFBRSxNQUFJdkMsUUFBUSxDQUFDc0MsSUFBVCxDQUFjeEosQ0FBZCxFQUFpQnBPLElBQXJDO0FBQ1A7O0FBQ0Q4Uyx5QkFBaUIsQ0FBQ2UsUUFBbEIsQ0FBMkIsZ0JBQTNCLEVBQTZDeFQsS0FBN0MsR0FBbUR3WCxjQUFuRDtBQUNIOztBQUNELFVBQUcsQ0FBQ3ZMLDJEQUFPLENBQUNnSixRQUFRLENBQUMvWCxLQUFWLENBQVgsRUFDSXVWLGlCQUFpQixDQUFDZSxRQUFsQixDQUEyQixPQUEzQixFQUFvQ3hULEtBQXBDLEdBQTBDaVYsUUFBUSxDQUFDL1gsS0FBVCxDQUFlQSxLQUFmLENBQXFCNUYsS0FBckIsR0FBMkIsSUFBM0IsR0FBZ0MyZCxRQUFRLENBQUMvWCxLQUFULENBQWVBLEtBQWYsQ0FBcUJpUixFQUFyRCxHQUF3RCxHQUFsRztBQUNKNEQsY0FBUSxDQUFDcUIsS0FBVCxDQUFlQyxPQUFmLEdBQXVCLE9BQXZCO0FBQ0FsQixrQkFBWSxDQUFDaUIsS0FBYixDQUFtQkMsT0FBbkIsR0FBMkIsT0FBM0I7QUFDQXZCLHNCQUFnQixDQUFDc0IsS0FBakIsQ0FBdUJDLE9BQXZCLEdBQStCLE9BQS9CO0FBQ0EsVUFBRzRCLFFBQVEsQ0FBQ3ZCLEtBQVQsSUFBa0I1SCxTQUFyQixFQUNJMkgsYUFBYSxDQUFDd0IsUUFBUSxDQUFDdkIsS0FBVixFQUFpQkMsS0FBakIsQ0FBYjtBQUNKLFVBQUdzQixRQUFRLENBQUM2QixTQUFULElBQXNCaEwsU0FBekIsRUFDSStLLGlCQUFpQixDQUFDNUIsUUFBUSxDQUFDNkIsU0FBVixFQUFxQm5ELEtBQXJCLENBQWpCO0FBQ0osVUFBR3NCLFFBQVEsQ0FBQ2lCLGFBQVQsSUFBMEJwSyxTQUE3QixFQUNJbUsscUJBQXFCLENBQUNoQixRQUFRLENBQUNpQixhQUFWLEVBQXlCdkMsS0FBekIsQ0FBckI7QUFDSmQsc0JBQWdCLENBQUNPLEtBQWpCLENBQXVCQyxPQUF2QixHQUErQixNQUEvQixDQXhDSixDQXdDMEM7QUFDdEM7O0FBQ0E3Qix5QkFBbUIsQ0FBQzRCLEtBQXBCLENBQTBCQyxPQUExQixHQUFrQyxPQUFsQztBQUNBN0IseUJBQW1CLENBQUNpRyxZQUFwQixDQUFpQyxNQUFqQyxFQUF5Q2xHLGNBQWMsQ0FBQzFDLDRCQUF4RDtBQUNBOEMsNkJBQXVCLENBQUN5QixLQUF4QixDQUE4QkMsT0FBOUIsR0FBc0MsT0FBdEM7QUFDQSxVQUFHNEIsUUFBUSxDQUFDblksYUFBVCxDQUF1QixhQUF2QixNQUEwQyxLQUE3QyxFQUNJNlUsdUJBQXVCLENBQUM4RixZQUF4QixDQUFxQyxNQUFyQyxFQUE2Q3hmLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRDRWLG9CQUFvQixDQUFDdlYsMEJBQXJFLEdBQWdHLEdBQWhHLEdBQW9Hb1MsRUFBcEcsR0FBdUcsR0FBdkcsR0FBMkd3RixLQUF4SixFQURKLEtBR0loQyx1QkFBdUIsQ0FBQzhGLFlBQXhCLENBQXFDLE1BQXJDLEVBQTZDdEcsTUFBTSxDQUFDalosT0FBUCxHQUFlb1osb0JBQW9CLENBQUN0Viw0QkFBcEMsR0FBaUVpWixRQUFRLENBQUNuWSxhQUFULENBQXVCLE1BQXZCLENBQWpFLEdBQWdHLE9BQTdJO0FBQ1A7QUFDSixHQXJERDs7QUFzREFzYSxhQUFXLENBQUN2QixJQUFaO0FBQ0gsQ0EzREQsQyxDQTZEQTs7O0FBQ0EsSUFBTUgsc0JBQXNCLEdBQUcsU0FBekJBLHNCQUF5QixDQUFDL0IsS0FBRCxFQUMvQjtBQUNJLE1BQU0rRCxxQkFBcUIsR0FBRyxJQUFJL0MsY0FBSixFQUE5QjtBQUNBK0MsdUJBQXFCLENBQUM3QyxJQUF0QixDQUEyQixLQUEzQixFQUFrQzVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRDRWLG9CQUFvQixDQUFDM1YseUJBQXZHOztBQUNBK2IsdUJBQXFCLENBQUM1QyxrQkFBdEIsR0FBMkMsWUFDM0M7QUFDSSxRQUFJLEtBQUtDLFVBQUwsSUFBbUJKLGNBQWMsQ0FBQ0ssSUFBdEMsRUFDQTtBQUNJLFVBQUlDLFFBQVEsR0FBQ0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS0MsWUFBaEIsQ0FBYjs7QUFDQSxVQUFJLEtBQUtDLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUJHLEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFRLENBQUNqZCxjQUF2QixDQUEzQixFQUNBO0FBQ0ksWUFBSTJmLFFBQVEsR0FBQyxFQUFiO0FBQUEsWUFBaUJDLE1BQWpCO0FBQUEsWUFBeUJDLGFBQWEsR0FBRztBQUFFQyxpQkFBTyxFQUFFO0FBQVgsU0FBekM7O0FBQ0EsYUFBSSxJQUFJL0osQ0FBUixJQUFha0gsUUFBUSxDQUFDamQsY0FBdEIsRUFDQTtBQUNJNGYsZ0JBQU0sR0FBQyxJQUFJRyxJQUFJLENBQUNDLGNBQVQsQ0FBd0IvSyxJQUF4QixFQUE4QjRLLGFBQTlCLEVBQTZDSSxNQUE3QyxDQUFvRCxJQUFJOUssSUFBSixDQUFTOEgsUUFBUSxDQUFDamQsY0FBVCxDQUF3QitWLENBQXhCLEVBQTJCbUssY0FBcEMsQ0FBcEQsQ0FBUDtBQUNBUCxrQkFBUSxJQUFFLFNBQU9DLE1BQVAsR0FBYyxHQUFkLEdBQWtCTiw4REFBVSxDQUFDckMsUUFBUSxDQUFDamQsY0FBVCxDQUF3QitWLENBQXhCLEVBQTJCbUssY0FBNUIsRUFBNEMsSUFBNUMsQ0FBNUIsR0FBOEUsYUFBOUUsR0FBNEYzRyxjQUFjLENBQUMxQyw0QkFBM0csR0FBd0ksTUFBeEksR0FBK0lvRyxRQUFRLENBQUNqZCxjQUFULENBQXdCK1YsQ0FBeEIsRUFBMkJJLEVBQTFLLEdBQTZLLHNCQUE3SyxHQUFvTThHLFFBQVEsQ0FBQ2pkLGNBQVQsQ0FBd0IrVixDQUF4QixFQUEyQkksRUFBL04sR0FBa08sSUFBbE8sR0FBdU84RyxRQUFRLENBQUNqZCxjQUFULENBQXdCK1YsQ0FBeEIsRUFBMkJ6VyxLQUFsUSxHQUF3USxNQUFsUjtBQUNBLGNBQUcyZCxRQUFRLENBQUNqZCxjQUFULENBQXdCK1YsQ0FBeEIsRUFBMkJvSyxhQUEzQixLQUEyQyxLQUE5QyxFQUNJUixRQUFRLElBQUUsMkJBQXlCMVIsNEJBQXpCLEdBQXNELFFBQWhFO0FBQ0owUixrQkFBUSxJQUFFLE9BQVY7QUFDSDs7QUFDRCxZQUFHMUMsUUFBUSxDQUFDamQsY0FBVCxDQUF3Qm1VLE1BQXhCLEtBQWlDLENBQXBDLEVBQ0l5SCxnRUFBVSxDQUFDMUIsaUJBQUQsRUFBb0IsSUFBcEIsRUFBMEJuTSxzQkFBc0IsQ0FBQzJHLE9BQXZCLENBQStCLEtBQS9CLEVBQXNDdUksUUFBUSxDQUFDamQsY0FBVCxDQUF3Qm1VLE1BQTlELENBQTFCLENBQVY7QUFDSnlILHdFQUFVLENBQUNmLGdCQUFELEVBQW1CLElBQW5CLEVBQXlCL00sNEJBQTRCLEdBQUN3Uiw4REFBVSxDQUFDLElBQUluSyxJQUFKLENBQVM4SCxRQUFRLENBQUNtRCxVQUFsQixDQUFELEVBQWdDLElBQWhDLENBQWhFLENBQVY7QUFDQXhFLHdFQUFVLENBQUMxQixpQkFBRCxFQUFvQixJQUFwQixFQUEwQnlGLFFBQTFCLEVBQW9DLEVBQXBDLEVBQXdDLEVBQXhDLEVBQTRDLEVBQTVDLEVBQWdELEtBQWhELENBQVY7O0FBQ0EsYUFBSSxJQUFJNUosR0FBUixJQUFha0gsUUFBUSxDQUFDamQsY0FBdEIsRUFDQTtBQUNJeVosa0JBQVEsQ0FBQ0MsY0FBVCxDQUF3QixtQkFBaUJ1RCxRQUFRLENBQUNqZCxjQUFULENBQXdCK1YsR0FBeEIsRUFBMkJJLEVBQXBFLEVBQXdFMkYsZ0JBQXhFLENBQXlGLE9BQXpGLEVBQWtHLFVBQVNDLENBQVQsRUFDbEc7QUFDSUEsYUFBQyxDQUFDQyxjQUFGO0FBQ0FtRCxzQ0FBMEIsQ0FBQ3BELENBQUMsQ0FBQ3NFLE1BQUYsQ0FBU2xLLEVBQVQsQ0FBWW1LLEtBQVosQ0FBa0IsR0FBbEIsRUFBdUIsQ0FBdkIsQ0FBRCxFQUE0QjNFLEtBQTVCLENBQTFCO0FBQ0FNLGtCQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCLENBQXVCLGlCQUF2QjtBQUNILFdBTEQ7QUFNSDtBQUNKLE9BMUJMLENBMEJLOztBQUNKO0FBQ0osR0EvQkQ7O0FBZ0NBdUQsdUJBQXFCLENBQUM5QixnQkFBdEIsQ0FBdUMsZUFBdkMsRUFBd0QsWUFBVWpDLEtBQWxFO0FBQ0ErRCx1QkFBcUIsQ0FBQzdCLElBQXRCO0FBQ0gsQ0F0Q0Q7O0FBd0NBLElBQU0wQyxVQUFVO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUlhQyxvRUFBWSxDQUFDLENBQUMsU0FBRCxFQUFZLE9BQVosQ0FBRCxFQUF1QixNQUFJakgsY0FBYyxDQUFDNUMsY0FBMUMsRUFBMEQ7QUFBRTJHLHFCQUFPLEVBQUUxTCxlQUFYO0FBQTRCNk8sbUJBQUssRUFBQztBQUFsQyxhQUExRCxFQUF1R3hFLE1BQU0sQ0FBQ0MsUUFBOUcsQ0FKekI7O0FBQUE7QUFJTHdFLHVCQUpLOztBQUtYLGdCQUFHQSxXQUFILEVBQ0E7QUFDSTFHLHFCQUFPLENBQUNvQixLQUFSLENBQWNDLE9BQWQsR0FBc0IsT0FBdEI7O0FBQ0Esa0JBQUcsQ0FBQ3BILDJEQUFPLENBQUMwTSx5RUFBUyxDQUFDLFNBQUQsQ0FBVixDQUFYLEVBQ0E7QUFDSS9FLGdGQUFVLENBQUMzQixVQUFELEVBQWEsR0FBYixFQUFrQjBHLHlFQUFTLENBQUMsU0FBRCxFQUFZLElBQVosQ0FBVCxDQUEyQnJELE9BQTdDLEVBQXNELEVBQXRELEVBQTBELENBQUNxRCx5RUFBUyxDQUFDLFNBQUQsRUFBWSxJQUFaLENBQVQsQ0FBMkJGLEtBQTVCLENBQTFELEVBQThGLEVBQTlGLEVBQWtHLEtBQWxHLENBQVY7QUFDQUcsNEZBQVksQ0FBQyxTQUFELENBQVo7QUFDSDs7QUFDS0Msa0JBUFYsR0FPZUYseUVBQVMsQ0FBQyxNQUFELEVBQVMsSUFBVCxDQVB4QixFQVFJOztBQUNBRyw0RkFBaUIsQ0FBQ0QsSUFBSSxDQUFDeEQsTUFBTixFQUFjOUQsY0FBZCxDQUFqQixDQVRKLENBVUk7O0FBQ0ErQiwyRkFBcUIsQ0FBQ2hDLG9CQUFELEVBQXVCb0IsVUFBdkIsQ0FBckI7QUFDQVksMkZBQXFCLENBQUNoQyxvQkFBb0IsQ0FBQ3hVLGFBQXRCLEVBQXFDMlYsaUJBQXJDLENBQXJCLENBWkosQ0FhSTs7QUFDQWQscUNBQXVCLENBQUN5QixLQUF4QixDQUE4QkMsT0FBOUIsR0FBc0MsTUFBdEM7QUFDQXpCLDRCQUFjLENBQUN3QixLQUFmLENBQXFCQyxPQUFyQixHQUE2QixNQUE3QjtBQUNBSiwwQkFBWSxHQWhCaEIsQ0FpQkk7O0FBQ0k4RixzQkFsQlIsR0FrQmlCQyxrRUFBWSxFQWxCN0I7QUFtQkksa0JBQUdELFFBQVEsSUFBSUEsUUFBUSxDQUFDNUssRUFBVCxLQUFjckMsU0FBN0IsRUFDSXFMLDBCQUEwQixDQUFDNEIsUUFBUSxDQUFDNUssRUFBVixFQUFjMEssSUFBSSxDQUFDbEYsS0FBbkIsQ0FBMUIsQ0FwQlIsQ0FxQkk7O0FBQ0ErQixvQ0FBc0IsQ0FBQ21ELElBQUksQ0FBQ2xGLEtBQU4sQ0FBdEIsQ0F0QkosQ0F1Qkk7O0FBQ0FqQix3QkFBVSxDQUFDb0IsZ0JBQVgsQ0FBNEIsUUFBNUIsRUFBc0MsVUFBU0MsQ0FBVCxFQUN0QztBQUNJQSxpQkFBQyxDQUFDQyxjQUFGO0FBQ0Esb0JBQUlRLEtBQUssR0FBQ0MsMEVBQWtCLENBQUMvQixVQUFELENBQTVCO0FBQ0Esb0JBQU11RyxTQUFTLEdBQUcsSUFBSXRFLGNBQUosRUFBbEI7QUFDQXNFLHlCQUFTLENBQUNwRSxJQUFWLENBQWUsTUFBZixFQUF1QjVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRDRWLG9CQUFvQixDQUFDcFYsOEJBQTVGOztBQUNBK2MseUJBQVMsQ0FBQ25FLGtCQUFWLEdBQStCLFlBQy9CO0FBQ0ksc0JBQUksS0FBS0MsVUFBTCxJQUFtQkosY0FBYyxDQUFDSyxJQUF0QyxFQUNBO0FBQ0ksd0JBQUlDLFFBQVEsR0FBQ0MsSUFBSSxDQUFDQyxLQUFMLENBQVcsS0FBS0MsWUFBaEIsQ0FBYjs7QUFDQSx3QkFBSSxLQUFLQyxNQUFMLEtBQWdCLEdBQWhCLElBQXVCRyxLQUFLLENBQUNDLE9BQU4sQ0FBY1IsUUFBZCxDQUEzQixFQUNBO0FBQ0ksMEJBQUdBLFFBQVEsQ0FBQzlJLE1BQVQsS0FBa0IsQ0FBckIsRUFDSXlILGdFQUFVLENBQUN2QixlQUFELEVBQWtCLEdBQWxCLEVBQXVCaE0sK0JBQXZCLEVBQXdELEVBQXhELEVBQTRELENBQUMsTUFBRCxDQUE1RCxDQUFWLENBREosS0FHQTtBQUNJLDRCQUFJNlMsVUFBVSxHQUFDLDRCQUFmOztBQUNBLDZCQUFJLElBQUluTCxDQUFSLElBQWFrSCxRQUFiO0FBQ0lpRSxvQ0FBVSxJQUFFLG9CQUFrQmpFLFFBQVEsQ0FBQ2xILENBQUQsQ0FBUixDQUFZSSxFQUE5QixHQUFpQyxJQUFqQyxHQUFzQzhHLFFBQVEsQ0FBQ2xILENBQUQsQ0FBUixDQUFZelcsS0FBbEQsR0FBd0QsV0FBcEU7QUFESjs7QUFFQXNjLHdGQUFVLENBQUN2QixlQUFELEVBQWtCLFFBQWxCLEVBQTRCNkcsVUFBNUIsRUFBd0MsY0FBeEMsQ0FBVjtBQUNBLDRCQUFNQyxZQUFZLEdBQUMxSCxRQUFRLENBQUNDLGNBQVQsQ0FBd0IsY0FBeEIsQ0FBbkI7QUFDQXlILG9DQUFZLENBQUNyRixnQkFBYixDQUE4QixRQUE5QixFQUF3QyxZQUN4QztBQUNJLDhCQUFHcUYsWUFBWSxDQUFDblosS0FBYixLQUFxQixFQUF4QixFQUNJbVgsMEJBQTBCLENBQUNnQyxZQUFZLENBQUNuWixLQUFkLEVBQXFCNlksSUFBSSxDQUFDbEYsS0FBMUIsQ0FBMUI7QUFDUCx5QkFKRDtBQUtIO0FBQ0oscUJBakJELE1BbUJJQyxnRUFBVSxDQUFDdkIsZUFBRCxFQUFrQixHQUFsQixFQUF1QjNRLFdBQXZCLEVBQW9DLEVBQXBDLEVBQXdDLENBQUMsT0FBRCxDQUF4QyxDQUFWO0FBQ1A7QUFDSixpQkExQkQ7O0FBMkJBdVgseUJBQVMsQ0FBQ3JELGdCQUFWLENBQTJCLGNBQTNCLEVBQTJDLGtCQUEzQztBQUNBcUQseUJBQVMsQ0FBQ3JELGdCQUFWLENBQTJCLGVBQTNCLEVBQTRDLFlBQVVpRCxJQUFJLENBQUNsRixLQUEzRDtBQUNBLG9CQUFHYSxLQUFILEVBQ0l5RSxTQUFTLENBQUNwRCxJQUFWLENBQWVYLElBQUksQ0FBQ1ksU0FBTCxDQUFldEIsS0FBZixDQUFmO0FBQ1AsZUFyQ0QsRUF4QkosQ0ErREk7O0FBQ0ExQixpQ0FBbUIsQ0FBQ2dCLGdCQUFwQixDQUFxQyxPQUFyQyxFQUE4QyxVQUFTQyxDQUFULEVBQzlDO0FBQ0kzQiwyQkFBVyxDQUFDbUMsU0FBWixHQUFzQixFQUF0QjtBQUNBLG9CQUFNNkUsSUFBSSxHQUFDdEcsbUJBQW1CLENBQUM5UyxLQUFwQixDQUEwQnNZLEtBQTFCLENBQWdDLEdBQWhDLENBQVg7QUFDQWMsb0JBQUksQ0FBQ0MsT0FBTDtBQUNBLG9CQUFNQyxPQUFPLEdBQUNGLElBQUksQ0FBQyxDQUFELENBQUosQ0FBUXJOLElBQVIsRUFBZDs7QUFDQSxvQkFBR3VOLE9BQU8sQ0FBQ25OLE1BQVIsSUFBa0IsQ0FBckIsRUFDQTtBQUNJLHNCQUFNb04sYUFBYSxHQUFHLElBQUk1RSxjQUFKLEVBQXRCO0FBQ0E0RSwrQkFBYSxDQUFDMUUsSUFBZCxDQUFtQixNQUFuQixFQUEyQjVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRDRWLG9CQUFvQixDQUFDN1UsZUFBaEc7O0FBQ0E4YywrQkFBYSxDQUFDekUsa0JBQWQsR0FBbUMsWUFDbkM7QUFDSSx3QkFBSSxLQUFLQyxVQUFMLElBQW1CSixjQUFjLENBQUNLLElBQXRDLEVBQ0E7QUFDSSwwQkFBSUMsUUFBUSxHQUFDQyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxLQUFLQyxZQUFoQixDQUFiOztBQUNBLDBCQUFJLEtBQUtDLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUJHLEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFkLENBQTNCLEVBQ0E7QUFDSXRDLDBDQUFrQixDQUFDNEIsU0FBbkIsR0FBNkIsRUFBN0I7O0FBQ0EsNkJBQUksSUFBSXhHLENBQVIsSUFBYWtILFFBQWIsRUFDQTtBQUNJckIsMEZBQVUsQ0FBQ2pCLGtCQUFELEVBQXFCLEdBQXJCLEVBQTBCc0MsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVlwTyxJQUF0QyxFQUE0QyxTQUFPc1YsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVlJLEVBQS9ELEVBQW1FLENBQUMsTUFBRCxDQUFuRSxFQUE2RTtBQUFFRCxnQ0FBSSxFQUFDLFNBQU8rRyxRQUFRLENBQUNsSCxDQUFELENBQVIsQ0FBWUk7QUFBMUIsMkJBQTdFLEVBQTZHLEtBQTdHLENBQVY7QUFDQXNELGtDQUFRLENBQUNDLGNBQVQsQ0FBd0IsU0FBT3VELFFBQVEsQ0FBQ2xILENBQUQsQ0FBUixDQUFZSSxFQUEzQyxFQUErQzJGLGdCQUEvQyxDQUFnRSxPQUFoRSxFQUF5RSxVQUFTQyxDQUFULEVBQ3pFO0FBQ0lBLDZCQUFDLENBQUNDLGNBQUY7QUFDQW9GLGdDQUFJLENBQUMsQ0FBRCxDQUFKLEdBQVFyRixDQUFDLENBQUNzRSxNQUFGLENBQVM5RCxTQUFqQjtBQUNBNkUsZ0NBQUksQ0FBQ0MsT0FBTDtBQUNBdkcsK0NBQW1CLENBQUM5UyxLQUFwQixHQUEwQm9aLElBQUksQ0FBQ3hoQixJQUFMLENBQVUsR0FBVixDQUExQjtBQUNBK2EsOENBQWtCLENBQUM0QixTQUFuQixHQUE2QixFQUE3QjtBQUNILDJCQVBEO0FBU0g7QUFDSjtBQUNKO0FBQ0osbUJBdkJEOztBQXdCQWdGLCtCQUFhLENBQUMzRCxnQkFBZCxDQUErQixjQUEvQixFQUErQyxrQkFBL0M7QUFDQTJELCtCQUFhLENBQUMzRCxnQkFBZCxDQUErQixlQUEvQixFQUFnRCxZQUFVaUQsSUFBSSxDQUFDbEYsS0FBL0Q7QUFDQTRGLCtCQUFhLENBQUMxRCxJQUFkLENBQW1CWCxJQUFJLENBQUNZLFNBQUwsQ0FBZTtBQUFDclksMEJBQU0sRUFBRTZiO0FBQVQsbUJBQWYsQ0FBbkI7QUFDSDtBQUNKLGVBdENELEVBaEVKLENBd0dJOztBQUNBdkcsd0JBQVUsQ0FBQ2UsZ0JBQVgsQ0FBNEIsT0FBNUIsRUFBcUMsVUFBU0MsQ0FBVCxFQUNyQztBQUNJdEIsaUNBQWlCLENBQUMsU0FBRCxDQUFqQixDQUE2QnpTLEtBQTdCLEdBQW1DLEVBQW5DO0FBQ0Esb0JBQU13WixVQUFVLEdBQUN6RyxVQUFVLENBQUMvUyxLQUFYLENBQWlCK0wsSUFBakIsRUFBakI7O0FBQ0Esb0JBQUd5TixVQUFVLENBQUNyTixNQUFYLElBQXFCbUYsb0JBQW9CLENBQUM1VCxZQUFyQixDQUFrQzVDLFNBQTFELEVBQ0E7QUFDSSxzQkFBTTJlLGVBQWUsR0FBRyxJQUFJOUUsY0FBSixFQUF4QjtBQUNBOEUsaUNBQWUsQ0FBQzVFLElBQWhCLENBQXFCLE1BQXJCLEVBQTZCNWMsMERBQU0sR0FBQ3FaLG9CQUFvQixDQUFDbFYsV0FBNUIsR0FBd0NrVixvQkFBb0IsQ0FBQy9VLGlCQUExRjs7QUFDQWtkLGlDQUFlLENBQUMzRSxrQkFBaEIsR0FBcUMsWUFDckM7QUFBQTs7QUFDSSx3QkFBSSxLQUFLQyxVQUFMLElBQW1CSixjQUFjLENBQUNLLElBQXRDLEVBQ0E7QUFBQTtBQUNJLDRCQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUksQ0FBQ0MsWUFBaEIsQ0FBYjs7QUFDQSw0QkFBSSxLQUFJLENBQUNDLE1BQUwsS0FBZ0IsR0FBaEIsSUFBdUJHLEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFkLENBQTNCLEVBQ0E7QUFDSXJDLG1DQUFTLENBQUMyQixTQUFWLEdBQW9CLEVBQXBCOztBQURKLHVEQUVZeEcsQ0FGWjtBQUlRNkYsNEZBQVUsQ0FBQ2hCLFNBQUQsRUFBWSxHQUFaLEVBQWlCcUMsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVl6VyxLQUE3QixFQUFvQyxXQUFTMmQsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVlJLEVBQXpELEVBQTZELENBQUMsTUFBRCxDQUE3RCxFQUF1RTtBQUFFRCxrQ0FBSSxFQUFDLFdBQVMrRyxRQUFRLENBQUNsSCxDQUFELENBQVIsQ0FBWUk7QUFBNUIsNkJBQXZFLEVBQXlHLEtBQXpHLENBQVY7QUFDQXNELG9DQUFRLENBQUNDLGNBQVQsQ0FBd0IsV0FBU3VELFFBQVEsQ0FBQ2xILENBQUQsQ0FBUixDQUFZSSxFQUE3QyxFQUFpRDJGLGdCQUFqRCxDQUFrRSxPQUFsRSxFQUEyRSxVQUFTQyxDQUFULEVBQzNFO0FBQ0lBLCtCQUFDLENBQUNDLGNBQUY7QUFDQWpCLHdDQUFVLENBQUMvUyxLQUFYLEdBQWlCaVYsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVl6VyxLQUFaLEdBQWtCLElBQWxCLEdBQXVCMmQsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVlJLEVBQW5DLEdBQXNDLEdBQXZEO0FBQ0FzRSwrQ0FBaUIsQ0FBQyxTQUFELENBQWpCLENBQTZCelMsS0FBN0IsR0FBbUNpVixRQUFRLENBQUNsSCxDQUFELENBQVIsQ0FBWUksRUFBL0M7QUFDQSxrQ0FBRyxDQUFDbEMsMkRBQU8sQ0FBQ2dKLFFBQVEsQ0FBQ2xILENBQUQsQ0FBUixDQUFZMkwsT0FBYixDQUFYLEVBQ0kxRyxnQkFBZ0IsQ0FBQ2hULEtBQWpCLEdBQXVCaVYsUUFBUSxDQUFDbEgsQ0FBRCxDQUFSLENBQVkyTCxPQUFaLEdBQW9CLENBQTNDLENBREosS0FHSTFHLGdCQUFnQixDQUFDaFQsS0FBakIsR0FBdUIsQ0FBdkI7QUFDSjRTLHVDQUFTLENBQUMyQixTQUFWLEdBQW9CLEVBQXBCO0FBQ0gsNkJBVkQ7QUFMUjs7QUFFSSwrQkFBSSxJQUFJeEcsQ0FBUixJQUFha0gsUUFBYixFQUNBO0FBQUEsbUNBRFFsSCxDQUNSO0FBYUM7QUFDSjtBQXBCTDtBQXFCQztBQUNKLG1CQXpCRDs7QUEwQkEwTCxpQ0FBZSxDQUFDN0QsZ0JBQWhCLENBQWlDLGNBQWpDLEVBQWlELGtCQUFqRDtBQUNBNkQsaUNBQWUsQ0FBQzdELGdCQUFoQixDQUFpQyxlQUFqQyxFQUFrRCxZQUFVaUQsSUFBSSxDQUFDbEYsS0FBakU7QUFDQThGLGlDQUFlLENBQUM1RCxJQUFoQixDQUFxQlgsSUFBSSxDQUFDWSxTQUFMLENBQWU7QUFBQ3BZLGdDQUFZLEVBQUU4YjtBQUFmLG1CQUFmLENBQXJCO0FBQ0g7QUFDSixlQXRDRCxFQXpHSixDQWlKSTs7QUFDQS9HLCtCQUFpQixDQUFDcUIsZ0JBQWxCLENBQW1DLFFBQW5DLEVBQTZDLFVBQVNDLENBQVQsRUFDN0M7QUFDSUEsaUJBQUMsQ0FBQ0MsY0FBRjtBQUNBNUIsMkJBQVcsQ0FBQ21DLFNBQVosR0FBc0IsRUFBdEI7QUFDQSxvQkFBSUMsS0FBSyxHQUFDQywwRUFBa0IsQ0FBQ2hDLGlCQUFELENBQTVCO0FBQ0Esb0JBQUcsQ0FBQ3hHLDJEQUFPLENBQUN1SSxLQUFLLENBQUNtRixXQUFQLENBQVIsSUFBK0IxTiwyREFBTyxDQUFDdUksS0FBSyxDQUFDb0YsT0FBUCxDQUF6QyxFQUNJaEcsZ0VBQVUsQ0FBQ3hCLFdBQUQsRUFBYyxHQUFkLEVBQW1CNU0sZUFBbkIsRUFBb0MsRUFBcEMsRUFBd0MsQ0FBQyxPQUFELENBQXhDLENBQVYsQ0FESixLQUdBO0FBQ0ksc0JBQUd5RywyREFBTyxDQUFDdUksS0FBSyxDQUFDbUYsV0FBUCxDQUFQLElBQThCLENBQUMxTiwyREFBTyxDQUFDdUksS0FBSyxDQUFDb0YsT0FBUCxDQUF6QyxFQUNJcEYsS0FBSyxDQUFDbUYsV0FBTixHQUFrQixDQUFsQjtBQUNKLHNCQUFNRSxxQkFBcUIsR0FBRyxJQUFJbEYsY0FBSixFQUE5QjtBQUNBLHNCQUFHLENBQUMxSSwyREFBTyxDQUFDdUksS0FBSyxDQUFDckcsRUFBUCxDQUFSLElBQXVCcUcsS0FBSyxDQUFDSSxRQUFOLEtBQWlCOUksU0FBM0MsRUFDSStOLHFCQUFxQixDQUFDaEYsSUFBdEIsQ0FBMkIsUUFBM0IsRUFBcUM1YywwREFBTSxHQUFDcVosb0JBQW9CLENBQUM1VixtQkFBNUIsR0FBZ0QsR0FBaEQsR0FBb0Q4WSxLQUFLLENBQUNyRyxFQUEvRixFQURKLEtBRUssSUFBRyxDQUFDbEMsMkRBQU8sQ0FBQ3VJLEtBQUssQ0FBQ3JHLEVBQVAsQ0FBWCxFQUNEMEwscUJBQXFCLENBQUNoRixJQUF0QixDQUEyQixLQUEzQixFQUFrQzVjLDBEQUFNLEdBQUNxWixvQkFBb0IsQ0FBQzVWLG1CQUE1QixHQUFnRCxHQUFoRCxHQUFvRDhZLEtBQUssQ0FBQ3JHLEVBQTVGLEVBREMsS0FHRDBMLHFCQUFxQixDQUFDaEYsSUFBdEIsQ0FBMkIsTUFBM0IsRUFBbUM1YywwREFBTSxHQUFDcVosb0JBQW9CLENBQUM1VixtQkFBNUIsR0FBZ0QsR0FBbkY7O0FBQ0ptZSx1Q0FBcUIsQ0FBQy9FLGtCQUF0QixHQUEyQyxZQUMzQztBQUNJLHdCQUFJLEtBQUtDLFVBQUwsSUFBbUJKLGNBQWMsQ0FBQ0ssSUFBdEMsRUFDQTtBQUNJLDBCQUFJQyxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLEtBQUtDLFlBQWhCLENBQWI7O0FBQ0EsMEJBQUksS0FBS0MsTUFBTCxLQUFnQixHQUFoQixJQUF1QkosUUFBUSxDQUFDOUcsRUFBVCxJQUFlckMsU0FBMUMsRUFDQTtBQUNJOEgsd0ZBQVUsQ0FBQ3hCLFdBQUQsRUFBYyxHQUFkLEVBQW1CL1IsWUFBbkIsRUFBaUMsRUFBakMsRUFBcUMsQ0FBQyxTQUFELENBQXJDLENBQVY7QUFDQW1VLDZCQUFLLENBQUNyRyxFQUFOLEdBQVM4RyxRQUFRLENBQUM5RyxFQUFsQjtBQUNBdUgsOENBQXNCLENBQUNtRCxJQUFJLENBQUNsRixLQUFOLENBQXRCLENBSEosQ0FHdUM7QUFDdEMsdUJBTEQsTUFNSyxJQUFJLEtBQUswQixNQUFMLEtBQWdCLEdBQWhCLElBQXVCSixRQUFRLENBQUNLLE9BQVQsSUFBb0J4SixTQUEvQyxFQUNMO0FBQ0ksNEJBQUcwSixLQUFLLENBQUNDLE9BQU4sQ0FBY1IsUUFBUSxDQUFDSyxPQUF2QixDQUFILEVBQ0lMLFFBQVEsQ0FBQ0ssT0FBVCxHQUFtQkwsUUFBUSxDQUFDSyxPQUFULENBQWlCMWQsSUFBakIsQ0FBc0IsTUFBdEIsQ0FBbkIsQ0FESixLQUdJcWQsUUFBUSxDQUFDSyxPQUFULEdBQW1CTCxRQUFRLENBQUNLLE9BQTVCO0FBQ0oxQix3RkFBVSxDQUFDeEIsV0FBRCxFQUFjLEdBQWQsRUFBbUI2QyxRQUFRLENBQUNLLE9BQTVCLEVBQXFDLEVBQXJDLEVBQXlDLENBQUMsU0FBRCxDQUF6QyxDQUFWO0FBQ0FJLDhDQUFzQixDQUFDbUQsSUFBSSxDQUFDbEYsS0FBTixDQUF0QixDQU5KLENBTXVDO0FBQ3RDLHVCQVJJLE1BU0EsSUFBSXNCLFFBQVEsQ0FBQ1UsTUFBYixFQUNMO0FBQ0ksNEJBQUdILEtBQUssQ0FBQ0MsT0FBTixDQUFjUixRQUFRLENBQUNVLE1BQXZCLENBQUgsRUFDSVYsUUFBUSxDQUFDVSxNQUFULEdBQWtCVixRQUFRLENBQUNVLE1BQVQsQ0FBZ0IvZCxJQUFoQixDQUFxQixNQUFyQixDQUFsQixDQURKLEtBR0lxZCxRQUFRLENBQUNVLE1BQVQsR0FBa0JqVSxXQUFsQjtBQUNKa1Msd0ZBQVUsQ0FBQ3hCLFdBQUQsRUFBYyxHQUFkLEVBQW1CNkMsUUFBUSxDQUFDVSxNQUE1QixFQUFvQyxFQUFwQyxFQUF3QyxDQUFDLE9BQUQsQ0FBeEMsQ0FBVjtBQUNILHVCQVBJLE1BU0QvQixnRUFBVSxDQUFDeEIsV0FBRCxFQUFjLEdBQWQsRUFBbUIxUSxXQUFuQixFQUFnQyxFQUFoQyxFQUFvQyxDQUFDLE9BQUQsQ0FBcEMsQ0FBVjs7QUFDSiwwQkFBRzhTLEtBQUssQ0FBQ0ksUUFBTixLQUFtQjlJLFNBQW5CLElBQWdDbUosUUFBUSxDQUFDVSxNQUFULEtBQW9CN0osU0FBdkQsRUFDSXFMLDBCQUEwQixDQUFDM0MsS0FBSyxDQUFDckcsRUFBUCxFQUFXMEssSUFBSSxDQUFDbEYsS0FBaEIsQ0FBMUIsQ0FESixDQUNxRDtBQURyRCwyQkFFSyxJQUFJc0IsUUFBUSxDQUFDVSxNQUFULEtBQW9CN0osU0FBeEIsRUFDTDtBQUNJMkcsMkNBQWlCLENBQUM0RSxLQUFsQjtBQUNBdEYsa0NBQVEsQ0FBQ3dDLFNBQVQsR0FBbUIsRUFBbkI7QUFDQXpDLDBDQUFnQixDQUFDeUMsU0FBakIsR0FBMkIsRUFBM0I7QUFDQXBDLHNDQUFZLENBQUNvQyxTQUFiLEdBQXVCLEVBQXZCO0FBQ0g7QUFDSjtBQUNKLG1CQXhDRDs7QUF5Q0FzRix1Q0FBcUIsQ0FBQ2pFLGdCQUF0QixDQUF1QyxjQUF2QyxFQUF1RCxrQkFBdkQ7QUFDQWlFLHVDQUFxQixDQUFDakUsZ0JBQXRCLENBQXVDLGVBQXZDLEVBQXdELFlBQVVpRCxJQUFJLENBQUNsRixLQUF2RTtBQUNBLHNCQUFHYSxLQUFILEVBQ0lxRixxQkFBcUIsQ0FBQ2hFLElBQXRCLENBQTJCWCxJQUFJLENBQUNZLFNBQUwsQ0FBZXRCLEtBQWYsQ0FBM0I7QUFDUDtBQUNKLGVBaEVEO0FBaUVBbEMsc0JBQVEsQ0FBQ3dCLGdCQUFULENBQTBCLFFBQTFCLEVBQW9DLFVBQVNDLENBQVQsRUFDcEM7QUFDSUEsaUJBQUMsQ0FBQ0MsY0FBRjtBQUNBSSw0QkFBWSxDQUFDeUUsSUFBSSxDQUFDbEYsS0FBTixDQUFaO0FBQ0gsZUFKRDtBQUtBcEIsOEJBQWdCLENBQUN1QixnQkFBakIsQ0FBa0MsUUFBbEMsRUFBNEMsVUFBU0MsQ0FBVCxFQUM1QztBQUNJQSxpQkFBQyxDQUFDQyxjQUFGO0FBQ0FvQyxvQ0FBb0IsQ0FBQ3lDLElBQUksQ0FBQ2xGLEtBQU4sQ0FBcEI7QUFDSCxlQUpEO0FBS0FuQiwwQkFBWSxDQUFDc0IsZ0JBQWIsQ0FBOEIsUUFBOUIsRUFBd0MsVUFBU0MsQ0FBVCxFQUN4QztBQUNJQSxpQkFBQyxDQUFDQyxjQUFGO0FBQ0FnRCxnQ0FBZ0IsQ0FBQzZCLElBQUksQ0FBQ2xGLEtBQU4sQ0FBaEI7QUFDSCxlQUpEO0FBS0g7O0FBeE9VO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBNE9YbUcsbUJBQU8sQ0FBQ0MsS0FBUjtBQUNBbkcsNEVBQVUsQ0FBQy9CLFFBQUQsRUFBVyxHQUFYLEVBQWdCblEsV0FBaEIsRUFBNkIsRUFBN0IsRUFBaUMsQ0FBQyxPQUFELENBQWpDLENBQVY7O0FBN09XO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVY2VyxVQUFVO0FBQUE7QUFBQTtBQUFBLEdBQWhCOztBQWdQQUEsVUFBVTtBQUNWeUIscUVBQVEsRzs7Ozs7Ozs7Ozs7O0FDcnVCUjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFTyxJQUFNQyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDdGEsSUFBRCxFQUFPNFQsSUFBUCxFQUMxQjtBQUNJMkcsY0FBWSxDQUFDQyxPQUFiLENBQXFCeGEsSUFBckIsRUFBMkJ1VixJQUFJLENBQUNZLFNBQUwsQ0FBZXZDLElBQWYsQ0FBM0I7QUFDSCxDQUhNO0FBS0EsSUFBTW9GLFNBQVMsR0FBRyxTQUFaQSxTQUFZLENBQUNoWixJQUFELEVBQ3pCO0FBQUEsTUFEZ0N5YSxJQUNoQyx1RUFEcUMsS0FDckM7QUFDSSxNQUFHQSxJQUFILEVBQ0ksT0FBT2xGLElBQUksQ0FBQ0MsS0FBTCxDQUFXK0UsWUFBWSxDQUFDRyxPQUFiLENBQXFCMWEsSUFBckIsQ0FBWCxDQUFQLENBREosS0FHSSxPQUFPdWEsWUFBWSxDQUFDRyxPQUFiLENBQXFCMWEsSUFBckIsQ0FBUDtBQUNQLENBTk07QUFRQSxJQUFNaVosWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ2paLElBQUQsRUFDNUI7QUFDSXVhLGNBQVksQ0FBQ0ksVUFBYixDQUF3QjNhLElBQXhCO0FBQ0gsQ0FITSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0NkUDs7QUFDTyxJQUFNaVUsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQzJHLFNBQUQsRUFBWUMsT0FBWixFQUMxQjtBQUFBLE1BRCtDQyxVQUMvQyx1RUFEMEQsRUFDMUQ7QUFBQSxNQUQ4REMsS0FDOUQsdUVBRG9FLEVBQ3BFO0FBQUEsTUFEd0VDLFFBQ3hFLHVFQURpRixFQUNqRjtBQUFBLE1BRHFGQyxhQUNyRix1RUFEbUcsRUFDbkc7QUFBQSxNQUR1R2xPLE9BQ3ZHLHVFQUQrRyxJQUMvRztBQUNJLE1BQUdULDJEQUFPLENBQUN1TyxPQUFELENBQVAsSUFBb0J2TywyREFBTyxDQUFDc08sU0FBRCxDQUE5QixFQUNJLE9BQU8sS0FBUCxDQURKLEtBR0E7QUFDSSxRQUFNTSxVQUFVLEdBQUNwSixRQUFRLENBQUNxSixhQUFULENBQXVCTixPQUF2QixDQUFqQjtBQUVBLFFBQUcsQ0FBQ3ZPLDJEQUFPLENBQUN5TyxLQUFELENBQVgsRUFBbUI7QUFDZkcsZ0JBQVUsQ0FBQzFNLEVBQVgsR0FBY3VNLEtBQWQ7O0FBRUosUUFBR2xGLEtBQUssQ0FBQ0MsT0FBTixDQUFja0YsUUFBZCxLQUEyQkEsUUFBUSxDQUFDeE8sTUFBVCxJQUFpQixDQUEvQyxFQUNBO0FBQ0ksV0FBSSxJQUFJNEIsQ0FBUixJQUFhNE0sUUFBYjtBQUNJRSxrQkFBVSxDQUFDRSxTQUFYLENBQXFCQyxHQUFyQixDQUF5QkwsUUFBUSxDQUFDNU0sQ0FBRCxDQUFqQztBQURKO0FBRUg7O0FBRUQsUUFBRyxRQUFPNk0sYUFBUCxNQUF5QixRQUE1QixFQUFzQztBQUN0QztBQUNJLGFBQUksSUFBSUssWUFBUixJQUF3QkwsYUFBeEI7QUFDSUMsb0JBQVUsQ0FBQ3BELFlBQVgsQ0FBd0J3RCxZQUF4QixFQUFzQ0wsYUFBYSxDQUFDSyxZQUFELENBQW5EO0FBREo7QUFFSDs7QUFFRCxRQUFHLENBQUNoUCwyREFBTyxDQUFDd08sVUFBRCxDQUFYLEVBQ0lJLFVBQVUsQ0FBQ3RHLFNBQVgsR0FBcUJrRyxVQUFVLENBQUMvTixPQUFYLENBQW1CLEtBQW5CLEVBQXlCLE1BQXpCLENBQXJCLENBbkJSLENBbUI4RDs7QUFFMUQsUUFBR0EsT0FBSCxFQUNJNk4sU0FBUyxDQUFDaEcsU0FBVixHQUFvQixFQUFwQjtBQUNKZ0csYUFBUyxDQUFDVyxXQUFWLENBQXNCTCxVQUF0QjtBQUNIO0FBQ0osQ0E5Qk0sQzs7Ozs7Ozs7Ozs7O0FDSFA7QUFBQTtBQUFBO0FBQUE7QUFFTyxJQUFNYixRQUFRLEdBQUcsU0FBWEEsUUFBVyxHQUN4QjtBQUNJRixTQUFPLENBQUNxQixHQUFSLENBQVksNE5BQVo7QUFDQSxTQUFPLElBQVA7QUFDSCxDQUpNO0FBTUEsSUFBTXJDLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FBQ3pELE1BQUQsRUFBUzlELGNBQVQsRUFDakM7QUFDSSxNQUFNNkosSUFBSSxHQUFDM0osUUFBUSxDQUFDQyxjQUFULENBQXdCLGlCQUF4QixDQUFYO0FBQ0EsTUFBTTJKLFFBQVEsR0FBQ2hHLE1BQU0sR0FBQyxVQUF0QjtBQUNBK0YsTUFBSSxDQUFDbE4sSUFBTCxHQUFVLE1BQUlxRCxjQUFjLENBQUM4SixRQUFELENBQTVCO0FBQ0gsQ0FMTSxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NDTlA7O0FBQ08sSUFBTS9ILHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQ2dJLFVBQUQsRUFBYUMsTUFBYixFQUNyQztBQUNJLE9BQUksSUFBSXhOLENBQVIsSUFBYXdOLE1BQU0sQ0FBQy9ILFFBQXBCLEVBQ0E7QUFDSSxRQUFHLENBQUN2SCwyREFBTyxDQUFDc1AsTUFBTSxDQUFDL0gsUUFBUCxDQUFnQnpGLENBQWhCLEVBQW1CSSxFQUFwQixDQUFYLEVBQ0E7QUFDSSxVQUFJcU4sT0FBTyxHQUFDRCxNQUFNLENBQUMvSCxRQUFQLENBQWdCekYsQ0FBaEIsRUFBbUJJLEVBQS9COztBQUNBLFVBQUdtTixVQUFVLENBQUNFLE9BQUQsQ0FBVixLQUFzQjFQLFNBQXpCLEVBQ0E7QUFDSSxZQUFJMlAsU0FBUyxHQUFDaEssUUFBUSxDQUFDQyxjQUFULENBQXdCOEosT0FBeEIsQ0FBZDs7QUFDQSxhQUFLLElBQUlFLFNBQVQsSUFBc0JKLFVBQVUsQ0FBQ0UsT0FBRCxDQUFoQztBQUNJQyxtQkFBUyxDQUFDaEUsWUFBVixDQUF1QmlFLFNBQXZCLEVBQWtDSixVQUFVLENBQUNFLE9BQUQsQ0FBVixDQUFvQkUsU0FBcEIsQ0FBbEM7QUFESjtBQUVIO0FBQ0o7QUFDSjs7QUFDRCxTQUFPLElBQVA7QUFDSCxDQWhCTSxDLENBa0JQOztBQUNPLElBQU1qSCxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCLENBQUM4RyxNQUFELEVBQ2xDO0FBQ0ksTUFBTS9HLEtBQUssR0FBQyxFQUFaO0FBQ0EsTUFBTW1ILFFBQVEsR0FBRyxJQUFJcEYsUUFBSixDQUFhZ0YsTUFBYixDQUFqQjs7QUFGSiw2Q0FHc0JJLFFBQVEsQ0FBQ0MsT0FBVCxFQUh0QjtBQUFBOztBQUFBO0FBR0k7QUFBQSxVQUFRQyxNQUFSO0FBQ0dySCxXQUFLLENBQUNxSCxNQUFNLENBQUMsQ0FBRCxDQUFQLENBQUwsR0FBaUJBLE1BQU0sQ0FBQyxDQUFELENBQXZCO0FBREg7QUFISjtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUtJLFNBQU9ySCxLQUFQO0FBQ0gsQ0FQTSxDLENBU1A7QUFDQTs7QUFDTyxJQUFNc0gsUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQ1AsTUFBRCxFQUN4QjtBQUNJLE1BQU1JLFFBQVEsR0FBRyxJQUFJcEYsUUFBSixDQUFhZ0YsTUFBYixDQUFqQjs7QUFESiw4Q0FFc0JJLFFBQVEsQ0FBQ0MsT0FBVCxFQUZ0QjtBQUFBOztBQUFBO0FBRUksMkRBQ0E7QUFBQSxVQURRQyxNQUNSO0FBQ0ksVUFBR04sTUFBTSxDQUFDL0gsUUFBUCxDQUFnQnFJLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRSxJQUEzQixJQUFpQyxVQUFqQyxJQUErQ1IsTUFBTSxDQUFDL0gsUUFBUCxDQUFnQnFJLE1BQU0sQ0FBQyxDQUFELENBQXRCLEVBQTJCRSxJQUEzQixJQUFpQyxPQUFuRixFQUNJUixNQUFNLENBQUMvSCxRQUFQLENBQWdCcUksTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkJqRixPQUEzQixHQUFtQyxLQUFuQyxDQURKLEtBR0kyRSxNQUFNLENBQUMvSCxRQUFQLENBQWdCcUksTUFBTSxDQUFDLENBQUQsQ0FBdEIsRUFBMkI3YixLQUEzQixHQUFpQyxFQUFqQztBQUNQO0FBUkw7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFTSSxTQUFPLElBQVA7QUFDSCxDQVhNLEMsQ0FZUDs7QUFDTyxJQUFNa1QsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFDcUksTUFBRCxFQUMvQjtBQUNJTyxVQUFRLENBQUNQLE1BQUQsQ0FBUjtBQUNBQSxRQUFNLENBQUNuSSxLQUFQLENBQWFDLE9BQWIsR0FBcUIsTUFBckI7QUFDSCxDQUpNLEM7Ozs7Ozs7Ozs7OztBQzlDUDtBQUFBO0FBQUE7QUFBQTtDQUVBOztBQUNPLElBQU0yRixZQUFZLEdBQUcsU0FBZkEsWUFBZSxHQUM1QjtBQUNJLE1BQUcvTSwyREFBTyxDQUFDaUksUUFBUSxDQUFDelcsTUFBVixDQUFWLEVBQ0ksT0FBTyxLQUFQO0FBRUosTUFBTXVlLFVBQVUsR0FBRzlILFFBQVEsQ0FBQ3pXLE1BQVQsQ0FBZ0IyTyxTQUFoQixDQUEwQixDQUExQixFQUE2QmtNLEtBQTdCLENBQW1DLEdBQW5DLENBQW5CO0FBQ0EsTUFBRyxDQUFDOUMsS0FBSyxDQUFDQyxPQUFOLENBQWN1RyxVQUFkLENBQUQsSUFBOEJBLFVBQVUsQ0FBQzdQLE1BQVgsS0FBb0IsQ0FBckQsRUFDSSxPQUFPLEtBQVA7QUFFSixNQUFJOFAsS0FBSjtBQUFBLE1BQVd6SCxLQUFLLEdBQUMsRUFBakI7O0FBQ0EsT0FBSSxJQUFJekcsQ0FBUixJQUFhaU8sVUFBYixFQUNBO0FBQ0lDLFNBQUssR0FBR0QsVUFBVSxDQUFDak8sQ0FBRCxDQUFWLENBQWN1SyxLQUFkLENBQW9CLEdBQXBCLENBQVI7QUFDQSxRQUFHMkQsS0FBSyxDQUFDOVAsTUFBTixLQUFlLENBQWxCLEVBQ0lxSSxLQUFLLENBQUN5SCxLQUFLLENBQUMsQ0FBRCxDQUFOLENBQUwsR0FBZ0JDLFNBQVMsQ0FBQ0QsS0FBSyxDQUFDLENBQUQsQ0FBTixDQUF6QjtBQUNQOztBQUNELFNBQU96SCxLQUFQO0FBQ0gsQ0FqQk0sQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0hQO0FBQ0EsSUFBTXZILElBQUksR0FBQ3hVLGtFQUFjLENBQUMsQ0FBRCxDQUF6Qjs7QUFFQSxJQUFNOFksY0FBYyxHQUFHeGEsK0RBQVEsSUFBaUIsR0FBQ3lCLHlEQUFsQixHQUF3QixVQUF4QixHQUFtQ3lVLElBQW5DLEdBQXdDLEtBQXpDLENBQTlCOztBQUVBO0FBRUE7QUFDQTtBQUVPLElBQU1rUCxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLEdBQ2pDO0FBQ0k7QUFDQSxNQUFNQyxTQUFTLEdBQUMsSUFBSWpQLElBQUosR0FBV2tQLGlCQUFYLEtBQStCLENBQUMsQ0FBaEQ7QUFDQSxNQUFHRCxTQUFTLEdBQUdsYyxrRUFBWixJQUFpQ2tjLFNBQVMsR0FBR25jLGtFQUFoRCxFQUNJLE9BQU8sQ0FBUCxDQURKLEtBR0ksT0FBT21jLFNBQVA7QUFDUCxDQVJNLEMsQ0FVUDtBQUNBOztBQUNPLElBQU1FLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLE1BQUQsRUFBUzVJLEtBQVQsRUFBZ0I2SSxVQUFoQixFQUMxQjtBQUNJLE1BQU1DLFdBQVcsR0FDakI7QUFDSXRPLE1BQUUsRUFBRW9PLE1BRFI7QUFFSTVJLFNBQUssRUFBRUEsS0FGWDtBQUdJK0ksWUFBUSxFQUFFRjtBQUhkLEdBREE7QUFNQXZDLHNFQUFVLENBQUMsTUFBRCxFQUFTd0MsV0FBVCxDQUFWO0FBQ0gsQ0FUTSxDLENBV1A7QUFDQTs7QUFDTyxJQUFNRSxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQUNuSSxLQUFELEVBQ2hDO0FBQ0ksTUFBTW9JLFVBQVUsR0FBQ2pFLG1FQUFTLENBQUMsWUFBRCxDQUExQjs7QUFDQSxNQUFHLENBQUMxTSwyREFBTyxDQUFDMlEsVUFBRCxDQUFYLEVBQ0E7QUFDSSxRQUFNQyxNQUFNLEdBQUMzSCxJQUFJLENBQUNDLEtBQUwsQ0FBV3lILFVBQVgsQ0FBYjs7QUFDQSxRQUFHLENBQUMzUSwyREFBTyxDQUFDNFEsTUFBTSxDQUFDSCxRQUFSLENBQVIsSUFBNkIsQ0FBQ3pRLDJEQUFPLENBQUM0USxNQUFNLENBQUNDLGdCQUFSLENBQXJDLElBQWtFLENBQUM3USwyREFBTyxDQUFDNFEsTUFBTSxDQUFDRSxXQUFSLENBQTFFLEtBQW1HLENBQUM5USwyREFBTyxDQUFDNFEsTUFBTSxDQUFDRyxlQUFSLENBQVIsSUFBb0MsQ0FBQy9RLDJEQUFPLENBQUM0USxNQUFNLENBQUNqRCxPQUFSLENBQS9JLENBQUgsRUFDQTtBQUNJcEYsV0FBSyxDQUFDa0ksUUFBTixHQUFlRyxNQUFNLENBQUNILFFBQXRCO0FBQ0FsSSxXQUFLLENBQUNzSSxnQkFBTixHQUF1QkQsTUFBTSxDQUFDQyxnQkFBOUI7QUFDQXRJLFdBQUssQ0FBQ3VJLFdBQU4sR0FBa0JGLE1BQU0sQ0FBQ0UsV0FBekI7QUFDQSxVQUFHLENBQUM5USwyREFBTyxDQUFDNFEsTUFBTSxDQUFDRyxlQUFSLENBQVgsRUFDSXhJLEtBQUssQ0FBQ3dJLGVBQU4sR0FBc0JILE1BQU0sQ0FBQ0csZUFBN0IsQ0FESixLQUdJeEksS0FBSyxDQUFDb0YsT0FBTixHQUFjaUQsTUFBTSxDQUFDakQsT0FBckI7QUFDUDtBQUNKOztBQUNELFNBQU9wRixLQUFQO0FBQ0gsQ0FsQk0sQyxDQW9CUDtBQUNBOztBQUNPLElBQU1nRSxZQUFZO0FBQUEscUVBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBT25ELGtCQUFQLDJEQUFjLEVBQWQ7QUFBa0I0SCwwQkFBbEI7QUFBa0MzSCxtQkFBbEM7QUFBMkM0SCxxQkFBM0M7QUFBQSw2Q0FFakIsSUFBSUMsT0FBSixDQUFZLFVBQUNDLE9BQUQsRUFBVUMsTUFBVixFQUNuQjtBQUNJLGtCQUFNQyxTQUFTLEdBQUMzRSxtRUFBUyxDQUFDLE1BQUQsQ0FBekI7O0FBQ0Esa0JBQUcxTSwyREFBTyxDQUFDcVIsU0FBRCxDQUFWLEVBQ0E7QUFDSUMsNEJBQVksQ0FBQ04sY0FBRCxFQUFpQjNILE9BQWpCLEVBQTBCNEgsU0FBMUIsQ0FBWjtBQUNBRSx1QkFBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILGVBSkQsTUFNQTtBQUNJLG9CQUFNdkUsSUFBSSxHQUFDM0QsSUFBSSxDQUFDQyxLQUFMLENBQVdtSSxTQUFYLENBQVg7O0FBQ0Esb0JBQUdyUiwyREFBTyxDQUFDNE0sSUFBSSxDQUFDMUssRUFBTixDQUFQLElBQW9CbEMsMkRBQU8sQ0FBQzRNLElBQUksQ0FBQ2xGLEtBQU4sQ0FBM0IsSUFBMkMxSCwyREFBTyxDQUFDNE0sSUFBSSxDQUFDNkQsUUFBTixDQUFsRCxJQUFxRTdELElBQUksQ0FBQzZELFFBQUwsR0FBZ0J2UCxJQUFJLENBQUNxUSxHQUFMLEVBQXhGLEVBQ0E7QUFDSTVFLHdGQUFZLENBQUMsTUFBRCxDQUFaO0FBQ0EyRSw4QkFBWSxDQUFDTixjQUFELEVBQWlCM0gsT0FBakIsRUFBMEI0SCxTQUExQixDQUFaO0FBQ0FFLHlCQUFPLENBQUMsS0FBRCxDQUFQO0FBQ0gsaUJBTEQsTUFPQTtBQUNJLHNCQUFNSyxHQUFHLEdBQUcsSUFBSTlJLGNBQUosRUFBWjtBQUNBOEkscUJBQUcsQ0FBQzVJLElBQUosQ0FBUyxLQUFULEVBQWdCNWMsMERBQU0sR0FBQ3FHLDJEQUFQLEdBQWtCRyxnRUFBbEIsR0FBa0NvYSxJQUFJLENBQUNsRixLQUF2RDs7QUFDQThKLHFCQUFHLENBQUNDLE1BQUosR0FBYSxZQUNiO0FBQ0ksd0JBQUl6SSxRQUFRLEdBQUNDLElBQUksQ0FBQ0MsS0FBTCxDQUFXc0ksR0FBRyxDQUFDckksWUFBZixDQUFiOztBQUNBLHdCQUFJcUksR0FBRyxDQUFDcEksTUFBSixLQUFlLEdBQWYsSUFBc0JKLFFBQVEsQ0FBQzBJLE9BQS9CLElBQTBDMUksUUFBUSxDQUFDOUcsRUFBVCxJQUFlckMsU0FBN0QsRUFDQTtBQUNJLDBCQUFHbUosUUFBUSxDQUFDOUcsRUFBVCxLQUFjMEssSUFBSSxDQUFDMUssRUFBdEIsRUFDQTtBQUNJMEssNEJBQUksQ0FBQ2xaLElBQUwsR0FBVXNWLFFBQVEsQ0FBQ3RWLElBQW5CO0FBQ0FrWiw0QkFBSSxDQUFDK0UsUUFBTCxHQUFjM0ksUUFBUSxDQUFDMkksUUFBdkI7QUFDQS9FLDRCQUFJLENBQUNnRixjQUFMLEdBQW9CNUksUUFBUSxDQUFDNEksY0FBN0I7QUFDQWhGLDRCQUFJLENBQUN4RCxNQUFMLEdBQVlKLFFBQVEsQ0FBQ0ksTUFBckIsQ0FKSixDQUlnQzs7QUFDNUI0RSw0RkFBVSxDQUFDLE1BQUQsRUFBU3BCLElBQVQsQ0FBVixDQUxKLENBTUk7O0FBQ0EsNEJBQUc1RCxRQUFRLENBQUNJLE1BQVQsS0FBa0IsTUFBbEIsSUFBNEJKLFFBQVEsQ0FBQzZJLFFBQVQsSUFBcUIsQ0FBcEQsRUFDQTtBQUNJLDhCQUFNQyxVQUFVLEdBQUM3bEIsMkRBQU8sR0FBQyxHQUFSLEdBQVlxWixjQUFjLENBQUMzQyxXQUE1QztBQUNBLDhCQUFHcUYsTUFBTSxDQUFDQyxRQUFQLENBQWdCaEcsSUFBaEIsQ0FBcUI4UCxPQUFyQixDQUE2QkQsVUFBN0IsTUFBMkMsQ0FBQyxDQUEvQyxFQUNJOUosTUFBTSxDQUFDQyxRQUFQLENBQWdCQyxNQUFoQixDQUF1QixNQUFJNUMsY0FBYyxDQUFDM0MsV0FBbkIsR0FBK0IsWUFBdEQsRUFIUixDQUc0RTs7QUFDeEV3TyxpQ0FBTyxDQUFDLElBQUQsQ0FBUDtBQUNILHlCQU5ELE1BUUE7QUFDSSw4QkFBRy9ILE1BQU0sQ0FBQ2xKLE1BQVAsS0FBZ0IsQ0FBaEIsSUFBcUJrSixNQUFNLENBQUMySSxPQUFQLENBQWUvSSxRQUFRLENBQUNJLE1BQXhCLE1BQWtDLENBQUMsQ0FBM0QsRUFDQTtBQUNJa0ksd0NBQVksQ0FBQ04sY0FBRCxFQUFpQjNILE9BQWpCLEVBQTBCNEgsU0FBMUIsQ0FBWjtBQUNBRSxtQ0FBTyxDQUFDLEtBQUQsQ0FBUDtBQUNILDJCQUpELE1BTUlBLE9BQU8sQ0FBQyxJQUFELENBQVA7QUFDUDtBQUNKLHVCQXpCRCxNQTJCQTtBQUNJeEUsOEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQTJFLG9DQUFZLENBQUNOLGNBQUQsRUFBaUIzSCxPQUFqQixFQUEwQjRILFNBQTFCLENBQVo7QUFDQUUsK0JBQU8sQ0FBQyxLQUFELENBQVA7QUFDSDtBQUNKLHFCQWxDRCxNQW9DQTtBQUNJeEUsNEZBQVksQ0FBQyxNQUFELENBQVo7QUFDQTJFLGtDQUFZLENBQUNOLGNBQUQsRUFBaUIzSCxPQUFqQixFQUEwQjRILFNBQTFCLENBQVo7QUFDQUUsNkJBQU8sQ0FBQyxLQUFELENBQVA7QUFDSDtBQUNKLG1CQTVDRDs7QUE2Q0FLLHFCQUFHLENBQUNRLE9BQUosR0FBYztBQUFBLDJCQUFNWixNQUFNLENBQUNJLEdBQUcsQ0FBQ1MsVUFBTCxDQUFaO0FBQUEsbUJBQWQ7O0FBQ0FULHFCQUFHLENBQUM1SCxJQUFKO0FBQ0g7QUFDSjtBQUNKLGFBdEVNLENBRmlCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQVoyQyxZQUFZO0FBQUE7QUFBQTtBQUFBLEdBQWxCLEMsQ0EwRVA7O0FBQ0EsSUFBTStFLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUNOLGNBQUQsRUFBaUIzSCxPQUFqQixFQUEwQjRILFNBQTFCLEVBQ3JCO0FBQ0ksTUFBRyxDQUFDalIsMkRBQU8sQ0FBQ3FKLE9BQUQsQ0FBWCxFQUNJMkUsb0VBQVUsQ0FBQyxTQUFELEVBQVkzRSxPQUFaLENBQVY7QUFDSixNQUFHLENBQUNySiwyREFBTyxDQUFDaVIsU0FBRCxDQUFYLEVBQ0lqRCxvRUFBVSxDQUFDLEtBQUQsRUFBUWlELFNBQVIsQ0FBVjtBQUNKLE1BQUcsQ0FBQ2pSLDJEQUFPLENBQUNnUixjQUFELENBQVgsRUFDSWhKLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBaEIsQ0FBdUI4SSxjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL21hbmFnZVF1ZXN0aW9ubmFpcmVzLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL21hbmFnZVF1ZXN0aW9ubmFpcmVzLmpzXCIpO1xuIiwiY29uc3QgaW5zdGFuY2UgPSByZXF1aXJlKFwiLi9pbnN0YW5jZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBpbGx1c3RyYXRpb25zUm91dGU6IFwiL2lsbHVzdHJhdGlvbi9cIixcbiAgICAvLyBmb3JtcyA6IMOgIGNvbXBsw6l0ZXIgYXZlYyB2YWxldXJzIHBhciBkw6lmYXV0LCBldGMuIGNmIG1vZMOobGVcbiAgICBJbGx1c3RyYXRpb24gOlxuICAgIHtcbiAgICAgICAgYWx0OiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgICAgIHRpdGxlOiB7IG1heGxlbmd0aDogMjU1IH0sXG4gICAgICAgIGNhcHRpb246IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICAgICAgaW1hZ2U6IHsgcmVxdWlyZWQ6IHRydWUsIGFjY2VwdDogaW5zdGFuY2UubWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uLmpvaW4oXCIsXCIpIH1cbiAgICB9LFxuICAgIC8vIGZpbGVzIHVwbG9hZCB0ZW1wb3J5IGRpclxuICAgIGRpcklsbHVzdHJhdGlvbnNUbXAgOiBcInRlbXBcIixcbiAgICBkaXJJbGx1c3RyYXRpb25zOiBcImZyb250L3B1YmxpYy9pbWcvcXVpenNcIlxufTsiLCJjb25zdCB1c2VycyA9IHJlcXVpcmUoXCIuL3VzZXJzXCIpO1xuY29uc3QgcXVlc3Rpb25uYWlyZXMgPSByZXF1aXJlKFwiLi9xdWVzdGlvbm5haXJlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFwaVVybDogXCJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpXCIsXG4gICAgc2l0ZVVybDogXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIixcbiAgICBhZG1pbk5hbWU6IFwiRmFicmljZVwiLFxuICAgIGFkbWluRW1haWw6IFwiZGV2QHdpa2lsZXJuaS5jb21cIixcbiAgICBzZW5kZXJOYW1lOiBcIldpa2lMZXJuaSAobG9jYWwpXCIsXG4gICAgc2VuZGVyRW1haWw6IFwiYm9uam91ckB3aWtpbGVybmkuY29tXCIsXG4gICAgYWRtaW5MYW5nOiBcImZyXCIsXG4gICAgdGhlbWU6IFwid2lraWxlcm5pXCIsIC8vIGxlIHRow6htZSB1dGlsaXPDqSAoZGFucyAvdmlld3MpIHBvdXIgZ8OpbsOpcmVyIGxlcyBwYWdlcyBIVE1MLiBDb250aWVudCBzZXMgcHJvcHJlcyBmaWNoaWVycyBkZSBjb25maWd1cmF0aW9uLlxuICAgIGF2YWlsYWJsZUxhbmdzOiBbXCJmclwiXSwvLyBMYW5ndWFnZXMgaW4gd2hpY2ggdGhlIHNpdGUgaXMgYXZhaWxhYmxlLiBUaGUgZmlyc3Qgb25lIGlzIHRoZSBkZWZhdWx0IG9uZS5cbiAgICBzaXRlTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIGJlZ2luQ29kZUdvZGZhdGhlcjogXCJXTFwiLCAvLyBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FuJ3QgY29udGFpbiBcIkBcIiAhXG4gICAgZGVmYXVsdFJlY2VpcHREYXlzOiBcIjE0N1wiLCAvLyBQYXIgZMOpZmF1dCwgcXVlbChzKSBqb3VyKHMpIGRlIGxhIHNlbWFpbmUsIGwndXRpbGlzYXRldXIgcmXDp29pdC1pbCBxdWVscXVlIGNob3NlID8gKDE9ZGltYW5jaGUsIDI9bHVuZGkuLi4gNz1zYW1lZGkpXG4gICAgY3JvblRpbWluZ0FsZXJ0SW5TZWNvbmRlOiAxMjAsIC8vIGZvciBsb2dzXG4gICAgcmVzcG9uc2VUaW1pbmdBbGVydEluU2Vjb25kZTogMywgLy8gaWRlbVxuICAgIHRva2VuU2lnbnVwVmFsaWRhdGlvblRpbWVJbkhvdXJzOiBcIjQ4aFwiLCAvLyBodHRwczovL2dpdGh1Yi5jb20vemVpdC9tc1xuICAgIHRva2VuTG9naW5MaW5rVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1pblRpbWVJbkhvdXJzOiBcIjI0aFwiLFxuICAgIHRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5czogXCIxODAgZGF5c1wiLFxuICAgIHRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzOiBcIjFoXCIsLy8gZm9yIGVtYWlsICYgcGFzc3dvcmQgY2hhbmdpbmdcbiAgICB0b2tlbkRlbGV0ZVVzZXJUaW1lSW5Ib3VyczogXCIxaFwiLFxuICAgIHRva2VuVW5zdWJzY3JpYmVMaW5rVGltZUluRGF5czogXCI3IGRheXNcIiwgLy8gdG9rZW4gc2VuZCB3aXRoIHN1YnNjcmlwdGlvbidzIGVtYWlsc1xuICAgIGZyZWVBY2NvdW50VGltaW5nSW5EYXlzOiAxNSxcbiAgICBmcmVlQWNjb3VudEV4cGlyYXRpb25Ob3RpZmljYXRpb25JbkRheXM6IDMsXG4gICAgYWNjb3VudEV4cGlyYXRpb25GaXJzdE5vdGlmaWNhdGlvbkluRGF5czogMTAsXG4gICAgYWNjb3VudEV4cGlyYXRpb25TZWNvbmROb3RpZmljYXRpb25JbkRheXM6IDMsXG4gICAgaW5hY3RpdmVBY2NvdW50VGltZVRvRGVsZXRlSW5EYXlzOiAxODAsXG4gICAgLy8gUXVlc3Rpb25uYWlyZXM6XG4gICAgbmJRdWVzdGlvbnNNaW46IDEsIC8vIG1pbmltdW0gbnVtYmVyIG9mIHF1ZXN0aW9ucyBmb3IgdGhlIHF1ZXN0aW9ubmFpcmUgdG8gYmUgcHVibGlzaGFibGVcbiAgICBuYlF1ZXN0aW9uc01heDogMiwgLy8gaWYgMCA9IG5vdCBtYXhpbXVtXG4gICAgbmJDaG9pY2VzTWF4OiAxMCxcbiAgICBuYk5ld1F1ZXN0aW9ubmFpcmVzOiAxMiwvLyBmb3IgUlNTLCBldGMuXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW46NywgLy8gaW4gdXNlciBsb2NhbCB0aW1lXG4gICAgaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlRW5kOjIxLCAvLyBpZGVtXG4gICAgbWF4UXVlc3Rpb25uYWlyZVNlbmRlZEF0U2FtZVRpbWU6IDUwLCAvLyBmb3Igc3Vic2NyaXB0aW9uJ3MgZS1tYWlsaW5nXG4gICAgbWluU2VhcmNoUXVlc3Rpb25uYWlyZXM6IDMsXG4gICAgZmllbGROZXdRdWVzdGlvbm5haXJlcyA6IFwicHVibGlzaGluZ0F0XCIsIC8vIGZpZWxkIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBsaXN0IG9mIHRoZSBsYXN0IHF1ZXN0aW9ubmFpcmVzLCBjYW4gYmUgXCJjcmVhdGVkQXRcIiwgXCJ1cGRhdGVkQXRcIiBvciBcInB1Ymxpc2hpbmdBdFwiXG4gICAgLy8gR3JvdXBzIDpcbiAgICBuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1pbjogMixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzQnlHcm91cE1heDogMCxcbiAgICAvLyBJbGx1c3RyYXRpb25zOlxuICAgIG5iSWxsdXN0cmF0aW9uc01pbjogMSxcbiAgICBuYklsbHVzdHJhdGlvbnNNYXg6IDEsXG4gICAgbWF4SWxsdXN0cmF0aW9uU2l6ZWluT2N0ZXQ6IDEwMDAwMDAsLy8gcGFzIGNvbnRyw7Rsw6kgcG91ciBsJ2luc3RhbnQuIMOAIHJldm9pci5cbiAgICBtaW1lVHlwZXNGb3JJbGx1c3RyYXRpb246IFsgXCJpbWFnZS9qcGdcIiwgXCJpbWFnZS9qcGVnXCIsIFwiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvcG5nXCIgXSxcbiAgICAvLyAtLSBVcGxvYWQgYW5kIHJlc2l6ZTpcbiAgICBpbGx1c3RyYXRpb25zV2lkdGhNYXhJblB4OiA1MDAsXG4gICAgaWxsdXN0cmF0aW9uc01pbmlhdHVyZXNXaWR0aE1heEluUHg6IDIwMCxcbiAgICAvLyBMaW5rczpcbiAgICBuYkxpbmtzTWluOiAxLFxuICAgIG5iTGlua3NNYXg6IDEsXG4gICAgLy8gUXVlc3Rpb25zICYgcmVzcG9uc2VzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgLy8gw6Agc3VwcHJpbWVyIHF1YW5kIHRvdXMgbGVzIFwicmVxdWlyZVwiIMOgIGpvdXI6XG4gICAgcGFzc3dvcmRNaW5MZW5ndGg6IHVzZXJzLnBhc3N3b3JkLm1pbmxlbmd0aCxcbiAgICBkaXJDYWNoZVVzZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzLFxuICAgIGRpckNhY2hlVXNlcnNBbnN3ZXJzOiB1c2Vycy5kaXJDYWNoZVVzZXJzQW5zd2VycyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ubmFpcmVzLFxuICAgIGRpckNhY2hlUXVlc3Rpb25zOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVF1ZXN0aW9ucyxcbiAgICBkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckNhY2hlVXNlcnNRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJIVE1MUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpckhUTUxRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJXZWJRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyV2ViUXVlc3Rpb25uYWlyZXNcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIEFQSSdyb3V0ZXMgKGFmdGVyIFwiYXBpVXJsXCIgZGVmaW5lZCBpbiBpbnN0YW5jZS5qcylcbiAgICBsaW5rc1JvdXRlOiBcIi9saW5rL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIExpbmsgOlxuICAgIHtcbiAgICAgICAgdXJsOiB7IG1heGxlbmd0aDogMjU1LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBhbmNob3I6IHsgbWF4bGVuZ3RoOiAxNTAsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9XG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIiwvLyBsYSBiYXNlIMOgIGxhcXVlbGxlIHMnYWpvdXRlIGxlcyByb3V0ZXMgc3VpdmFudGVzXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvZ2V0cmFuZG9tXCIsIFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgcmVnZW5lcmF0ZUhUTUw6IFwiL2h0bWxyZWdlbmVyYXRlZFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIGdyb3VwZXMgOlxuICAgIGdyb3VwUm91dGVzOiBcIi9ncm91cFwiLFxuICAgIGdldEdyb3VwUm91dGU6IFwiL2dldC9cIixcbiAgICBwcmV2aWV3R3JvdXBSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBzZWFyY2hHcm91cHNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIiwvLyBmb25jdGlvbm5lIGF1c3NpIHBvdXIgbGVzIGdyb3VwZXNcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsLy8gaWRlbVxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgR3JvdXAgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoR3JvdXBzOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSlNPTiBnw6luw6lyw6lzIDpcbiAgICBkaXJDYWNoZUdyb3VwcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvZ3JvdXBzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBIVE1MIGfDqW7DqXLDqXMgOlxuICAgIGRpckhUTUxHcm91cHMgOiBcImZyb250L3B1YmxpYy9xdWl6L2dwXCIsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxOZXdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgLy8gSWRlbSBtYWlzIHBvdXIgdXJscyA6XG4gICAgZGlyV2ViR3JvdXBzIDogXCJxdWl6L2dwXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXMgOiBcInF1aXpcIixcbiAgICBkaXJXZWJOZXdzIDogXCJxdWl6cy9cIixcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6cy9cIixcbiAgICAvLyBsaW1pdGUgZGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlLCBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkIDpcbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLFxuICAgIC8qIFZhbGV1cnMgZW4gZmFpdCBkw6lmaW5pZXMgZGFucyBpbnN0YW5jZS5qcyBkb25jIMOgIHN1cHByaW1lciBxdWFuZCBwbHVzIHV0aWxpc8OpZXMgYWlsbGV1cnMgOiAqL1xuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLCAgIFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsICAgIFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGdldFVzZXJzUXVlc3Rpb25uYWlyZXNSb3V0ZTogXCIvZ2V0dXNlcnNxdWVzdGlvbm5haXJlcy9cIiwvLyBsZXMgcXVlc3Rpb25uYWlyZXMgYXV4cXVlbHMgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCBldSBhY2PDqHMgdmlhIHNvbiBhYm9ubmVtZW50ICAgIFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIHNpZ251cENvbXBsZXRpb25Sb3V0ZTogXCIvc2lnbnVwY29tcGxldGlvbi9cIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDogODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvd2l0aG91dFwiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9pbGx1c3RyYXRpb25cIjogXCIuLi9sYW5nL2ZyL2lsbHVzdHJhdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2lsbHVzdHJhdGlvbiRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvbGlua1wiOiBcIi4uL2xhbmcvZnIvbGluay5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL2xpbmskXCI7IiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL3F1ZXN0aW9uXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbi5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3F1ZXN0aW9uJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICBhbGVydE5ld1dpbmRvdzogXCJub3V2ZWxsZSBmZW7DqnRyZVwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBZmZpY2hlciAhXCIsXG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsXG4gICAgYnRuUHJvcG9zZVN1YnNjcmliZTogXCJKZSBjcsOpZSBtb24gY29tcHRlLlwiLFxuICAgIGJ0blNob3dPbldlYlNpdGU6IFwiVm9pciBzdXIgI1NJVEVfTkFNRS5cIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGRlIGwnZW5yZWdpc3RyZW1lbnQgI0lEIGEgw6ljaG91w6kuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBsYSBjdWx0dXJlIGfDqW7DqXJhbGUgZW4gbGliZXJ0w6lcIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJBdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLiBWb3VzIHJlY2V2ZXogZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuIERlcyBxdWl6cyB2b3VzIHBlcm1ldHRlbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUuXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIixcbiAgICBzdWJzY3JpcHRpb25DYWxsOiBcIkluc2NyaXZlei12b3VzICFcIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCIsXG4gICAgYWRkSWxsdXN0cmF0aW9uVHh0OiBcIkFqb3V0ZXIgdW5lIGlsbHVzdHJhdGlvblwiLFxuICAgIGRlZmF1bHRBbHQgOiBcIklsbHVzdHJhdGlvbiBkdSBxdWl6XCIsXG4gICAgZGVsZXRlZE9rTWVzc2FnZTogXCJMJ2lsbHVzdHJhdGlvbiBhIGJpZW4gw6l0w6kgc3VwcHJpbcOpZS5cIixcbiAgICBpbnRyb05vSWxsdXN0cmF0aW9uIDogXCJBdWN1bmUgaWxsdXN0cmF0aW9uIHBvdXIgbCdpbnN0YW50LlwiLFxuICAgIGludHJvVGl0bGVGb3JJbGx1c3RyYXRpb24gOiBcIklsbHVzdHJhdGlvbnMgZHUgcXVpelwiLFxuICAgIG5lZWRHb29kRmlsZSA6IFwiVm90cmUgZmljaGllciBuJ2EgcGFzIMOpdMOpIGFjY2VwdMOpLlwiLFxuICAgIG5lZWRHb29kTG9uZ0FsdCA6IFwiTGUgdGV4dGUgZGUgbGEgcHJvcHJpw6l0w6kgJ2FsdCcgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdDYXB0aW9uIDogXCJMZSB0ZXh0ZSBkZSBsYSBsw6lnZW5kZSBkZSBsJ2ltYWdlIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZEdvb2RMb25nVGl0bGUgOiBcIkxlIHRleHRlIGRlIGxhIHByb3ByacOpdMOpICd0aXRsZScgbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkR29vZExvbmdVcmwgOiBcIkwndXJsIGRlIGwnaW1hZ2UgZG9pdCBjb250ZW5pciBlbnRyZSA1IGV0IDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTWF4SWxsdXN0cmF0aW9uc0ZvclF1ZXN0aW9ubmFpcmUgOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkJ2lsbHVzdHJhdGlvbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICAgIG5lZWRRdWVzdGlvbm5haXJlRm9ySWxsdXN0cmF0aW9uIDogXCJUZW50YXRpdmUgZCdham91dC9taXNlIMOgIGpvdXIvc3VwcHJlZXNzaW9uIGQndW5lIGlsbHVzdHJhdGlvbiBwb3VyIHVuIHF1ZXN0aW9ubmFpcmUgbidheWFudCBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICBuZWVkVW5pcXVlVXJsIDogXCJMJ3VybCBlc3QgZMOpasOgIHV0aWxpc8OpZSBwYXIgdW5lIGF1dHJlIGltYWdlLlwiLFxuICAgIG5lZWRVcmwgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIHVybCBwb3VyIGwnaW1hZ2UuXCIsXG4gICAgbm90Rm91bmQ6IFwiTCdlbnJlZ2lzdHJlbWVudCBkZSBsJ2lsbHVzdHJhdGlvbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kgOiBcIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIkwnaWxsdXN0cmF0aW9uIGEgYmllbiDDqXTDqSBtb2RpZmnDqWUuXCIsXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhZGRlZE9rTWVzc2FnZTogXCJMZSBsaWVuIGEgYmllbiDDqXTDqSBham91dMOpLlwiLFxuICAgIGFkZExpbmtUeHQ6IFwiQWpvdXRlciB1biBsaWVuXCIsXG4gICAgZGVmYXVsdFZhbHVlRm9yTGluazogXCJMaXJlIGwnYXJ0aWNsZSBzdXIgV2lraXDDqWRpYS5cIixcbiAgICBkZWxldGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBpbnRyb05vTGluayA6IFwiQXVjdW4gbGllbiBwb3VyIGwnaW5zdGFudC5cIixcbiAgICBpbnRyb1RpdGxlRm9yTGluayA6IFwiTGVjdHVyZXMgcHJvcG9zw6llc1wiLFxuICAgIG5lZWRBbmNob3IgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIGFuY3JlIHBvdXIgY2UgbGllbi5cIixcbiAgICBuZWVkR29vZExvbmdBbmNob3IgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW5lIGFuY3JlIHBvdXIgY2UgbGllbiBjb21wdGFudCBlbnRyZSA1IGV0IDE1MCBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTWF4TGlua3NGb3JRdWVzdGlvbm5haXJlIDogXCJWb3VzIGF2ZXogZMOpasOgIGF0dGVpbnQgbGUgbm9tYnJlIG1heGltYWwgZGUgbGllbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICAgIG5lZWROb3RUb29Mb25nVXJsIDogXCJNZXJjaSBkZSAgc2Fpc2lyIHVuIHVybCBuZSBjb21wdGFudCBwYXMgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmUgOiBcIkxlIHF1ZXN0aW9ubmFpcmUgZHUgbGllbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgbmVlZFVybCA6IFwiTWVyY2kgZGUgIHNhaXNpciBsJ3VybCBkdSBsaWVuLlwiLFxuICAgIG5lZWRWYWxpZFVybCA6IFwiTWVyY2kgZGUgIHNhaXNpciB1biB1cmwgYXlhbnQgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBub3RGb3VuZCA6IFwiTCdlbnJlZ2lzdHJlbWVudCBkdSBsaWVuIG4nYSBwYXMgw6l0w6kgdHJvdXbDqS5cIixcbiAgICB1cGRhdGVkT2tNZXNzYWdlOiBcIkxlIGxpZW4gYSBiaWVuIMOpdMOpIG1vZGlmacOpLlwiXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhZGRPa01lc3NhZ2U6IFwiTGEgcXVlc3Rpb24gYSBiaWVuIMOpdMOpIGFqb3V0w6llLlwiLFxuICAgIGFkZFF1ZXN0aW9uVHh0OiBcIkFqb3V0ZXIgdW5lIHF1ZXN0aW9uXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBzdXBwcmltw6llLlwiLFxuICAgIGludHJvTm9RdWVzdGlvbjogXCJBdWN1bmUgcXVlc3Rpb24gbidhIMOpdMOpIHNhaXNpZSBwb3VyIGwnaW5zdGFudFwiLFxuICAgIGludHJvVGl0bGVGb3JRdWVzdGlvbjogXCJMZXMgcXVlc3Rpb25zIGVucmVnaXN0csOpZXNcIixcbiAgICBuZWVkTWF4UXVlc3Rpb25zOiBcIlZvdXMgYXZleiBkw6lqw6AgYXR0ZWludCBsZSBub21icmUgbWF4aW1hbCBkZSBxdWVzdGlvbnMgcG91ciBjZSBxdWVzdGlvbm5haXJlIDogXCIsICAgICAgICAgXG4gICAgbmVlZE5vdFRvb0xvbmdUZXh0OiBcIkxhIHF1ZXN0aW9uIG5lIGRvaXQgcGFzIGNvbXB0ZXIgcGx1cyBkZSAyNTUgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE51bWJlckZvclJhbmsgOiBcIlZvdXMgZGV2ZXogZm91cm5pciB1biBub21icmUgc3Vww6lyaWV1ciBvdSDDqWdhbCDDoCAxIHBvdXIgbGUgcmFuZyBkZSBjZXR0ZSBxdWVzdGlvbi5cIiwgXG4gICAgbmVlZFF1ZXN0aW9ubmFpcmU6IFwiTGUgcXVlc3Rpb25uYWlyZSBjb25jZXJuw6kgbidhIHBhcyDDqXTDqSB0cm91dsOpLlwiLFxuICAgIG5lZWRUZXh0OiBcIk1lcmNpIGRlIHNhaXNpciBsZSB0ZXh0ZSBkZSBsYSBxdWVzdGlvbiAhXCIsICAgXG4gICAgbm90Rm91bmQ6IFwiTCdlbnJlZ2lzdHJlbWVudCBkZSBsYSBxdWVzdGlvbiBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgdXBkYXRlT2tNZXNzYWdlOiBcIkxhIHF1ZXN0aW9uIGEgYmllbiDDqXTDqSBtb2RpZmnDqWUuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGJ0blByb3Bvc2VDb25uZWN0aW9uOiBcIkplIG1lIGNvbm5lY3RlLlwiLC8vIGTDqXBsYWPDqSBkYW5zIGdlbmVyYWwuanNcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsLy9pZGVtXG4gICAgYnRuU2VuZFJlc3BvbnNlOiBcIlRlc3RleiB2b3MgcsOpcG9uc2VzLlwiLFxuICAgIGJ0blNoYXJlUXVpelR4dDogXCJQYXJ0YWdlciB2aWEgXCIsXG4gICAgYnRuU2hhcmVRdWl6TWFpbEJvZHk6IFwiQm9uam91ciwlMEElMEFWb2ljaSUyMHVuJTIwbGllbiUyMGludGVybmV0JTIwcXVpJTIwZGV2cmFpdCUyMHQnaW50w6lyZXNzZXIgOiUwQVwiLCAgICBcbiAgICBidG5TaG93UXVlc3Rpb25uYWlyZTogXCJSw6lwb25kcmUgYXUgcXVpeiAhXCIsXG4gICAgY29ycmVjdEFuc3dlclR4dDogXCJCb25uZSByw6lwb25zZVwiLFxuICAgIGVzdGltYXRlZFRpbWU6IFwiRHVyw6llIGRlIGxlY3R1cmUgZXN0aW3DqWUgOiBcIixcbiAgICBlc3RpbWF0ZWRUaW1lT3B0aW9uIDpcbiAgICB7XG4gICAgICAgIHNob3J0OiBcImNvdXJ0ZVwiLFxuICAgICAgICBtZWRpdW06IFwibW95ZW5uZVwiLFxuICAgICAgICBsb25nOiBcImxvbmd1ZVwiXG4gICAgfSxcbiAgICBleHBsYW5hdGlvbkJlZm9yZVR4dDogXCJFeHRyYWl0IDpcIixcbiAgICBoYXZlQmVlblB1Ymxpc2hlZCA6IFwiOk5CIG5vdXZlYXV4IHF1ZXN0aW9ubmFpcmVzIG9udCDDqXTDqSBwdWJsacOpcy5cIixcbiAgICBoYXZlQmVlblJlZ2VuZXJhdGVkIDogXCJMZXMgcGFnZXMgSFRNTCBkZSAjTkIxIHF1ZXN0aW9ubmFpcmVzIG91IMOpbMOpbWVudHMgZGUgZ3JvdXBlcywgI05CMiBxdWl6cyBncm91cMOpcyBldCAjTkIzIHRow6htZXMgb250IMOpdMOpIHJlZ8OpbsOpcsOpcy5cIixcbiAgICBsYXN0VXBkYXRlZDogXCJEZXJuacOocmUgbWlzZSDDoCBqb3VyLCBsZSBcIixcbiAgICBsaW5rR29Ub05leHRFbGVtZW50OiBcIkFydGljbGUgc3VpdmFudFwiLFxuICAgIGxpbmtHb1RvUXVpejogXCJBY2PDqWRlciBhdSBxdWl6XCIsICAgIFxuICAgIG5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGU6IFwiTGEgZGF0ZSBkZSBwdWJsaWNhdGlvbiBmb3VybmllIG4nYSBwYXMgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5lZWRHcm91cElmUmFuazogXCJWb3VzIGF2ZXogc2Fpc2kgdW4gcmFuZyBkZSBjbGFzc2VtZW50LCBzYW5zIHPDqWxlY3Rpb25uZXIgbGUgZ3JvdXBlIGR1IHF1aXouXCIsXG4gICAgbmVlZEludHJvZHVjdGlvbjogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRleHRlIGQnaW50cm9kdWN0aW9uIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkTm90VG9vTG9uZ1RpdGxlOiBcIkxlIHRpdHJlIGR1IHF1aXogbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTnVtYmVyRm9yUmFuazogXCJWb3VzIGRldmV6IHNhaXNpciB1biBub21icmUgZW50aWVyIHBvdXIgbGUgcmFuZyBkZSBjZSBxdWVzdGlvbm5haXJlIGRhbnMgc29uIGdyb3VwZS5cIiwgICAgICAgICAgICAgIFxuICAgIG5lZWRUaXRsZTogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRpdHJlIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZFVuaXF1ZVVybDogXCJMJ3VybCBkdSBxdWl6IGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmU6IFwiUHJvY2hhaW5lIGRhdGUgc2FucyBxdWl6IHByb2dyYW1tw6kgOiBcIixcbiAgICBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0OiBcIkxlcyAjTkIgcHJvY2hhaW5zIHF1aXpzIGRldmFudCDDqnRyZSBwdWJsacOpc1wiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTmFtZTogXCJxdWl6XCIsXG4gICAgcXVlc3Rpb25uYWlyZU5lZWRCZUNvbXBsZXRlZDogXCJRdWl6IGluY29tcGxldFwiLFxuICAgIHB1Ymxpc2hlZEF0OiBcIiwgbGVcIixcbiAgICBwdWJsaXNoZWRCeTogXCJRdWl6IHB1Ymxpw6kgcGFyXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZVJlc3VsdFRpdGxlIDogXCJSw6lzdWx0YXQgcG91ciB2b3RyZSByZWNoZXJjaGVcIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0IDogXCJBdWN1biBxdWl6IG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgdm90cmUgcmVjaGVyY2hlLlwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoUmVzdWx0IDogXCJJbCB5IGEgI05CIGFydGljbGUjUyBjb3JyZXNwb25kYW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgd3JvbmdBbnN3ZXJUeHQ6IFwiTWF1dmFpc2UgcsOpcG9uc2VcIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6kgYXUgc2l0ZSAhXCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiQXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG5lIGNvcnJlc3BvbmQgYXV4IGluZm9ybWF0aW9ucyBzYWlzaWVzLlwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+w4AgYmllbnTDtHQgIVwiLCBcbiAgICBjb25uZWN0aW9uT2s6IFwiQ29ubmV4aW9uIHLDqXVzc2llLlwiLFxuICAgIGNyZWF0aW9uT2tNZXNzYWdlOiBcIkxlIG5vdXZlbCB1dGlsaXNhdGV1ciBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6kuXCIsXG4gICAgY3JvbkRlbGV0ZVVudmFsaWRlZFVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgbm9uIHZhbGlkw6lzIG9udCDDqXTDqSBzdXBwcmltw6lzLlwiLFxuICAgIGRlbGV0ZUZhaWxNZXNzYWdlOiBcIlRlbnRhdGl2ZSBkZSBzdXBwcmVzc2lvbiBkJ3VuIHV0aWxpc2F0ZXVyIGluZXhpc3RhbnQgOiBcIixcbiAgICBkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZTogXCIgY29tcHRlcyB1dGlsaXNhdGV1cnMgaW5hY3RpZnMgb250IMOpdMOpIHN1cHByaW3DqXMuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlOiBcIkwndXRpbGlzYXRldXIgYSBiaWVuIMOpdMOpIHN1cHByaW3DqS5cIixcbiAgICBlbWFpbE5vdEZvdW5kOiBcIkF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIGZvcm1zRW1haWxMYWJlbDogXCJFLW1haWwgOlwiLFxuICAgIGZvcm1zRW1haWxQbGFjZWhvbGRlcjogXCJWb3RyZSBhZHJlc3NlIGUtbWFpbFwiLFxuICAgIGZvcm1zQ0dVT2tMYWJlbDogXCJKJ2FjY2VwdGUgPGEgaHJlZj0jbGluayB0YXJnZXQ9XFxcIl9ibGFua1xcXCIgcmVsPVxcXCJub29wZW5lclxcXCIgdGl0bGU9XFxcIsOAIGxpcmUgOilcXFwiPmxlcyBDb25kaXRpb25zIEfDqW7DqXJhbGUgZCdVdGlsaXNhdGlvbjwvYT4gZHUgc2l0ZSAocmVxdWlzKS5cIixcbiAgICBmb3Jtc1N1Ym1pdFR4dDogXCJKZSBtJ2Fib25uZSAhXCIsXG4gICAgZ29kZmF0aGVyRm91bmQ6IFwiVm90cmUgXFxcInBhcnJhaW5cXFwiIGEgYmllbiDDqXTDqSB0cm91dsOpLiBDZXR0ZSBwZXJzb25uZSBzZXJhIGF2ZXJ0aWUgcXVlIHZvdXMgbCdhdmV6IGTDqXNpZ27DqWUuXCIsXG4gICAgZ29kZmF0aGVyTm90Rm91bmQ6IFwiRMOpc29sw6kgbWFpcyBhdWN1biB1dGlsaXNhdGV1ciBuJ2Egw6l0w6kgdHJvdXbDqSBwb3VyIGNlIGNvZGUgLyBlLW1haWwgZGUgcGFycmFpbmFnZSA6KFwiLFxuICAgIGluZm9zQWRtaW5Hb2RmYXRoZXI6IFwiQ2V0IHV0aWxpc2F0ZXVyIGEgw6l0w6kgcGFycmFpbsOpIHBhciBcIixcbiAgICBpbmZvc0FkbWluTmJHb2RDaGlsZHM6IFwiU2VzICNOQiBmaWxsZXVscyA6IFwiLFxuICAgIGluZm9zVXNlckZvckFkbWluOiBcIkNldCB1dGlsaXNhdGV1ciAoaWQ6IElEX1VTRVIpIGEgPGI+Y3LDqcOpIHNvbiBjb21wdGUgbGUgREFURV9DUkVBPC9iPiwgbGEgZGVybmnDqHJlIG1pc2Ugw6Agam91ciBkYXRhbnQgZHUgREFURV9VUERBVEUuPGJyPjxiPkRhdGUgZGUgc2EgZGVybmnDqHJlIGNvbm5leGlvbiA6IERBVEVfQ09OTkVDVElPTi48L2I+XCIsXG4gICAgaW5mb3NVc2VyTmJHb2RDaGlsZHM6IFwiVm9pY2kgbGVzICNOQiB1dGlsaXNhdGV1cihzKSBpbnNjcml0KHMpIGVuIHZvdXMgZMOpc2lnbmFudCBjb21tZSBcXFwicGFycmFpblxcXCIgOiBcIixcbiAgICBpbmZvc1VzZXJOb0dvZGNoaWxkczogXCJQb3VyIGwnaW5zdGFudCwgYXVjdW5lIHBlcnNvbm5lIG5lIHMnZXN0IGluc2NyaXRlLCBlbiB2b3VzIGTDqXNpZ25hbnQgY29tbWUgXFxcInBhcnJhaW5cXFwiLlwiLFxuICAgIG1haWxEZWxldGVCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciBjb25maXJtZXIgbGEgc3VwcHJlc3Npb24gZGUgdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxEZWxldGVCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5cXG5Qb3VyIGNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUsIGNsaXF1ZXogc3VyIGxlIGxpZW4gc3VpdmFudCBzYW5zIHRhcmRlciA6XFxuTElOS19VUkxcIixcbiAgICBtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlOiBcIklsIHNlbWJsZSBxdWUgdm91cyBheWV6IGTDqWrDoCB2YWxpZMOpIGxhIHN1cHByZXNzaW9uIGRlIHZvdHJlIGNvbXB0ZS5cIixcbiAgICBtYWlsRGVsZXRlTGlua0ZhaWxNZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgc3VwcHJlc3Npb24gbidlc3QgcGFzIHZhbGlkZSBvdSBhbG9ycyBpbCBhIGV4cGlyw6kuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtNZXNzYWdlOiBcIlZvdHJlIGRlbWFuZGUgZGUgc3VwcHJlc3Npb24gYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS4gTWVyY2kgZGUgY2xpcXVlciBzYW5zIHRhcmRlciBzdXIgbGUgbGllbiBxdWkgdmllbnQgZGUgdm91cyDDqnRyZSBlbnZvecOpIHBhciBlLW1haWwgcG91ciBjb25maXJtZXIuXCIsXG4gICAgbWFpbERlbGV0ZUxpbmtPa01lc3NhZ2U6IFwiVm90cmUgY29tcHRlIGEgYmllbiDDqXTDqSBzdXBwcmltw6kuIE1lcmNpIGQnYXZvaXIgdXRpbGlzw6kgbm9zIHNlcnZpY2VzLlwiLFxuICAgIG1haWxEZWxldGVMaW5rVHh0IDogXCJDb25maXJtZXIuXCIsXG4gICAgbWFpbERlbGV0ZVN1YmplY3QgOiBcIkNvbmZpcm1lciBsYSBzdXBwcmVzc2lvbiBkZSB2b3RyZSBjb21wdGUuXCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDo8L3A+XCIsXG4gICAgbWFpbExvZ2luTGlua0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdm91cyBjb25uZWN0ZXIgw6Agdm90cmUgY29tcHRlLCBjbGlxdWV6IHN1ciBsZSBsaWVuIHN1aXZhbnQgc2FucyB0YXJkZXIgOlxcbkxJTktfVVJMXCIsXG4gICAgbWFpbExvZ2luTGlua01lc3NhZ2UgOiBcIlVuIGxpZW4gZGUgY29ubmV4aW9uIHZpZW50IGRlIHZvdXMgw6p0cmUgZW52b3nDqSBzdXIgdm90cmUgYWRyZXNzZSBlLW1haWwuIE5lIHRhcmRleiBwYXMgw6AgbCd1dGlsaXNlciwgY2FyIGlsIG4nZXN0IHZhbGFibGUgcXVlIGR1cmFudCAqVElNSU5HKiAhXCIsXG4gICAgbWFpbExvZ2luTGlua1N1YmplY3QgOiBcIlZvdHJlIGxpZW4gZGUgY29ubmV4aW9uLlwiLFxuICAgIG1haWxMb2dpbkxpbmtUeHQgOiBcIk1lIGNvbm5lY3Rlci5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+R3LDomNlIMOgIHZvdXMsIHVuIG5vdXZlbCB1dGlsaXNhdGV1ciAoRU1BSUwpIHZpZW50IGRlIHMnaW5zY3JpcmUgc3VyIE5PTV9TSVRFLjxicj5TaSBkYW5zIGwnYXZlbmlyIGNldHRlIHBlcnNvbm5lIHNvdXNjcml0IHVuIGFib25uZW1lbnQgcHLDqW1pdW0sIHZvdHJlIHByb3ByZSBhYm9ubmVtZW50IHNlcmEgcHJvbG9uZ8OpIGRlIDMwIGpvdXJzLjwvcD48cD5FbmNvcmUgbWVyY2kgZXQgw6AgYmllbnTDtHQgITwvcD5cIixcbiAgICBtYWlsVGhhbmtHb2RmYXRoZXJCb2R5VHh0IDogXCJCb25qb3VyIFVTRVJfTkFNRSxcXG5HcsOiY2Ugw6Agdm91cywgdW4gbm91dmVsIHV0aWxpc2F0ZXVyIChFTUFJTCkgdmllbnQgZGUgcydpbnNjcmlyZSBzdXIgTk9NX1NJVEUuXFxuU2kgZGFucyBsJ2F2ZW5pciBjZXR0ZSBwZXJzb25uZSBzb3VzY3JpdCB1biBhYm9ubmVtZW50IHByw6ltaXVtLCB2b3RyZSBwcm9wcmUgYWJvbm5lbWVudCBzZXJhIHByb2xvbmfDqSBkZSAzMCBqb3Vycy5cXG5FbmNvcmUgbWVyY2kgZXQgw6AgYmllbnTDtHQgIVwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlckxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxUaGFua0dvZGZhdGhlclN1YmplY3QgOiBcIk1lcmNpICFcIixcbiAgICBtYWlsVXBkYXRlTG9naW5Cb2R5SFRNTCA6IFwiPGgzPkJvbmpvdXIgVVNFUl9OQU1FLDwvaDM+PHA+UG91ciB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uLCBjbGlxdWV6IHN1ciBsZSBsaWVuIGNpLWRlc3NvdXMgc2FucyB0YXJkZXIuPC9wPlwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciB2b3Mgbm91dmVhdXggaWRlbnRpZmlhbnRzIGRlIGNvbm5leGlvbiwgY2xpcXVleiBzdXIgbGUgbGllbiBzdWl2YW50IHNhbnMgdGFyZGVyIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlOiBcIkNlcGVuZGFudCwgdm91cyBhdmV6IG1vZGlmacOpIGF1IG1vaW5zIHVuIGRlIHZvcyBpZGVudGlmaWFudHMgZGUgY29ubmV4aW9uIChlLW1haWwgZXQvb3UgbW90IGRlIHBhc3NlKSBldCA8Yj52b3VzIGRldmV6IGNsaXF1ZXIgc3VyIGxlIGxpZW4gcXVpIHZpZW50IGRlIHZvdXMgw6p0cmVzIGVudm95w6kgc3VyIHZvdHJlIGFkcmVzc2UgKE5FV19FTUFJTCkgcG91ciB2YWxpZGVyIGNlIGNoYW5nZW1lbnQ8L2I+Ljxicj5FbiBhdHRlbmRhbnQsIG1lcmNpIGRlIGNvbnRpbnVlciDDoCB1dGlsaXNlciB2b3MgYW5jaWVucyBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFVwZGF0ZUxvZ2luTGlua1R4dCA6IFwiVmFsaWRlci5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5Pa01lc3NhZ2U6IFwiTGEgbWlzZSDDoCBqb3VyIGRlIHZvcyBpZGVudGlmaWFudHMgYSBiaWVuIMOpdMOpIGVucmVnaXN0csOpZS5cIixcbiAgICBtYWlsVXBkYXRlTG9naW5TdWJqZWN0IDogXCJNZXJjaSBkZSB2YWxpZGVyIHZvcyBub3V2ZWF1eCBpZGVudGlmaWFudHMuXCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Qb3VyIHZhbGlkZXIgZXQgY29tcGzDqXRlciB2b3RyZSBpbnNjcmlwdGlvbiwgbWVyY2kgZGUgY2xpcXVlciBzdXIgbGUgbGllbiBjaS1kZXNzb3VzIGRhbnMgbGVzIDI0aC48L3A+XCIsXG4gICAgbWFpbFZhbGlkYXRpb25MaW5rU0JvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblBvdXIgdmFsaWRlciBldCBjb21wbMOpdGVyIHZvdHJlIGluc2NyaXB0aW9uLCBtZXJjaSBkZSBjbGlxdWVyIHN1ciBsZSBsaWVuIHN1aXZhbnQgZGFucyBsZXMgMjRoIDpcXG5MSU5LX1VSTFwiLFxuICAgIG1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QgOiBcIk1lcmNpIGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb25cIixcbiAgICBtYWlsVmFsaWRhdGlvbkxpbmtUeHQgOiBcIlZhbGlkZXIgbW9uIGNvbXB0ZS5cIixcbiAgICBtYWlsVmFsaWRhdGlvbk1lc3NhZ2U6IFwiVm90cmUgaW5zY3JpcHRpb24gZXN0IGJpZW4gZW5yZWdpc3Ryw6llLlxcblBvdXIgbGEgZmluYWxpc2VyLCBtZXJjaSBkZSBjbGlxdWVyIGRhbnMgbGVzIDI0IEggc3VyIGxlIGxpZW4gZGUgY29uZmlybWF0aW9uIHF1aSB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlIVE1MIDogXCI8aDM+Qm9uam91ciBVU0VSX05BTUUsPC9oMz48cD5Wb3VzIHZlbmV6IGRlIHZhbGlkZXIgdm90cmUgaW5zY3JpcHRpb24gw6AgTk9NX1NJVEUuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPjxicj5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgPGI+RU1BSUw8L2I+Ljxicj48YnI+SmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgPGI+RU1BSUw8L2I+IMOgIHZvdHJlIGNhcm5ldCBkJ2FkcmVzc2VzIDxiPnBvdXIgw6l2aXRlciBxdWUgbGVzIHByb2NoYWlucyBlbnZvaXMgZGUgTk9NX1NJVEUgbidhcnJpdmVudCBlbiA8aT5zcGFtPC9pPjwvYj4uPGJyPjxicj5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZSBjb250ZW51IGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci48YnI+PGJyPlBvdXIgY2UgZmFpcmUsIHV0aWxpc2V6IGxlIGxpZW4gY2ktZGVzc291cy48YnI+PGJyPsOAIGJpZW50w7R0IHN1ciBOT01fU0lURS5cIixcbiAgICBtYWlsV2VsY29tZUJvZHlUeHQgOiBcIkJvbmpvdXIgVVNFUl9OQU1FLFxcblxcblZvdXMgdmVuZXogZGUgdmFsaWRlciB2b3RyZSBpbnNjcmlwdGlvbiDDoCBOT01fU0lURS4gTWVyY2kgZXQgYmllbnZlbnVlICFcXG5cXG5TaSB2b3VzIGF2ZXogbGEgbW9pbmRyZSBxdWVzdGlvbiBvdSBzdWdnZXN0aW9uIGNvbmNlcm5hbnQgTk9NX1NJVEUsIG4naMOpc2l0ZXogcGFzIMOgIG1lIGNvbnRhY3RlciBlbiDDqWNyaXZhbnQgw6AgRU1BSUwuXFxuXFxuSmUgdm91cyBjb25zZWlsbGUgZCdhaWxsZXVycyBkJ2Fqb3V0ZXIgRU1BSUwgw6Agdm90cmUgY2FybmV0IGQnYWRyZXNzZXMgcG91ciDDqXZpdGVyIHF1ZSBsZXMgcHJvY2hhaW5zIGVudm9pcyBkZSBOT01fU0lURSBuJ2Fycml2ZW50IGVuIFxcXCJzcGFtXFxcIi5cXG5cXG5QYXIgYWlsbGV1cnMsIHBvdXIgZ8OpcmVyIHZvdHJlIGFib25uZW1lbnQsIGFjY8OpZGVyIMOgIHZvcyBpbmZvcm1hdGlvbnMgb3UgZW5jb3JlIGNoZXJjaGVyIHBsdXMgZmFjaWxlbWVudCBwYXJtaSBsZSBjb250ZW51IGR1IHNpdGUsIHZvdXMgcG91dmV6IMOgIHRvdXQgbW9tZW50IHZvdXMgY29ubmVjdGVyIMOgIHZvdHJlIGNvbXB0ZSB1dGlsaXNhdGV1ci5cXG5cXG5Qb3VyIGNlIGZhaXJlLCB1dGlsaXNleiBsZSBsaWVuIHN1aXZhbnQgOiBMSU5LX1VSTFxcblxcbsOAIGJpZW50w7R0IHN1ciBOT01fU0lURS5cIixcbiAgICBtYWlsV2VsY29tZUxpbmtUeHQgOiBcIk1lIGNvbm5lY3RlciDDoCBtb24gY29tcHRlLlwiLFxuICAgIG1haWxXZWxjb21lU3ViamVjdCA6IFwiQmllbnZlbnVlICFcIixcbiAgICBuZWVkQmVDb25uZWN0ZWQ6IFwiVm91cyBkZXZleiDDqnRyZSBjb25uZWN0w6kgcG91ciBhY2PDqWRlciDDoCBjZXR0ZSBwYWdlLlwiLFxuICAgIG5lZWRDaG9vc2VMb2dpbldheTogXCJWb3VzIGRldmV6IHNvaXQgc2Fpc2lyIHZvdHJlIG1vdCBkZSBwYXNzZSwgc29pdCBjb2NoZXIgbGEgY2FzZSB2b3VzIHBlcm1ldHRhbnQgZGUgcmVjZXZvaXIgdW4gbGllbiBkZSBjb25uZXhpb24gcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkRW1haWw6IFwiTWVyY2kgZGUgc2Fpc2lyIHZvdHJlIGFkcmVzc2UgZS1tYWlsLlwiLFxuICAgIG5lZWRLbm93TmV3c2xldHRlck9rIDogXCJJbCBmYXV0IHNhdm9pciBzaSBsJ3V0aWxpc2F0ZXVyIGFjY2VwdGUgb3UgcmVmdXNlIGRlIHJlY2V2b2lyIGxhIG5ld3NsZXR0ZXIuXCIsXG4gICAgbmVlZExhbmd1YWdlIDogXCJJbCBtYW5xdWUgbGUgY29kZSBsYW5ndWUuXCIsXG4gICAgbmVlZExvbmdQYXNzV29yZCA6IFwiTWVyY2kgZGUgZm91cm5pciB1biBtb3QgZGUgcGFzc2UgZCdhdSBtb2lucyBNSU5fTEVOR1RIIGNhcmFjdMOocmVzLlwiLFxuICAgIG5lZWRNYXhUaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGFqb3V0ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgODQwLlwiLFxuICAgIG5lZWRNaW5UaW1lRGlmZmVyZW5jZSA6IFwiSWwgZmF1dCBmb3VybmlyIHVuIG5vbWJyZSBkZSBtaW51dGVzIMOgIGVubGV2ZXIgw6AgbCdoZXVyZSBHTVQgbmUgZMOpcGFzc2FudCBwYXMgNzIwLlwiLFxuICAgIG5lZWROYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdOYW1lOiBcIk1lcmNpIGRlIGNob2lzaXIgdW4gbm9tIGQndXRpbGlzYXRldXIgbmUgY29tcHRhbnQgcGFzIHBsdXMgZGUgNzAgY2FyYWN0w6hyZXMuXCIsXG4gICAgbmVlZE5vdFRvb0xvbmdFbWFpbDogXCJNZXJjaSBkZSBzYWlzaXIgdW5lIGFkcmVzc2UgZS1tYWlsIG5lIGNvbXB0YW50IHBhcyBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkUGFzc1dvcmQgOiBcIk1lcmNpIGRlIGZvdXJuaXIgdW4gbW90IGRlIHBhc3NlLlwiLFxuICAgIG5lZWRTTVRQIDogXCJJbCBtYW5xdWUgbGUgc2VydmV1ciBTTVRQLlwiLFxuICAgIG5lZWRTTVRQTm90Rm91bmQgOiBcIklsIG1hbnF1ZSB1biBzZXJ2ZXVyIFNNVFAgdmFsaWRlLlwiLFxuICAgIG5lZWRTdGF0dXMgOiBcIklsIG1hbnF1ZSBsZSBzdGF0dXQuXCIsXG4gICAgbmVlZFRpbWVEaWZmZXJlbmNlIDogXCJJbCBmYXV0IGNvbm5hw650cmUgbGUgbm9tYnJlIGRlIG1pbnV0ZXMgZHUgZMOpY2FsYWdlIGhvcmFpcmUuXCIsXG4gICAgbmVlZFVHQ09rIDogXCJNZXJjaSBkJ2FjY2VwdGVyIGxlcyBDR1UgcG91ciBjcsOpZXIgdm90cmUgY29tcHRlLlwiLFxuICAgIG5lZWRVbmlxdWVFbWFpbDogXCJMJ2FkcmVzc2UgZS1tYWlsIHF1ZSB2b3VzIGF2ZXogc2Fpc2llIGVzdCBkw6lqw6AgdXRpbGlzw6llIHBvdXIgdW4gY29tcHRlIHV0aWxpc2F0ZXVyLiBTaSB2b3VzIGF2ZXogZMOpasOgIHVuIGNvbXB0ZSwgPGEgaHJlZj0nLyNVUkwnPmNsaXF1ZXotaWNpIHBvdXIgdm91cyBjb25uZWN0ZXI8L2E+LlwiLFxuICAgIG5lZWRWYWxpZGF0aW9uVG9Mb2dpbiA6IFwiVm91cyBkZXZleiBkJ2Fib3JkIHZhbGlkZXIgdm90cmUgY29tcHRlIGF2YW50IGRlIHBvdXZvaXIgdm91cyBjb25uZWN0ZXIuIFBvdXIgY2UgZmFpcmUsIHVuIG5vdXZlYXUgbGllbiB2aWVudCBkZSB2b3VzIMOqdHJlIGVudm95w6kgcGFyIGUtbWFpbC5cIixcbiAgICBuZWVkVmFsaWRMYXN0Q29ubmVjdGlvbkRhdGUgOiBcIkxhIGRhdGUgZGUgZGVybmnDqHJlIGNvbm5leGlvbiBuJ2VzdCBwYXMgdmFsaWRlLlwiLFxuICAgIHBhc3N3b3JkQ29waWVkOiBcIkxlIG1vdCBkZSBwYXNzZSBnw6luw6lyw6kgYSDDqXTDqSBjb3Bpw6kgZGFucyBsZSBwcmVzc2UtcGFwaWVyIGRlIHZvdHJlIG9yZGluYXRldXIgKG91IG1vYmlsZSkuIFZvdXMgcG91dmV6IGxlIFxcXCJjb2xsZXJcXFwiIG/DuSB2b3VzIGxlIHNvdWhhaXRlei5cIixcbiAgICBzZWFyY2hVc2Vyc1dpdGhvdXRSZXN1bHQ6IFwiTCd1dGlsaXNhdGV1ciBuJ2EgcGFzIMOpdMOpIHRyb3V2w6kuXCIsXG4gICAgdG9vTWFueUxvZ2luRmFpbHMgOiBcIkTDqXNvbMOpIG1haXMgaWwgeSBhIGV1IHRyb3AgZGUgdGVudGF0aXZlcyBkZSBjb25uZXhpb24gaW5mcnVjdHVldXNlcyBwb3VyIGNldHRlIGFkcmVzc2UgZS1tYWlsLiBWb3VzIGRldmV6IGF0dGVuZHJlIE1JTlVURVMgbWludXRlcyBwb3VyIGVzc2F5ZXIgZGUgbm91dmVhdS5cIixcbiAgICB1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQgOiBcIkwnaWRlbnRpZmlhbnQgZm91cm5pIHBvdXIgbGUgcGFycmFpbiBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIHV0aWxpc2F0ZXVyLlwiLFxuICAgIHVwZGF0ZWROZWVkR29vZEVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIG4nYSBwdSDDqnRyZSBlbnJlZ2lzdHLDqWUsIGNhciBlbGxlIG4nYSBwYXMgdW4gZm9ybWF0IGNvcnJlY3QuXCIsXG4gICAgdXBkYXRlZE5lZWRHb29kR29kZmF0aGVyIDogXCJNYWlzIGxlIG5vdXZlYXUgY29kZSBwYXJyYWluIG4nYSBwdSDDqnRyZSByZXRlbnUsIGNhciBpbCBuZSBjb3JyZXNwb25kIMOgIGF1Y3VuIGNvbXB0ZSB1dGlsaXNhdGV1ciBvdSDDoCBsJ3V0aWxpc2F0ZXVyIGx1aS1tw6ptZS5cIixcbiAgICB1cGRhdGVkTmVlZFVuaXF1ZUVtYWlsIDogXCJNYWlzIGxhIG5vdXZlbGxlIGFkcmVzc2UgZS1tYWlsIHNhaXNpZSAoTkVXX0VNQUlMKSBuJ2EgcHUgw6p0cmUgZW5yZWdpc3Ryw6llLCBjYXIgZWxsZSBlc3QgZMOpasOgIHV0aWxpc8OpZSBwb3VyIHVuIGF1dHJlIGNvbXB0ZS5cIixcbiAgICB1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXI6IFwiTCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0ZXogbW9kaWZpZXIgbidleGlzdGUgcGFzL3BsdXMgb3UgbidhIHBhcyBlbmNvcmUgdmFsaWTDqSBzb24gY29tcHRlLlwiLFxuICAgIHVwZGF0ZWRPa01lc3NhZ2U6IFwiVm9zIGluZm9ybWF0aW9ucyBvbnQgYmllbiDDqXTDqSBtaXNlcyDDoCBqb3VyLlwiLFxuICAgIHZhbGlkYXRpb25BbHJlYWR5TWVzc2FnZTogXCJJbCBzZW1ibGUgcXVlIHZvdXMgYXlleiBkw6lqw6AgdmFsaWTDqSB2b3RyZSBjb21wdGUuIFZvdXMgcG91dmV6IHZvdXMgeSBjb25uZWN0ZXIgPGEgaHJlZj0nI1VSTCc+ZW4gY2xpcXVhbnQgaWNpPC9hPi5cIixcbiAgICB2YWxpZGF0aW9uQWxyZWFkeU1lc3NhZ2VBZG1pbjogXCJDZSBjb21wdGUgYSBkw6lqw6Agw6l0w6kgdmFsaWTDqS5cIixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZTogXCJWb3RyZSBjb21wdGUgdmllbnQgYmllbiBkJ8OqdHJlIHZhbGlkw6kuIE1lcmNpIGV0IGJpZW52ZW51ZSAhPGJyPlZvdXMgcG91dmV6IGNvbXBsw6l0ZXIgbGVzIGluZm9ybWF0aW9ucyBkZSB2b3RyZSBhYm9ubmVtZW50IGNpLWRlc3NvdXMuXCIsXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VBZG1pbjogXCJMZSBjb21wdGUgYSBiaWVuIMOpdMOpIHZhbGlkw6kuXCIsXG4gICAgd2VsY29tZU1lc3NhZ2U6IFwiQmllbnZlbnVlICNOQU1FICFcIlxufTsiLCIvLyBRdWVscXVlcyBmb25jdGlvbnMgdXRpbGVzIHBvdXIgbGVzIGNoYcOubmVzXG5cbmNsYXNzIFRvb2xcbntcbiAgICBzdGF0aWMgaXNFbXB0eShteVZhcilcbiAgICB7XG4gICAgICAgIGlmKG15VmFyPT09dW5kZWZpbmVkIHx8IG15VmFyPT09bnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG15VmFyKz1cIlwiOy8vIHNpIGF1dHJlIGNob3NlIHF1J3VuZSBjaGHDrm5lIGVudm95w6kuLi5cbiAgICAgICAgICAgIG15VmFyPW15VmFyLnRyaW0oKTtcbiAgICAgICAgICAgIGlmKG15VmFyPT09XCJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgc3RhdGljIHRyaW1JZk5vdE51bGwobXlTdHJpbmcpXG4gICAge1xuICAgICAgICBpZihUb29sLmlzRW1wdHkobXlTdHJpbmcpKVxuICAgICAgICAgICAgbXlTdHJpbmc9bnVsbDtcbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBteVN0cmluZys9XCJcIjsvLyBzaSBhdXRyZSBjaG9zZSBxdSd1bmUgY2hhw65uZSBlbnZvecOpLi4uXG4gICAgICAgICAgICBteVN0cmluZz1teVN0cmluZy50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG15U3RyaW5nO1xuICAgIH1cblxuXG4gICAgc3RhdGljIHNob3J0ZW5JZkxvbmdlclRoYW4obXlTdHJpbmcsIG1heClcbiAgICB7XG4gICAgICAgIG15U3RyaW5nKz1cIlwiOy8vIGF1IGNhcyBvw7kgY2VsYSBuZSBzZXJhaXQgcGFzIHVuZSBjaGHDrm5lLi4uXG4gICAgICAgaWYobXlTdHJpbmcubGVuZ3RoID4gbWF4KVxuICAgICAgICAgICAgbXlTdHJpbmc9bXlTdHJpbmcuc3Vic3RyaW5nKDAsIChtYXgtMykpK1wiLi4uXCI7XG4gICAgICAgIHJldHVybiBteVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTYwNDE0MC9yZXBsYWNlLW11bHRpcGxlLXN0cmluZ3Mtd2l0aC1tdWx0aXBsZS1vdGhlci1zdHJpbmdzXG4gICAgc3RhdGljIHJlcGxhY2VBbGwobXlTdHJpbmcsIG1hcE9iailcbiAgICB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VFbHRzID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhtYXBPYmopLmpvaW4oXCJ8XCIpLFwiZ2lcIik7XG4gICAgICAgIHJldHVybiBteVN0cmluZy5yZXBsYWNlKHJlcGxhY2VFbHRzLCAobWF0Y2hlZCkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG1hcE9ialttYXRjaGVkXTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc291cmNlIDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZnIvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT2JqZXRzX2dsb2JhdXgvTWF0aC9yYW5kb21cbiAgICBzdGF0aWMgZ2V0UmFuZG9tSW50KG1pbiwgbWF4KVxuICAgIHtcbiAgICAgICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pKSArIG1pbjtcbiAgICB9XG5cbiAgICAvLyDDoCBjb21wbMOpdGVyIDogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGF0ZV9mb3JtYXRfYnlfY291bnRyeVxuICAgIHN0YXRpYyBkYXRlRm9ybWF0KGRhdGVTdHJpbmcsIGxhbmc9XCJmclwiKVxuICAgIHtcbiAgICAgICAgaWYoVG9vbC5pc0VtcHR5KGRhdGVTdHJpbmcpKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCBteURhdGU9bmV3IERhdGUoZGF0ZVN0cmluZyk7XG4gICAgICAgIGxldCBteURheT1teURhdGUuZ2V0RGF0ZSgpK1wiXCI7XG4gICAgICAgIGlmKG15RGF5Lmxlbmd0aD09PTEpXG4gICAgICAgICAgICBteURheT1cIjBcIitteURheTtcbiAgICAgICAgbGV0IG15TW91bnRoPShteURhdGUuZ2V0TW9udGgoKSsxKStcIlwiO1xuICAgICAgICBpZihteU1vdW50aC5sZW5ndGg9PT0xKVxuICAgICAgICAgICAgbXlNb3VudGg9XCIwXCIrbXlNb3VudGg7XG4gICAgICAgIGxldCBteVllYXI9bXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGlmKGxhbmc9PT1cImZyXCIpXG4gICAgICAgICAgICByZXR1cm4gbXlEYXkrXCIvXCIrbXlNb3VudGgrXCIvXCIrbXlZZWFyO1xuICAgICAgICBlbHNlIGlmIChsYW5nPT09XCJmb3JtXCIpLy8gMjAxNC0wMi0wOVxuICAgICAgICAgICAgcmV0dXJuIG15WWVhcitcIi1cIitteU1vdW50aCtcIi1cIitteURheTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG15TW91bnRoK1wiL1wiK215RGF5K1wiL1wiK215WWVhcjtcbiAgICB9XG5cbiAgICAvLyBPbiBlbmzDqHZlIHZvbG9udGFpcmVtZW50IGxlcyAwL08gcG91ciDDqXZpdGVyIGxlcyBjb25mdXNpb25zICFcbiAgICAvLyBFdCBtaWV1eCB2YXV0IGF1c3NpIGTDqWJ1dGVyIGV0IGZpbmlyIHBhciB1bmUgbGV0dHJlIHNpbXBsZS5cbiAgICBzdGF0aWMgZ2V0UGFzc3dvcmQgKG5iQ2FyTWluLCBuYkNhck1heClcbiAgICB7XG4gICAgICAgIGNvbnN0IG5iQ2FyPW5iQ2FyTWluK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoobmJDYXJNYXgtbmJDYXJNaW4pKTtcbiAgICAgICAgY29uc3QgbGV0dGVycz1cIkFCQ0RFRkdISUpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbnBxcnN0dXZ3eHl6XCI7XG4gICAgICAgIGNvbnN0IG90aGVycz1cIjEyMzQ1Njc4OSE/LiotXyVAJsOJw4DDiMOZ4oKsJMOCw4rDm8OOXCI7XG4gICAgICAgIGxldCBwYXNzd29yZD1sZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsZXR0ZXJzLmxlbmd0aCldO1xuICAgICAgICBmb3IobGV0IGk9MTtpPChuYkNhci0xKTtpKyspXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlmKChpICUgMikgPT09MSlcbiAgICAgICAgICAgICAgICBwYXNzd29yZCs9b3RoZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpvdGhlcnMubGVuZ3RoKV07XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07ICAgXG4gICAgICAgIH1cbiAgICAgICAgcGFzc3dvcmQrPWxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxldHRlcnMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBwYXNzd29yZDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG9vbDsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZGVmYXVsdC9jb25maWcvZnIuanNcIjogXCIuLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qc1wiLFxuXHRcIi4vd2lraWxlcm5pL2NvbmZpZy9mci5qc1wiOiBcIi4uL3ZpZXdzL3dpa2lsZXJuaS9jb25maWcvZnIuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vdmlld3Mgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwuanMkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGhlYWRMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkFjY3VlaWxcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTW9uIGNvbXB0ZVwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29ubmV4aW9uLmh0bWxcIiwgaWQ6IFwiYWNjb3VudEhlYWRMaW5rXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCLDgCBwcm9wb3NcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2EtcHJvcG9zLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkNvbnRhY3RcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NvbnRhY3QuaHRtbFwiIH0gfSxcbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkNyw6lkaXRzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jcmVkaXRzLmh0bWxcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIk1lbnRpb25zIGzDqWdhbGVzXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9tZW50aW9ucy1sZWdhbGVzLmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJEb25uw6llcyBwZXJzb25uZWxsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2Rvbm5lZXMuaHRtbFwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQy5HLlUuXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jZ3UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkMuRy5WLlwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY2d2Lmh0bWxcIiwgcmVsOiBcIm5vZm9sbG93XCIgfSB9LFxuICAgIF0sXG4gICAgbWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2U6IDEwLFxuICAgIHVzZXJIb21lUGFnZSA6IFwiYWNjdWVpbC5odG1sXCIsXG4gICAgYWRtaW5Ib21lUGFnZSA6IFwiYWRtaW4uaHRtbFwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgc3Vic2NyaWJlUGFnZSA6IFwiaW5zY3JpcHRpb24uaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgcXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXF1aXpzLmh0bWxcIixcbiAgICB1c2Vyc01hbmFnZW1lbnRQYWdlOiBcImdlc3Rpb24tdXRpbGlzYXRldXJzLmh0bWxcIixcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMTAsXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHNpdGVTbG9nYW46IFwiQ3VsdGl2b25zIG5vdHJlIGphcmRpbiAhXCIsXG4gICAgaG9tZVRpdGxlMTogXCJEZSBuYXR1cmUgY3VyaWV1c2UgP1wiLFxuICAgIGhvbWVQMTogXCJBdmVjIFdpa2lMZXJuaSB2b3VzIGFwcHJlbmV6IGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXMuPGJyPkRlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHNvbnQgc8OpbGVjdGlvbm7DqXMgcG91ciB2b3VzIGV0IHNvbnQgc3VpdmlzIGQndW4gcXVpeiB2b3VzIHBlcm1ldHRhbnQgZGUgdGVzdGVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgc2F2b2lyIHNvbnQgYWluc2kgc2Vtw6llcyBkYW5zIHZvdHJlIFxcXCJqYXJkaW5cXFwiLlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBlbiBsaWJlcnTDqVwiLFxuICAgIGhvbWVQMjogXCJUb3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhICgqKSwgbGUgbG9naWNpZWwgZXQgbGUgY29udGVudSBwYXJ0YWfDqSBzdXIgV2lraUxlcm5pIHNvbnQgbGlicmVzLjxicj5Wb3VzIHBvdXZleiBsZXMgdXRpbGlzZXIsIGxlcyBtb2RpZmllciBldCBsZXMgZGlmZnVzZXIgc2Vsb24gdm90cmUgc291aGFpdC48YnI+U3VyIFdpa2lMZXJuaSwgcGFzIGRlIHB1YmxpY2l0w6ksIG5pIGRlIGNvbW1lcmNpYWxpc2F0aW9uIGRlIHZvcyBkb25uw6llcyBwZXJzb25uZWxsZXMuPGJyPlZvdXMgcG91dmV6IHZlbmlyIHkgXFxcImN1bHRpdmVyIHZvdHJlIGphcmRpblxcXCIgZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48YnI+PGJyPjxzbWFsbD48ZW0+KCopIEJpZW4gcXVlIHBhcnRhZ2VhbnQgc2VzIHZhbGV1cnMsIFdpa2lMZXJuaSBlc3QgdW4gcHJvamV0IGluZMOpcGVuZGFudCBkZSBsYSBmb25kYXRpb24gV2lraXDDqWRpYS48L2VtPjwvc21hbGw+XCIsXG4gICAgbmV3UXVlc3Rpb25uYWlyZXNUaXRsZTogXCJMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMgc3VyIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiTGlzdGUgZGVzIGRlcm5pZXJzIHF1aXpzIHB1Ymxpw6lzIHN1ciBXaWtpTGVybmkuXCIsXG4gICAgZXhwbGFuYXRpb25UaXRsZTogXCJWb3VzIGTDqWNvdXZyZXogV2lraUxlcm5pID9cIixcbiAgICBleHBsYW5hdGlvblR4dDogXCJMZSBwcmluY2lwZSBlc3Qgc2ltcGxlIDogdm91cyBjb21tZW5jZXogcGFyIGxpcmUgbCdhcnRpY2xlIFdpa2lww6lkaWEgZG9udCBsZSBsaWVuIHZvdXMgZXN0IHByb3Bvc8OpLjxicj5QdWlzIHZvdXMgYWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlLiBWb3VzIG9idGVuZXogYWxvcnMgdm90cmUgcsOpc3VsdGF0IGltbcOpZGlhdGVtZW50Ljxicj48YnI+VG91dGVzIGxlcyByw6lwb25zZXMgc2UgdHJvdXZlbnQgZGFucyBsJ2FydGljbGUgcHJvcG9zw6kgw6AgbGEgbGVjdHVyZS4gPGI+Vm91cyDDqnRlcyBpY2kgcG91ciBhcHByZW5kcmUgZGUgbm91dmVsbGVzIGNob3NlczwvYj4sIG1haXMgbGlicmUgw6Agdm91cyBkJ2Vzc2F5ZXIgZCd5IHLDqXBvbmRyZSBpbW3DqWRpYXRlbWVudC48YnI+PGJyPlF1YW5kIGxlIHN1amV0IHMneSBwcsOqdGUsIG5lIHZvdXMgw6l0b25uZXogcGFzIHNpIGNlcnRhaW5lcyBkZXMgcsOpcG9uc2VzIHByb3Bvc8OpZXMgcGV1dmVudCDDqnRyZSB1biBwZXUgZMOpY2Fsw6llcywgYWJzdXJkZXMuLi4gT24gcGV1dCBhcHByZW5kcmUgYXZlYyBsZSBzb3VyaXJlLCBub24gPyA6LSk8YnI+PGJyPlVuZSBmb2lzIHZvdHJlIHLDqXN1bHRhdCBvYnRlbnUsIGlsIHZvdXMgc2VyYSBwcm9wb3PDqSBkZSBjcsOpZXIgdW4gY29tcHRlIHBvdXIgbGUgc2F1dmVnYXJkZXIuPGJyPkNlIGNvbXB0ZSB2b3VzIHBlcm1ldHRyYSBkZSB0ZXN0ZXIgZGUgbm91dmVhdSBjZSBxdWl6IHBvdXIgdsOpcmlmaWVyIGNlIHF1ZSB2b3VzIGVuIGF2ZXogcmV0ZW51IHBsdXNpZXVycyBqb3Vycywgc2VtYWluZXMsIG1vaXMuLi4gRXQgZGUgcmVjZXZvaXIgcsOpZ3VsacOocmVtZW50IGRlIG5vdXZlbGxlcyBzdWdnZXN0aW9ucyBkZSBsZWN0dXJlcy48YnI+PGJyPk1haXMgPGI+bGEgY3LDqWF0aW9uIGRlIGNlIGNvbXB0ZSBlc3QgZmFjdWx0YXRpdmU8L2I+IGV0IDxhIGhyZWY9Jy9xdWl6cy8nIHRpdGxlPSdMZXMgZGVybmllcnMgcXVpenMgcHVibGnDqXMnPnZvdXMgcG91dmV6IHBhcmNvdXJpciBXaWtpTGVybmkgbGlicmVtZW50PC9hPi5cIixcbiAgICBub0pTTm90aWZpY2F0aW9uOiBcIkTDqXNvbMOpLCBtYWlzIHBvdXIgbCdpbnN0YW50LCBsJ3V0aWxpc2F0aW9uIGRlIFdpa2lMZXJuaSBuw6ljZXNzaXRlIGwnYWN0aXZhdGlvbiBkdSBKYXZhU2NyaXB0LlwiLFxuICAgIHRhZ3NMaXN0VHh0OiBcIlBhcmNvdXJpciBsZXMgcnVicmlxdWVzIDpcIixcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIC8vIGxpZW5zIGRlIGwnaW50ZXJmYWNlXG4gICAgaGVhZExpbmtzOlxuICAgIFtcbiAgICAgICAgeyBhbmNob3I6IFwiQ29udGFjdFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvY29udGFjdC5odG1sXCIsIHJlbDogXCJub2ZvbGxvd1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiUGFyY291cmlyXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9xdWl6cy9cIiwgaWQ6XCJpbmRleEhlYWRMaW5rXCIsIHRpdGxlOlwiTGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJNb24gY29tcHRlXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9jb25uZXhpb24uaHRtbFwiLCBpZDogXCJhY2NvdW50SGVhZExpbmtcIiwgdGl0bGU6XCJBY2PDqWRlciBvdSBjcsOpZXogdm90cmUgY29tcHRlIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiw4AgcHJvcG9zXCIsIGF0dHJpYnV0ZXM6IHsgaHJlZjpcIi9hLXByb3Bvcy5odG1sXCIsIHRpdGxlOlwiRW4gc2F2b2lyICsgc3VyIFdpa2lMZXJuaVwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQWNjdWVpbFwiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvXCIsIHRpdGxlOlwiUGFnZSBkJ2FjY3VlaWxcIiB9IH1cbiAgICBdLFxuICAgIGZvb3RMaW5rczpcbiAgICBbXG4gICAgICAgIHsgYW5jaG9yOiBcIkJsb2dcIiwgYXR0cmlidXRlczogeyBocmVmOlwiaHR0cHM6Ly9mcmFtYXNwaGVyZS5vcmcvcGVvcGxlLzdlNTRiN2EwYjUzMjAxMzg5ZWVmMmEwMDAwMDUzNjI1XCIsIHRpdGxlOlwiTGUgYmxvZyBXaWtpTGVybmkgc3VyIGRpYXNwb3JhKlwiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiQ3LDqWRpdHNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL2NyZWRpdHMuaHRtbFwiLCB0aXRsZTpcIlF1aSBhIGNyw6nDqSBXaWtpTGVybmkgPyBRdWVscyBzb250IHZvcyBkcm9pdHMgP1wiIH0gfSxcbiAgICAgICAgeyBhbmNob3I6IFwiTWVudGlvbnMgbMOpZ2FsZXNcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL21lbnRpb25zLWxlZ2FsZXMuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH0sXG4gICAgICAgIHsgYW5jaG9yOiBcIkRvbm7DqWVzIHBlcnNvbm5lbGxlc1wiLCBhdHRyaWJ1dGVzOiB7IGhyZWY6XCIvZG9ubmVlcy5odG1sXCIsIHRpdGxlOlwiVm9zIGRvbm7DqWVzIHBlcnNvbm5lbGxlcyBzdXIgV2lraUxlcm5pXCIgfSB9LFxuICAgICAgICB7IGFuY2hvcjogXCJDR1YgJiBDR1VcIiwgYXR0cmlidXRlczogeyBocmVmOlwiL0NHVi1DR1UuaHRtbFwiLCByZWw6IFwibm9mb2xsb3dcIiB9IH1cbiAgICBdLFxuICAgIGFjY291bnRQYWdlOiBcImNvbXB0ZS5odG1sXCIsXG4gICAgYWJvdXRQYWdlOiBcImEtcHJvcG9zLmh0bWxcIixcbiAgICBhZG1pbkhvbWVQYWdlOiBcImFkbWluLmh0bWxcIixcbiAgICBjZ3VQYWdlOiBcIkNHVi1DR1UuaHRtbFwiLFxuICAgIGNvbm5lY3Rpb25QYWdlIDogXCJjb25uZXhpb24uaHRtbFwiLFxuICAgIGRlbGV0ZUxpbmtQYWdlIDogXCJhdXJldm9pci5odG1sP3Q9XCIsXG4gICAgbG9naW5MaW5rUGFnZSA6IFwibG9naW4uaHRtbD90PVwiLFxuICAgIG1hbmFnZXJIb21lUGFnZSA6IFwiZ2VzdGlvbi5odG1sXCIsXG4gICAgbmV3TG9naW5MaW5rUGFnZSA6IFwibmV3bG9naW4uaHRtbD90PVwiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTWFuYWdlbWVudFBhZ2U6IFwiZ2VzdGlvbi1xdWl6cy5odG1sXCIsICAgIFxuICAgIHN0b3BNYWlsUGFnZSA6IFwic3RvcC1tYWlsLmh0bWw/dD1cIixcbiAgICBzdWJzY3JpYmVQYWdlIDogXCJpbnNjcmlwdGlvbi5odG1sXCIsXG4gICAgdXBkYXRlQWNjb3VudFBhZ2U6IFwiY29tcHRlLmh0bWxcIixcbiAgICB1c2VySG9tZVBhZ2UgOiBcImFjY3VlaWwuaHRtbFwiLFxuICAgIHVzZXJIb21lUGFnZVR4dCA6IFwiTWEgcGFnZSBkJ2FjY3VlaWwuXCIsXG4gICAgdXNlcnNNYW5hZ2VtZW50UGFnZTogXCJnZXN0aW9uLXV0aWxpc2F0ZXVycy5odG1sXCIsXG4gICAgdmFsaWRhdGlvbkxpbmtQYWdlIDogXCJ2YWxpZGF0aW9uLmh0bWw/dD1cIixcbiAgICAvKiBUZXh0ZXMgKGfDqW7DqXJhbCkgKi9cbiAgICBzaXRlU2xvZ2FuOiBcIkN1bHRpdm9ucyBub3RyZSBqYXJkaW4gIVwiLFxuICAgIG5vSlNOb3RpZmljYXRpb246IFwiRMOpc29sw6ksIG1haXMgcG91ciBsJ2luc3RhbnQsIGwndXRpbGlzYXRpb24gZGUgV2lraUxlcm5pIG7DqWNlc3NpdGUgbCdhY3RpdmF0aW9uIGR1IEphdmFTY3JpcHQuXCIsXG4gICAgbWFpbFJlY2lwaWVudFR4dDogXCJNZXNzYWdlIGVudm95w6kgw6AgOlwiLFxuICAgIGxpY2VuY2VUeHQ6IFwiQGNvcHlsZWZ0IExlIGNvbnRlbnUgZGUgY2Ugc2l0ZSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgP1xcXCI+ZXN0IGxpYnJlPC9hPiBldCB2b3VzIG9mZmVydCBzYW5zIHB1YmxpY2l0w6kuIFZvdXMgcG91dmV6IDxhIGhyZWY9XFxcIi9wYXJ0aWNpcGVyLWZpbmFuY2VtZW50Lmh0bWxcXFwiIHRpdGxlPVxcXCJGaW5hbmNlbWVudCBwYXJ0aWNpcGF0aWZcXFwiPnBhcnRpY2lwZXIgw6Agc29uIGZpbmFuY2VtZW50IGVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgLyogUGFnZSBkJ2FjY3VlaWwgKi9cbiAgICBob21lUGFnZVR4dDogXCJQYWdlIGQnYWNjdWVpbFwiLFxuICAgIGhvbWVUaXRsZTE6IFwiRGUgbmF0dXJlIGN1cmlldXNlID9cIixcbiAgICBob21lUDE6IFwiPGI+QXZlYyBXaWtpTGVybmksIHZvdXMgYWxsZXogYXBwcmVuZHJlIGNoYXF1ZSBqb3VyIGRlIG5vdXZlbGxlcyBjaG9zZXM8L2I+Ljxicj5Wb3VzIHJlY2V2cmV6IGRlIGNvdXJ0cyBhcnRpY2xlcywgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlcy48YnI+RGVzIHF1aXpzIHZvdXMgcGVybWV0dHJvbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXVyZXogcmV0ZW51Ljxicj5EZSBqb3VyIGVuIGpvdXIgPGI+ZGUgbm91dmVsbGVzIGdyYWluZXMgZGUgY3VsdHVyZSBzb250IGFpbnNpIHNlbcOpZXMgZGFucyB2b3RyZSBqYXJkaW48L2I+LlwiLFxuICAgIGhvbWVUaXRsZTI6IFwiTGEgY3VsdHVyZSBnw6luw6lyYWxlIGVuIGxpYmVydMOpXCIsXG4gICAgaG9tZVAyOiBcIlN1ciBXaWtpTGVybmkgPGI+cGFzIGRlIGZhaXRzIGFsdGVybmF0aWZzPC9iPiwgdG91cyBsZXMgY29udGVudXMgc29udCA8Yj5zb3VyY8OpcyBwYXIgZGVzIGFydGljbGVzIFdpa2lww6lkaWE8L2I+Ljxicj5FdCB0b3V0IGNvbW1lIHN1ciBXaWtpcMOpZGlhLCBsZSBsb2dpY2llbCBldCBsZSBjb250ZW51IHB1Ymxpw6kgc3VyIFdpa2lMZXJuaSA8YSBocmVmPVxcXCIvY3JlZGl0cy5odG1sXFxcIiB0aXRsZT1cXFwiRW4gc2F2b2lyIHBsdXMgc3VyIGNlIHN1amV0XFxcIj5zb250IHBhcnRhZ8OpcyBzb3VzIGxpY2VuY2VzIGxpYnJlczwvYT4uPGJyPkxlIHRvdXQgc2FucyBwdWJsaWNpdMOpLCBuaSBjb21tZXJjaWFsaXNhdGlvbiBkZSB2b3MgZG9ubsOpZXMuPGJyPjxiPlN1ciBXaWtpTGVybmkgdm91cyBjdWx0aXZleiB2b3RyZSBqYXJkaW4gZW4gdG91dGUgdHJhbnF1aWxsaXTDqS48L2I+XCIsXG4gICAgaG9tZUJ0bkFib3V0VHh0OiBcIkVuIHNhdm9pciBwbHVzIHN1ciBXaWtpTGVybmkgP1wiLFxuICAgIGhvbWVCdG5TdWJzY3JpYmVUeHQ6IFwiVGVzdGVyIFdpa2lMZXJuaSBncmF0dWl0ZW1lbnQuXCIsXG4gICAgLyogUGFnZSBkZXJuacOocmVzIHB1YmxpY2F0aW9ucy4uLiAqLyAgIFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzVGl0bGU6IFwiQ3VsdHVyZSBnw6luw6lyYWxlIC0gYXBwcmVuZXogZGUgbm91dmVsbGVzIGNob3NlcyBhdmVjIFdpa2lMZXJuaVwiLFxuICAgIG5ld1F1ZXN0aW9ubmFpcmVzSW50cm86IFwiV2lraUxlcm5pIDogdGVzdGV6IHZvcyBjb25uYWlzc2FuY2VzIGV0IGFwcHJlbmV6IGRlIG5vdXZlbGxlcyBjaG9zZXMgYXZlYyBXaWtpTGVybmkuXCIsXG4gICAgbmV3c0xpc3RUaXRsZTogXCI8cD48Yj5BdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBxdWVscXVlIGNob3NlIGRlIG5vdXZlYXU8L2I+PGJyPlNpIGRlc3NvdXMgbGVzIGRlcm5pw6hyZXMgcHVibGljYXRpb25zLiBWb3VzIHBvdXZleiBhdXNzaSA8YSBocmVmPScvcXVpenMvdGhlbWVzLmh0bWwnPnBhcmNvdXJpciBsZSBzaXRlIHBhciB0aMOobWVzIG91IG1vdHMtY2zDqXM8L2E+LjwvcD5cIixcbiAgICAvKiBQbGFuIGR1IHNpdGUsIGxpc3RlIGRlcyB0YWdzICovICAgXG4gICAgdGFnTGlzdFRpdGxlOiBcIkN1bHR1cmUgZ8OpbsOpcmFsZSAtIGRlcyBhcnRpY2xlcyBldCBxdWl6cyBzdXIgZGUgbm9tYnJldXggdGjDqG1lcyAhXCIsXG4gICAgdGFnTGlzdE1ldGFEZXNjOiBcIldpa2lMZXJuaSA6IGTDqWNvdXZyaXIgbGVzIGRpZmbDqXJlbnRzIHRow6htZXMgYWJvcmTDqXMgcGFyIFdpa2lMZXJuaS4gSW54ZXggZHUgc2l0ZS5cIixcbiAgICB0YWdMaXN0SW50cm86IFwiPGgzPkF2ZWMgV2lraUxlcm5pLCBkZXZlbmV6IGZvcnQgZW4gdGjDqG1lcy4uLiBPdWkgbWFpcyBxdWVscyB0aMOobWVzID8gOik8L2gzPjxibG9ja3F1b3RlPkFyaXN0b3Rl4oCvOiDCq+KAr0zigJlob21tZSBhIG5hdHVyZWxsZW1lbnQgbGEgcGFzc2lvbiBkZSBjb25uYcOudHJl4oCm4oCvwrs8L2Jsb2NrcXVvdGU+XCIsXG4gICAgLyogUGFnZSBxdWl6cyAqL1xuICAgIHF1aXpFbGVtZW50TGlua3NJbnRybzogXCJTb3VyY2UocylcIixcbiAgICBxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlOiBcIlJlY2V2ZXogbGVzIHByb2NoYWlucyBhcnRpY2xlcyBXaWtpTGVybmlcIixcbiAgICBleHBsYW5hdGlvblRpdGxlOiBcIlZvdXMgZMOpY291dnJleiBXaWtpTGVybmnigK8/XCIsXG4gICAgZXhwbGFuYXRpb25UeHQ6IFwiPHA+TGUgcHJpbmNpcGUgZXN0IHNpbXBsZeKArzogPGI+dm91cyBjb21tZW5jZXogcGFyIGxpcmUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBkb250IGxlIGxpZW4gdm91cyBlc3QgcHJvcG9zw6k8L2I+LiBQdWlzIHZvdXMgPGI+YWZmaWNoZXIgbGUgcXVpeiBwb3VyIHbDqXJpZmllciBjZSBxdWUgdm91cyBhdmV6IHJldGVudSBkZSB2b3RyZSBsZWN0dXJlPC9iPi4gU3VpdmFudCBsZXMgcXVlc3Rpb25zLCA8Yj51bmUgb3UgcGx1c2lldXJzIHLDqXBvbnNlcyBwZXV2ZW50IMOqdHJlIGNvcnJlY3RlczwvYj4gZXQgZG9pdmVudCBkb25jIMOqdHJlIGNvY2jDqWVzLiBD4oCZZXN0IHRvdWpvdXJzIDxiPmxlIGNvbnRlbnUgZGUgbOKAmWFydGljbGUgV2lraXDDqWRpYSBxdWkgZmFpdCBmb2k8L2I+IGNvbmNlcm5hbnQgbGVzIMKr4oCvYm9ubmVz4oCvwrsgcsOpcG9uc2VzLiBD4oCZZXN0IHVuZSBmYcOnb24gZGUgdGVzdGVyIMOgIGxhIGZvaXMgdm90cmUgY2FwYWNpdMOpIGTigJlhdHRlbnRpb24gZXQgdm90cmUgbcOpbW9pcmUuIExlcyBhcnRpY2xlcyBkZSBXaWtpcMOpZGlhIHBldXZlbnQgw6l2b2x1ZXIsIGRvbmMgbuKAmWjDqXNpdGV6IHBhcyA8YSBocmVmPScvY29udGFjdC5odG1sJz7DoCBtZSBzaWduYWxlciB1bmUgZXJyZXVyPC9hPi48L3A+PHA+PGI+V2lraUxlcm5pIHZvdXMgcHJvcG9zZSBk4oCZYXV0cmVzIHNvbHV0aW9ucyBwb3VyIGFtw6lsaW9yZXIgdm90cmUgY3VsdHVyZSBnw6luw6lyYWxlPC9iPi4gUG91ciBlbiBzYXZvaXIgcGx1cywgY2xpcXVleiBzdXIgbGUgYm91dG9uIGNpLWRlc3NvdXMuPC9wPlwiLFxuICAgIGV4cGxhbmF0aW9uRWxlbWVudFR4dDogXCI8cD5XaWtpTGVybmkgdm91cyBwcm9wb3NlIGRlIDxiPnJlY2V2b2lyIHBhciBlLW1haWwgw6AgbGEgZnLDqXF1ZW5jZSBjaG9pc2llLCBkZSBjb3VydHMgYXJ0aWNsZXMgbGlzaWJsZXMgZW4gcXVlbHF1ZXMgbWludXRlczwvYj4gZXQgcG9ydGFudCBzdXIgZGVzIHN1amV0cyB0csOocyB2YXJpw6lzIGRlIGN1bHR1cmUgZ8OpbsOpcmFsZSAoYXJ0cywgaGlzdG9pcmUsIGxpdHTDqXJhdHVyZSwgc2NpZW5jZXMsIGV0Yy4pLjwvcD48cD5DaGFxdWUgc8OpcmllIGTigJlhcnRpY2xlcyBlc3QgPGI+c3VpdmllIGTigJl1biBxdWl6PC9iPiBwZXJtZXR0YW50IGRlIHRlc3RlciBjZSBxdWUgdm91cyBlbiBhdmV6IHJldGVudS48L3A+PHA+PGI+Vm91cyBhcHByZW5leiBhaW5zaSBkZSBub3V2ZWxsZXMgY2hvc2VzIHRyw6hzIHNpbXBsZW1lbnQuPC9iPjwvcD48cD5M4oCZaW5zY3JpcHRpb24gZXN0IGdyYXR1aXRlIGV0IHZvdXMgcGVybWV0IGRlIHRlc3RlciBsZSBzaXRlIHNhbnMgZW5nYWdlbWVudC48L3A+XCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwiLy8gLS0gR0VTVElPTiBEVSBGT1JNVUxBSVJFIFBFUk1FVFRBTlQgREUgU0FJU0lSIC8gw4lESVRFUiBMRVMgUVVJWlMgRVQgTEVVUlMgRMOJUEVOREFOQ0VTIChMSUVOUywgSU1BR0VTLCBUQUdTLCBFVEMuKVxuXG4vLy8gVsOpcmlmaWUgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2UgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgcHJvcG9zZSB1biBtb3RldXIgZGUgcmVjaGVyY2hlIHBlcm1ldHRhbnQgZGUgY2hlcmNoZXIgdW4gcXVpelxuLy8vIFNpIHVuIGlkIGVzdCBwYXNzw6kgcGFyIGwndXJsIG9uIGFmZmljaGUgbGVzIGluZm9ybWF0aW9ucyBkdSBxdWl6IGRhbnMgdW4gZm9ybXVsYWlyZSBwZXJtZXR0YW50IGRlIGwnw6lkaXRlci9zdXBwcmltZXIgYXZlYyB1bmUgbGlzdGUgZGVzIMOpbMOpbWVudHMgbGnDqXMgKGxpZW5zLCBpbGx1c3RyYXRpb25zLCBxdWVzdGlvbnMuLi4pIHBvdXZhbnQgZXV4LW3Dqm1lcyDDqnRyZSDDqWRpdMOpcy9zdXBwcmltw6lzLlxuLy8vIFNpIGxlIG5vbWJyZSBtYXggY29uZmlndXLDqSBwb3VyIGNoYWN1biBkZSBzZXMgw6lsw6ltZW50cyBuJ2VzdCBwYXMgYXR0ZWludCwgaWwgZXN0IGF1c3NpIHByb3Bvc8OpIGQnYWpvdXRlciB1biBub3V2ZWwgw6lsw6ltZW50LlxuLy8vIFNpIHBhcyBkJ2lkIHBhc3PDqSBwYXIgbCd1cmwsIG9uIGFmZmljaGUgdW4gZm9ybXVsYWlyZSB2aWRlIHBlcm1ldHRhbnQgZGUgc2Fpc2lyIHVuIG5vdXZlYXUgcXVpei5cblxuLy8gRmljaGllcnMgZGUgY29uZmlndXJhdGlvbiA6XG5pbXBvcnQgeyBhcGlVcmwsIGF2YWlsYWJsZUxhbmdzLCB0aGVtZSB9IGZyb20gXCIuLi8uLi9jb25maWcvaW5zdGFuY2UuanNcIjtcbmNvbnN0IGxhbmc9YXZhaWxhYmxlTGFuZ3NbMF07XG5jb25zdCBjb25maWcgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCIpO1xuY29uc3QgY29uZmlnSWxsdXN0cmF0aW9ucyA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWcvaWxsdXN0cmF0aW9ucy5qc1wiKTtcbmNvbnN0IGNvbmZpZ0xpbmtzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9saW5rcy5qc1wiKTtcbmNvbnN0IGNvbmZpZ1F1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9xdWVzdGlvbm5haXJlcy5qc1wiKTtcbmNvbnN0IGNvbmZpZ1RlbXBsYXRlID0gcmVxdWlyZShcIi4uLy4uL3ZpZXdzL1wiK3RoZW1lK1wiL2NvbmZpZy9cIitsYW5nK1wiLmpzXCIpO1xuXG4vLyBGb25jdGlvbnMgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBlbXB5QW5kSGlkZUZvcm0sIGdldERhdGFzRnJvbUlucHV0cywgc2V0QXR0cmlidXRlc1RvSW5wdXRzIH0gZnJvbSBcIi4vdG9vbHMvZm9ybXMuanNcIjtcbmltcG9ydCB7IGRhdGVGb3JtYXQsIGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vdG9vbHMvbWFpblwiO1xuaW1wb3J0IHsgZ2V0VXJsUGFyYW1zIH0gZnJvbSBcIi4vdG9vbHMvdXJsLmpzXCI7XG5pbXBvcnQgeyBjaGVja1Nlc3Npb24gfSBmcm9tIFwiLi90b29scy91c2Vycy5qc1wiO1xuXG4vLyBEaWN0aW9ubmFpcmVzIDpcbmNvbnN0IHsgYWRkT2tNZXNzYWdlLCBkZWxldGVCdG5UeHQsIHNlcnZlckVycm9yLCB1cGRhdGVCdG5UeHQgfSA9IHJlcXVpcmUoXCIuLi8uLi9sYW5nL1wiK2xhbmcrXCIvZ2VuZXJhbFwiKTtcbmNvbnN0IHsgYWRkSWxsdXN0cmF0aW9uVHh0LCBkZWZhdWx0QWx0LCBpbnRyb05vSWxsdXN0cmF0aW9uLCBpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2lsbHVzdHJhdGlvblwiKTtcbmNvbnN0IHsgYWRkTGlua1R4dCwgZGVmYXVsdFZhbHVlRm9yTGluaywgaW50cm9Ob0xpbmssIGludHJvVGl0bGVGb3JMaW5rIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL2xpbmtcIik7XG5jb25zdCB7IGFkZFF1ZXN0aW9uVHh0LCBpbnRyb05vUXVlc3Rpb24sIGludHJvVGl0bGVGb3JRdWVzdGlvbiB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9xdWVzdGlvblwiKTtcbmNvbnN0IHsgbmVlZEdyb3VwSWZSYW5rLCBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlLCBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0LCBxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkLCBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0IH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCB7IG5lZWRCZUNvbm5lY3RlZCB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi91c2VyXCIpO1xuXG4vLyBQcmluY2lwYXV4IMOpbMOpbWVudHMgZHUgRE9NIG1hbmlwdWzDqXMgOlxuY29uc3QgYnRuTmV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2FudE5ld1F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHJldmlld1F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCBkZWxldGVDaGVja0JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsZXRlT2tMYWJlbFwiKTtcbmNvbnN0IGRpdkNyYXNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjcmFzaFwiKTtcbmNvbnN0IGRpdklsbHVzdHJhdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlsbHVzdHJhdGlvbnNMaXN0XCIpO1xuY29uc3QgZGl2TGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpbmtzTGlzdFwiKTtcbmNvbnN0IGRpdk1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1haW4tY29udGVudFwiKTtcbmNvbnN0IGRpdk1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1lc3NhZ2VcIik7XG5jb25zdCBkaXZRdWVzdGlvbm5haXJlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNMaXN0XCIpO1xuY29uc3QgZGl2UXVlc3Rpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNMaXN0XCIpO1xuY29uc3QgZGl2UmVzcG9uc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlXCIpO1xuY29uc3QgZGl2U2VhcmNoUmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hSZXN1bHRcIik7XG5jb25zdCBmb3JtTGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGlua3NcIik7XG5jb25zdCBmb3JtSWxsdXN0cmF0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpbGx1c3RyYXRpb25zXCIpO1xuY29uc3QgZm9ybVF1ZXN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJxdWVzdGlvbnNcIik7XG5jb25zdCBmb3JtUXVlc3Rpb25uYWlyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicXVlc3Rpb25uYWlyZXNcIik7XG5jb25zdCBmb3JtU2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzZWFyY2hcIik7XG5jb25zdCBoZWxwQ2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImhlbHBDbGFzc2lmaWNhdGlvblwiKTtcbmNvbnN0IGhlbHBHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscEdyb3VwXCIpO1xuY29uc3QgaGVscFB1Ymxpc2hpbmdBdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVscFB1Ymxpc2hpbmdBdFwiKTtcbmNvbnN0IGlucHV0Q2xhc3NpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNsYXNzaWZpY2F0aW9uXCIpO1xuY29uc3QgaW5wdXRHcm91cCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZ3JvdXBcIik7XG5jb25zdCBpbnB1dFJhbmtJbkdyb3VwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyYW5rSW5Hcm91cFwiKTtcblxuLy8gVmlkZSBldCBjYWNoZSB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzIGF1IHF1ZXN0aW9ubmFpcmUgOlxuY29uc3QgaGlkZUFsbEZvcm1zID0gKCkgPT5cbntcbiAgICBlbXB5QW5kSGlkZUZvcm0oZm9ybUxpbmspO1xuICAgIGlmKGRlZmF1bHRWYWx1ZUZvckxpbmshPTApXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYW5jaG9yXCIpLnZhbHVlPWRlZmF1bHRWYWx1ZUZvckxpbms7XG4gICAgZW1weUFuZEhpZGVGb3JtKGZvcm1JbGx1c3RyYXRpb24pO1xuICAgIGVtcHlBbmRIaWRlRm9ybShmb3JtUXVlc3Rpb24pO1xufVxuXG4vLyBBZmZpY2hlIGxlcyBkb25uw6llcyBkJ3VuIGxpZW4gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jIDpcbmNvbnN0IHNob3dGb3JtTGlua0luZm9zID0gKExpbmspID0+XG57XG4gICAgLy8gT24gY29tbWVuY2UgcGFyIGNhY2hlciBldCB2aWRlciB0b3VzIGxlcyBmb3JtdWxhaXJlcyBhbm5leGVzXG4gICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgLy8gUHVpcyBvbiBhZmZpY2hlIGNlbHVpIGNvbmNlcm7DqVxuICAgIGZvcm1MaW5rLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIC8vICsgTGVzIGNvbnRyYWludGVzIGRlIGNoYW1wICYgdmFsZXVycyBwYXIgZMOpZmF1dCA6XG4gICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0xpbmtzLkxpbmssIGZvcm1MaW5rKTtcbiAgICBmb3IobGV0IGRhdGEgaW4gTGluaylcbiAgICB7XG4gICAgICAgIGlmKGZvcm1MaW5rLmVsZW1lbnRzW2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgZm9ybUxpbmsuZWxlbWVudHNbZGF0YV0udmFsdWU9TGlua1tkYXRhXTtcbiAgICB9XG59XG5cbi8vIEFmZmljaGUgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCBsZXMgbGllbnMgZHUgcXVlc3Rpb25uYWlyZSBhZmZpY2jDqSA6XG5jb25zdCBzaG93TGlua0luZm9zID0gKExpbmtzLCB0b2tlbikgPT5cbntcbiAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcImgyXCIsIGludHJvVGl0bGVGb3JMaW5rKTtcbiAgICBsZXQgbGlzdExpbmtzPVwiXCI7XG4gICAgZm9yKGxldCBpIGluIExpbmtzKVxuICAgICAgICBsaXN0TGlua3MrPVwiPGxpPjxhIGhyZWY9J1wiK0xpbmtzW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPlwiK0xpbmtzW2ldLmFuY2hvcitcIjwvYT48YnI+PGEgaHJlZj0nI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCtcIicgaWQ9JyN1cGRhdGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGNsYXNzPSdidXR0b24nID5cIit1cGRhdGVCdG5UeHQrXCI8L2E+IDxhIGhyZWY9JyNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQrXCInIGlkPScjZGVsZXRlTGlua1wiK0xpbmtzW2ldLmlkK1wiJyBjbGFzcz0nYnV0dG9uJyA+XCIrZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgaWYobGlzdExpbmtzPT09XCJcIilcbiAgICAgICAgbGlzdExpbmtzPVwiPGxpPlwiK2ludHJvTm9MaW5rK1wiPC9saT5cIjtcbiAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInVsXCIsIGxpc3RMaW5rcywgXCJcIiwgW10sIFwiXCIsIGZhbHNlKTsvLyAhIMOgIGludMOpZ3JlciBkJ2Fib3JkIGRhbnMgbGUgRE9NIHBvdXIgcG91dm9pciBham91dGVyIGxlcyBMaXN0ZW5lcnMgZW5zdWl0ZVxuICAgIGZvcihsZXQgaSBpbiBMaW5rcylcbiAgICB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZUxpbmtcIitMaW5rc1tpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHNob3dGb3JtTGlua0luZm9zKExpbmtzW2ldKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NcIik7XG4gICAgICAgIH0pO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNkZWxldGVMaW5rXCIrTGlua3NbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybUxpbmtJbmZvcyhMaW5rc1tpXSk7XG4gICAgICAgICAgICBmb3JtTGluay5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICBzZW5kTGlua0Zvcm0odG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYoTGlua3MubGVuZ3RoIDwgY29uZmlnLm5iTGlua3NNYXggfHwgY29uZmlnLm5iTGlua3NNYXggPT09IDApXG4gICAge1xuICAgICAgICBsZXQgbmV3QnRuPVwiPGEgaHJlZj0nI25ld0xpbmsnIGlkPSduZXdMaW5rJyBjbGFzcz0nYnV0dG9uJz5cIithZGRMaW5rVHh0K1wiPC9hPlwiO1xuICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgbmV3QnRuLCBcIlwiLCBbXSwgeyB9LCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV3TGlua1wiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICBmb3JtTGluay5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGZvcm1MaW5rLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI2xpbmtzXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0xpbmtzLCBmb3JtTGluayk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gRW52b2kgZGVzIGRvbm7DqWVzIGQndW4gbGllbi5cbmNvbnN0IHNlbmRMaW5rRm9ybSA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCBkaXZSZXNwb25zZUxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZUxpbmtcIik7XG4gICAgZGl2UmVzcG9uc2VMaW5rLmlubmVySFRNTD1cIlwiO1xuICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUxpbmspO1xuICAgIGNvbnN0IHhockxpbmtEYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgeGhyTGlua0RhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZ0xpbmtzLmxpbmtzUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBVVFwiLCBhcGlVcmwrY29uZmlnTGlua3MubGlua3NSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZVxuICAgICAgICB4aHJMaW5rRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ0xpbmtzLmxpbmtzUm91dGUpO1xuICAgIHhockxpbmtEYXRhcy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIGlmICgodGhpcy5zdGF0dXMgPT09IDIwMCB8fCB0aGlzLnN0YXR1cyA9PT0gMjAxKSAmJiByZXNwb25zZS5tZXNzYWdlIT11bmRlZmluZWQgJiYgcmVzcG9uc2UucXVlc3Rpb25uYWlyZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgc2hvd0xpbmtJbmZvcyhyZXNwb25zZS5xdWVzdGlvbm5haXJlLkxpbmtzLCB0b2tlbik7Ly8gbGUgc2VydmV1ciByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdkxpbmtzLCBcInBcIiwgcmVzcG9uc2UubWVzc2FnZSwgXCJcIiwgW1wic3VjY2Vzc1wiXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjbGlua3NMaXN0XCIpO1xuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModG9rZW4pOy8vIHBldXQgYXZvaXIgw6l2b2x1w6kgc3VpdmFudCBjZSBxdWkgcydlc3QgcGFzc8OpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5lcnJvcnMpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlTGluaywgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VMaW5rLCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJMaW5rRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgeGhyTGlua0RhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3Rva2VuKTtcbiAgICB4aHJMaW5rRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xufVxuXG4vLyBBZmZpY2hlIGxlcyBkb25uw6llcyBkJ3VuZSBpbGx1c3RyYXRpb24gZGFucyBsZSBmb3JtdWxhaXJlIGFkaG9jIDpcbmNvbnN0IHNob3dGb3JtSWxsdXN0cmF0aW9uSW5mb3MgPSAoSWxsdXN0cmF0aW9uKSA9Plxue1xuICAgIC8vIE9uIGNvbW1lbmNlIHBhciBjYWNoZXIgZXQgdmlkZXIgdG91cyBsZXMgZm9ybXVsYWlyZXMgYW5uZXhlc1xuICAgIGhpZGVBbGxGb3JtcygpO1xuICAgIC8vIFB1aXMgb24gYWZmaWNoZSBjZWx1aSBjb25jZXJuw6lcbiAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIC8vICsgTGVzIGNvbnRyYWludGVzIGRlIGNoYW1wICYgdmFsZXVycyBwYXIgZMOpZmF1dFxuICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdJbGx1c3RyYXRpb25zLklsbHVzdHJhdGlvbiwgZm9ybUlsbHVzdHJhdGlvbik7ICAgICAgICAgICAgICBcbiAgICAvLyBNYWlzIGxlIGNoYW1wIGZpbGUgbidlc3QgcGx1cyByZXF1aXMsIHF1YW5kIHVuIGZpY2hpZXIgZXhpc3RlIGTDqWrDoFxuICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbXCJpbWFnZVwiXS5yZW1vdmVBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKTtcbiAgICBmb3IobGV0IGRhdGEgaW4gSWxsdXN0cmF0aW9uKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIGZvcm1JbGx1c3RyYXRpb24uZWxlbWVudHNbZGF0YV0udmFsdWU9SWxsdXN0cmF0aW9uW2RhdGFdO1xuICAgIH1cbn1cblxuLy8gQWZmaWNoZSBsZXMgaW5mb3MgY29ubnVlcyBjb25jZXJuYW50IGxlcyBpbGx1c3RyYXRpb25zIGR1IHF1ZXN0aW9ubmFpcmUgYWZmaWNow6kgOlxuY29uc3Qgc2hvd0lsbHVzdHJhdGlvbkluZm9zID0gKElsbHVzdHJhdGlvbnMsIHRva2VuKSA9Plxue1xuICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJoMlwiLCBpbnRyb1RpdGxlRm9ySWxsdXN0cmF0aW9uKTtcbiAgICBsZXQgbGlzdElsbHVzdHJhdGlvbnM9XCJcIjtcbiAgICBmb3IobGV0IGkgaW4gSWxsdXN0cmF0aW9ucylcbiAgICAgICAgbGlzdElsbHVzdHJhdGlvbnMrPVwiPGxpPjxhIGhyZWY9J1wiK2NvbmZpZ1RlbXBsYXRlLmlsbHVzdHJhdGlvbkRpcitJbGx1c3RyYXRpb25zW2ldLnVybCtcIicgdGFyZ2V0PSdfYmxhbmsnPjxpbWcgc3JjPSdcIitjb25maWdUZW1wbGF0ZS5pbGx1c3RyYXRpb25EaXIrSWxsdXN0cmF0aW9uc1tpXS51cmwrXCInIGFsdD0nXCIrZGVmYXVsdEFsdCtcIicgc3R5bGU9J21heC1oZWlnaHQ6MTUwcHgnPjwvYT48YnI+PGEgaHJlZj0nI3VwZGF0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQrXCInIGlkPScjdXBkYXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgY2xhc3M9J2J1dHRvbic+XCIrdXBkYXRlQnRuVHh0K1wiPC9hPiA8YSBocmVmPScjZGVsZXRlSWxsdXN0cmF0aW9uXCIrSWxsdXN0cmF0aW9uc1tpXS5pZCtcIicgaWQ9JyNkZWxldGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIitkZWxldGVCdG5UeHQrXCI8L2E+PC9saT5cIjtcbiAgICBpZihsaXN0SWxsdXN0cmF0aW9ucyA9PT0gXCJcIilcbiAgICAgICAgbGlzdElsbHVzdHJhdGlvbnM9XCI8bGk+XCIraW50cm9Ob0lsbHVzdHJhdGlvbitcIjwvbGk+XCI7XG4gICAgYWRkRWxlbWVudChkaXZJbGx1c3RyYXRpb25zLCBcInVsXCIsIGxpc3RJbGx1c3RyYXRpb25zLCBcIlwiLCBbXSwgXCJcIiwgZmFsc2UpOy8vICEgw6AgaW50w6lncmVyIGQnYWJvcmQgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgbGVzIExpc3RlbmVycyBlbnN1aXRlXG4gICAgZm9yKGxldCBpIGluIElsbHVzdHJhdGlvbnMpXG4gICAge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN1cGRhdGVJbGx1c3RyYXRpb25cIitJbGx1c3RyYXRpb25zW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1JbGx1c3RyYXRpb25JbmZvcyhJbGx1c3RyYXRpb25zW2ldKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjaWxsdXN0cmF0aW9uc1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZUlsbHVzdHJhdGlvblwiK0lsbHVzdHJhdGlvbnNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzaG93Rm9ybUlsbHVzdHJhdGlvbkluZm9zKElsbHVzdHJhdGlvbnNbaV0pO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcImRlbGV0ZU9rXCJdLnZhbHVlPXRydWU7XG4gICAgICAgICAgICBzZW5kSWxsdXN0cmF0aW9uRm9ybSh0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZihJbGx1c3RyYXRpb25zLmxlbmd0aCA8IGNvbmZpZy5uYklsbHVzdHJhdGlvbnNNYXggfHwgY29uZmlnLm5iSWxsdXN0cmF0aW9uc01heCA9PT0gMClcbiAgICB7XG4gICAgICAgIGxldCBuZXdCdG49XCI8YSBocmVmPScjbmV3SWxsdXN0cmF0aW9uJyBpZD0nbmV3SWxsdXN0cmF0aW9uJyBjbGFzcz0nYnV0dG9uJz5cIithZGRJbGx1c3RyYXRpb25UeHQrXCI8L2E+XCI7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2SWxsdXN0cmF0aW9ucywgXCJwXCIsIG5ld0J0biwgXCJcIiwgW10sIHsgfSwgZmFsc2UpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5ld0lsbHVzdHJhdGlvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICBmb3JtSWxsdXN0cmF0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5lbGVtZW50c1tcIlF1ZXN0aW9ubmFpcmVJZFwiXS52YWx1ZT1mb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImlkXCJdLnZhbHVlO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ0lsbHVzdHJhdGlvbnMsIGZvcm1JbGx1c3RyYXRpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIEVudm9pIGRlcyBkb25uw6llcyBkJ3VuZSBpbGx1c3RyYXRpb24uXG5jb25zdCBzZW5kSWxsdXN0cmF0aW9uRm9ybSA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCBkaXZSZXNwb25zZUlsbHVzdHJhdGlvbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJlc3BvbnNlSWxsdXN0cmF0aW9uXCIpO1xuICAgIGRpdlJlc3BvbnNlSWxsdXN0cmF0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybUlsbHVzdHJhdGlvbik7XG4gICAgbGV0IGRhdGFzV2l0aEZpbGVzPW5ldyBGb3JtRGF0YShmb3JtSWxsdXN0cmF0aW9uKTsgLy8gY2FyIGlsIG1lIG1hbnF1ZSBsZXMgaW5mb3JtYXRpb25zIGR1IGZpY2hpZXIgYXZlYyBsYSBmb25jdGlvbiBnZXREYXRhc0Zyb21JbnB1dHNcbiAgICBjb25zdCB4aHJJbGx1c3RyYXRpb25EYXRhcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoIWlzRW1wdHkoZGF0YXMuZGVsZXRlT2spKSlcbiAgICAgICAgeGhySWxsdXN0cmF0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnSWxsdXN0cmF0aW9ucy5pbGx1c3RyYXRpb25zUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdJbGx1c3RyYXRpb25zLmlsbHVzdHJhdGlvbnNSb3V0ZStkYXRhcy5pZCk7XG4gICAgZWxzZVxuICAgICAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5vcGVuKFwiUE9TVFwiLCBhcGlVcmwrY29uZmlnSWxsdXN0cmF0aW9ucy5pbGx1c3RyYXRpb25zUm91dGUpO1xuICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgaWYgKCh0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAyMDEpICYmIHJlc3BvbnNlLm1lc3NhZ2UhPXVuZGVmaW5lZCAmJiByZXNwb25zZS5xdWVzdGlvbm5haXJlIT11bmRlZmluZWQpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZS5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UucXVlc3Rpb25uYWlyZS5JbGx1c3RyYXRpb25zLCB0b2tlbik7Ly8gbGUgc2VydmV1ciByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgbGllbnNcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdklsbHVzdHJhdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNpbGx1c3RyYXRpb25zTGlzdFwiKTtcbiAgICAgICAgICAgICAgICBzaG93TmV4dFF1ZXN0aW9ubmFpcmVzKHRva2VuKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZUlsbHVzdHJhdGlvbiwgXCJwXCIsIHJlc3BvbnNlLmVycm9ycywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2VJbGx1c3RyYXRpb24sIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHhocklsbHVzdHJhdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3Rva2VuKTtcbiAgICB4aHJJbGx1c3RyYXRpb25EYXRhcy5zZW5kKGRhdGFzV2l0aEZpbGVzKTtcbn1cblxuLy8gQWZmaWNoZSBsZXMgZG9ubsOpZXMgZCd1bmUgcXVlc3Rpb24gKyBzZXMgcsOpcG9uc2VzIHBvc3NpYmxlcyBkYW5zIGxlIGZvcm11bGFpcmUgYWRob2NcbmNvbnN0IHNob3dGb3JtUXVlc3Rpb25JbmZvcyA9IChRdWVzdGlvbikgPT5cbntcbiAgICAvLyBPbiBjb21tZW5jZSBwYXIgY2FjaGVyIGV0IHZpZGVyIHRvdXMgbGVzIGZvcm11bGFpcmVzIGFubmV4ZXNcbiAgICBoaWRlQWxsRm9ybXMoKTtcbiAgICAvLyBQdWlzIG9uIGFmZmljaGUgY2VsdWkgY29uY2VybsOpXG4gICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgIGZvcihsZXQgZGF0YSBpbiBRdWVzdGlvbi5RdWVzdGlvbilcbiAgICB7XG4gICAgICAgIGlmKGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgIGZvcm1RdWVzdGlvbi5lbGVtZW50c1tkYXRhXS52YWx1ZT1RdWVzdGlvbi5RdWVzdGlvbltkYXRhXTtcbiAgICB9XG4gICAgLy8gKyBMZXMgY29udHJhaW50ZXMgZGUgY2hhbXAgJiBsZXMgdmFsZXVycyBwYXIgZMOpZmF1dFxuICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbiwgZm9ybVF1ZXN0aW9uKTsgICAgICAgICAgICAgIFxuICAgIGZvcihsZXQgZGF0YSBpbiBRdWVzdGlvbi5DaG9pY2VzKVxuICAgIHtcbiAgICAgICAgaWYoZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlVGV4dFwiK2RhdGFdIT09dW5kZWZpbmVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJjaG9pY2VUZXh0XCIrZGF0YV0udmFsdWU9UXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS50ZXh0O1xuICAgICAgICAgICAgaWYoUXVlc3Rpb24uQ2hvaWNlc1tkYXRhXS5pc0NvcnJlY3Q9PXRydWUpXG4gICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiY2hvaWNlSXNDb3JyZWN0XCIrZGF0YV0uY2hlY2tlZD10cnVlO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiaWRDaG9pY2VcIitkYXRhXS52YWx1ZT1RdWVzdGlvbi5DaG9pY2VzW2RhdGFdLmlkO1xuICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgIH1cbn1cblxuLy8gQWZmaWNoZSBsZXMgaW5mb3MgZGVzIHF1ZXN0aW9ucyBkdSBxdWl6IGFmZmljaMOpIDpcbmNvbnN0IHNob3dRdWVzdGlvbkluZm9zID0gKFF1ZXN0aW9ucywgdG9rZW4pID0+XG57XG4gICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwiaDJcIiwgaW50cm9UaXRsZUZvclF1ZXN0aW9uKTtcbiAgICBsZXQgbGlzdFF1ZXN0aW9ucz1cIlwiO1xuICAgIGZvcihsZXQgaSBpbiBRdWVzdGlvbnMpXG4gICAgICAgIGxpc3RRdWVzdGlvbnMrPVwiPGxpPlwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5yYW5rK1wiIC0gXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLnRleHQrXCI8YnI+PGEgaHJlZj0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBpZD0nI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkK1wiJyBjbGFzcz0nYnV0dG9uJz5cIit1cGRhdGVCdG5UeHQrXCI8L2E+IDxhIGhyZWY9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgaWQ9JyNkZWxldGVRdWVzdGlvblwiK1F1ZXN0aW9uc1tpXS5RdWVzdGlvbi5pZCtcIicgY2xhc3M9J2J1dHRvbic+XCIrZGVsZXRlQnRuVHh0K1wiPC9hPjwvbGk+XCI7XG4gICAgaWYobGlzdFF1ZXN0aW9ucyA9PT0gXCJcIilcbiAgICAgICAgbGlzdFF1ZXN0aW9ucz1cIjxsaT5cIitpbnRyb05vUXVlc3Rpb24rXCI8L2xpPlwiO1xuICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcInVsXCIsIGxpc3RRdWVzdGlvbnMsIFwiXCIsIFtdLCBcIlwiLCBmYWxzZSk7Ly8gw6AgaW50w6lncmVyIGQnYWJvcmQgZGFucyBsZSBET00gcG91ciBwb3V2b2lyIGFqb3V0ZXIgbGVzIExpc3RlbmVycyBlbnN1aXRlXG4gICAgZm9yKGxldCBpIGluIFF1ZXN0aW9ucylcbiAgICB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI3VwZGF0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiI3F1ZXN0aW9uc1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiI2RlbGV0ZVF1ZXN0aW9uXCIrUXVlc3Rpb25zW2ldLlF1ZXN0aW9uLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbkluZm9zKFF1ZXN0aW9uc1tpXSk7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJkZWxldGVPa1wiXS52YWx1ZT10cnVlO1xuICAgICAgICAgICAgc2VuZFF1ZXN0aW9uRm9ybSh0b2tlbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZihRdWVzdGlvbnMubGVuZ3RoIDwgY29uZmlnLm5iUXVlc3Rpb25zTWF4IHx8IGNvbmZpZy5uYlF1ZXN0aW9uc01heCA9PT0gMClcbiAgICB7XG4gICAgICAgIGxldCBuZXdCdG49XCI8YSBocmVmPScjbmV3UXVlc3Rpb24nIGlkPSduZXdRdWVzdGlvbicgY2xhc3M9J2J1dHRvbic+XCIrYWRkUXVlc3Rpb25UeHQrXCI8L2E+XCI7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25zLCBcInBcIiwgbmV3QnRuLCBcIlwiLCBbXSwgeyB9LCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibmV3UXVlc3Rpb25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGhpZGVBbGxGb3JtcygpO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgZm9ybVF1ZXN0aW9uLmVsZW1lbnRzW1wiUXVlc3Rpb25uYWlyZUlkXCJdLnZhbHVlPWZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiaWRcIl0udmFsdWU7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uZWxlbWVudHNbXCJyYW5rXCJdLnZhbHVlPShRdWVzdGlvbnMubGVuZ3RoPT09MCkgPyBjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbi5yYW5rLmRlZmF1bHRWYWx1ZSA6IFF1ZXN0aW9ucy5sZW5ndGgrMTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25zXCIpO1xuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLlF1ZXN0aW9uLCBmb3JtUXVlc3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIEVudm9pIGRlcyBkb25uw6llcyBkJ3VuZSBxdWVzdGlvbiBldCBkZSBzZXMgcsOpcG9uc2UuIFBldXQgw6p0cmUgZ8OpbsOpcsOpIHBhciBsZSBib3V0b24gc3VibWl0IG91IHBhciBsZSBsaWVuIFwic3VwcHJpbWVyXCIuXG5jb25zdCBzZW5kUXVlc3Rpb25Gb3JtID0gKHRva2VuKSA9Plxue1xuICAgIGNvbnN0IGRpdlJlc3BvbnNlUXVlc3Rpb249ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZXNwb25zZVF1ZXN0aW9uXCIpO1xuICAgIGRpdlJlc3BvbnNlUXVlc3Rpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgbGV0IGRhdGFzPWdldERhdGFzRnJvbUlucHV0cyhmb3JtUXVlc3Rpb24pO1xuICAgIGNvbnN0IHhoclF1ZXN0aW9uRGF0YXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBpZighaXNFbXB0eShkYXRhcy5pZCkgJiYgKCFpc0VtcHR5KGRhdGFzLmRlbGV0ZU9rKSkpXG4gICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIkRFTEVURVwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25zUm91dGUrZGF0YXMuaWQpO1xuICAgIGVsc2UgaWYoIWlzRW1wdHkoZGF0YXMuaWQpKVxuICAgICAgICB4aHJRdWVzdGlvbkRhdGFzLm9wZW4oXCJQVVRcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9uc1JvdXRlK2RhdGFzLmlkKTsvLyBtaXNlIMOgIGpvdXIgZCd1bmUgcXVlc3Rpb25cbiAgICBlbHNlXG4gICAgICAgIHhoclF1ZXN0aW9uRGF0YXMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9uc1JvdXRlKTsvLyBub3V2ZWxsZSBxdWVzdGlvblxuICAgIHhoclF1ZXN0aW9uRGF0YXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAoKHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDIwMSkgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkICYmIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUhPXVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2UgPSByZXNwb25zZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHNob3dRdWVzdGlvbkluZm9zKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmUuUXVlc3Rpb25zLCB0b2tlbik7Ly8gbGUgc2VydmV1ciBtZSByZXRvdXJuZSB1bmUgdmVyc2lvbiBhY3R1YWxpc8OpZSBkZSBsYSBsaXN0ZSBkZXMgcXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbnMsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihcIiNxdWVzdGlvbnNMaXN0XCIpO1xuICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModG9rZW4pOy8vIGNhciBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JzKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UuZXJyb3JzKSlcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzLmpvaW4oXCI8YnI+XCIpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JzID0gc2VydmVyRXJyb3I7XG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZVF1ZXN0aW9uLCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJRdWVzdGlvbkRhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgIHhoclF1ZXN0aW9uRGF0YXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdG9rZW4pO1xuICAgIHhoclF1ZXN0aW9uRGF0YXMuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xufVxuXG4vLyBBZmZpY2hhbnQgbGVzIGluZm9zIGNvbm51ZXMgY29uY2VybmFudCB1biBxdWVzdGlvbm5haXJlIGV0IHNlcyBkw6lwZW5kYW5jZXNcbmNvbnN0IHNob3dGb3JtUXVlc3Rpb25uYWlyZUluZm9zID0gKGlkLCB0b2tlbikgPT5cbntcbiAgICBjb25zdCB4aHJHZXRJbmZvcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhockdldEluZm9zLm9wZW4oXCJHRVRcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrY29uZmlnUXVlc3Rpb25uYWlyZXMuZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcytcIi9cIitpZCk7XG4gICAgeGhyR2V0SW5mb3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5RdWVzdGlvbm5haXJlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5yZXNldCgpOy8vIHBvdXIgbmUgcGFzIGdhcmRlciBsZXMgZG9ubsOpZXMgZMOpasOgIGFmZmljaMOpZXMgc2kgdmlkZSBkYW5zIGNlIHF1aSBlc3QgcmV0b3VybsOpXG4gICAgICAgICAgICAgICAgZm9yKGxldCBkYXRhIGluIHJlc3BvbnNlLlF1ZXN0aW9ubmFpcmUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZihmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXSE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YT09PVwicHVibGlzaGluZ0F0XCIgJiYgcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtkYXRhXSE9PW51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuZWxlbWVudHNbZGF0YV0udmFsdWU9ZGF0ZUZvcm1hdChyZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdLCBcImZvcm1cIik7Ly8gISEgcmV2b2lyIGNhciBmb3JtYXQgcG91dmFudCBwb3NlciBzb3VjaXMgc2kgbmF2aWdhdGV1ciBuZSBnw6hyZSBwYXMgbGVzIGNoYW1wcyBkZSB0eXBlIFwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tkYXRhXS52YWx1ZT1yZXNwb25zZS5RdWVzdGlvbm5haXJlW2RhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlQ2hlY2tCb3guc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICB9Ly8gYWpvdXRlciBnZXN0aW9uIGRlcyByZXRvdXJzIGVuIGVycmV1ciA/XG4gICAgICAgICAgICBpZihyZXNwb25zZS5UYWdzICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NpZmljYXRpb249XCJcIjtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UuVGFncylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGk9PTApXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbis9cmVzcG9uc2UuVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbis9XCIsXCIrcmVzcG9uc2UuVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3JtUXVlc3Rpb25uYWlyZS5lbGVtZW50c1tcImNsYXNzaWZpY2F0aW9uXCJdLnZhbHVlPWNsYXNzaWZpY2F0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoIWlzRW1wdHkocmVzcG9uc2UuR3JvdXApKVxuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLmVsZW1lbnRzW1wiZ3JvdXBcIl0udmFsdWU9cmVzcG9uc2UuR3JvdXAuR3JvdXAudGl0bGUrXCIgKFwiK3Jlc3BvbnNlLkdyb3VwLkdyb3VwLmlkK1wiKVwiO1xuICAgICAgICAgICAgZGl2TGlua3Muc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBkaXZRdWVzdGlvbnMuc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBkaXZJbGx1c3RyYXRpb25zLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYocmVzcG9uc2UuTGlua3MgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHNob3dMaW5rSW5mb3MocmVzcG9uc2UuTGlua3MsIHRva2VuKTtcbiAgICAgICAgICAgIGlmKHJlc3BvbnNlLlF1ZXN0aW9ucyAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgc2hvd1F1ZXN0aW9uSW5mb3MocmVzcG9uc2UuUXVlc3Rpb25zLCB0b2tlbik7XG4gICAgICAgICAgICBpZihyZXNwb25zZS5JbGx1c3RyYXRpb25zICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBzaG93SWxsdXN0cmF0aW9uSW5mb3MocmVzcG9uc2UuSWxsdXN0cmF0aW9ucywgdG9rZW4pO1xuICAgICAgICAgICAgaGVscFB1Ymxpc2hpbmdBdC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOy8vIGluZm8gdW5pcXVlbWVudCB1dGlsZSBwb3VyIFwicGxhY2VyXCIgdW4gbm91dmVhdSBxdWl6XG4gICAgICAgICAgICAvLyDDoCByZXZvaXIgOiByZW1wbGFjZXIgbGllbiBwb3VyIHVuIGJvdXRvbiArIHJlc2V0IGNvbXBsZXQgZHUgZm9ybXVsYWlyZSwgeSBjb21wcmlzIGNoYW1wcyBoaWRkZW4gOlxuICAgICAgICAgICAgYnRuTmV3UXVlc3Rpb25uYWlyZS5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGJ0bk5ld1F1ZXN0aW9ubmFpcmUuc2V0QXR0cmlidXRlKFwiaHJlZlwiLCBjb25maWdUZW1wbGF0ZS5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlKTtcbiAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO1xuICAgICAgICAgICAgaWYocmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcImlzUHVibGlzaGVkXCJdID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnByZXZpZXdRdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2lkK1wiL1wiK3Rva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBidG5QcmV2aWV3UXVlc3Rpb25uYWlyZS5zZXRBdHRyaWJ1dGUoXCJocmVmXCIsIGNvbmZpZy5zaXRlVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXMrcmVzcG9uc2UuUXVlc3Rpb25uYWlyZVtcInNsdWdcIl0rXCIuaHRtbFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB4aHJHZXRJbmZvcy5zZW5kKCk7XG59XG5cbi8vIEFmZmljaGUgbGVzIHF1ZXN0aW9ubmFpcmVzIGJpZW50w7R0IHB1Ymxpw6lzLlxuY29uc3Qgc2hvd05leHRRdWVzdGlvbm5haXJlcyA9ICh0b2tlbikgPT5cbntcbiAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMub3BlbihcIkdFVFwiLCBhcGlVcmwrY29uZmlnUXVlc3Rpb25uYWlyZXMucXVlc3Rpb25uYWlyZVJvdXRlcytjb25maWdRdWVzdGlvbm5haXJlcy5nZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzKTtcbiAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsZXQgbGlzdEhUTUw9XCJcIiwgZGF5U3RyLCBvcHRpb25zRGF5U3RyID0geyB3ZWVrZGF5OiAnbG9uZyd9O1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZS5xdWVzdGlvbm5haXJlcylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGRheVN0cj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChsYW5nLCBvcHRpb25zRGF5U3RyKS5mb3JtYXQobmV3IERhdGUocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uZGF0ZVB1Ymxpc2hpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEhUTUwrPVwiPGxpPlwiK2RheVN0citcIiBcIitkYXRlRm9ybWF0KHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmRhdGVQdWJsaXNoaW5nLCBcImZyXCIpK1wiOiA8YSBocmVmPSdcIitjb25maWdUZW1wbGF0ZS5xdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlK1wiP2lkPVwiK3Jlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlkK1wiJyBpZD0ncXVlc3Rpb25uYWlyZV9cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIic+XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0udGl0bGUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzW2ldLmlzUHVibGlzaGFibGU9PT1mYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIiA8c3BhbiBjbGFzcz0nZXJyb3InPihcIitxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkK1wiKTwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCE9PTApXG4gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwiaDNcIiwgbmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscFB1Ymxpc2hpbmdBdCwgXCJlbVwiLCBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQobmV3IERhdGUocmVzcG9uc2UuZGF0ZU5lZWRlZCksIFwiZnJcIikpO1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwidWxcIiwgbGlzdEhUTUwsIFwiXCIsIFwiXCIsIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVfXCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaWQpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyhlLnRhcmdldC5pZC5zcGxpdChcIl9cIilbMV0sIHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIjcXVlc3Rpb25uYWlyZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0vLyBham91dGVyIGdlc3Rpb24gZXJyZXVycyByZcOndWVzIGR1IHNlcnZldXIgP1xuICAgICAgICB9XG4gICAgfVxuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit0b2tlbik7IFxuICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5zZW5kKCk7XG59XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1wibWFuYWdlclwiLCBcImFkbWluXCJdLCBcIi9cIitjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiBuZWVkQmVDb25uZWN0ZWQsIGNvbG9yOlwiZXJyb3JcIiB9LCB3aW5kb3cubG9jYXRpb24pO1xuICAgICAgICBpZihpc0Nvbm5lY3RlZClcbiAgICAgICAge1xuICAgICAgICAgICAgZGl2TWFpbi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjtcbiAgICAgICAgICAgIGlmKCFpc0VtcHR5KGdldExvY2FseShcIm1lc3NhZ2VcIikpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIGdldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkubWVzc2FnZSwgXCJcIiwgW2dldExvY2FseShcIm1lc3NhZ2VcIiwgdHJ1ZSkuY29sb3JdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwibWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVzZXI9Z2V0TG9jYWx5KFwidXNlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIE1pc2Ugw6Agam91ciBkdSBsaWVuIFwiY29tcHRlXCIgZHUgaGVhZGVyIDpcbiAgICAgICAgICAgIHVwZGF0ZUFjY291bnRMaW5rKHVzZXIuc3RhdHVzLCBjb25maWdUZW1wbGF0ZSk7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXNhdGlvbiBkZXMgZm9ybXVsYWlyZXMgOlxuICAgICAgICAgICAgc2V0QXR0cmlidXRlc1RvSW5wdXRzKGNvbmZpZ1F1ZXN0aW9ubmFpcmVzLCBmb3JtU2VhcmNoKTtcbiAgICAgICAgICAgIHNldEF0dHJpYnV0ZXNUb0lucHV0cyhjb25maWdRdWVzdGlvbm5haXJlcy5RdWVzdGlvbm5haXJlLCBmb3JtUXVlc3Rpb25uYWlyZSk7XG4gICAgICAgICAgICAvLyBWaWRlL2NhY2hlIGxlcyDDqWzDqW1lbnRzIGludXRpbGVzIGVuIG1vZGUgY3LDqWF0aW9uIDpcbiAgICAgICAgICAgIGJ0blByZXZpZXdRdWVzdGlvbm5haXJlLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7XG4gICAgICAgICAgICBkZWxldGVDaGVja0JveC5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xuICAgICAgICAgICAgaGlkZUFsbEZvcm1zKCk7XG4gICAgICAgICAgICAvLyBTaSB1biBpZCBlc3QgcGFzc8OpIHBhciBsJ3VybCwgb24gZXNzYXllIGQnYWZmaWNoZXIgbGUgcXVlc3Rpb25uYWlyZSA6XG4gICAgICAgICAgICBsZXQgdXJsRGF0YXM9Z2V0VXJsUGFyYW1zKCk7XG4gICAgICAgICAgICBpZih1cmxEYXRhcyAmJiB1cmxEYXRhcy5pZCE9PXVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBzaG93Rm9ybVF1ZXN0aW9ubmFpcmVJbmZvcyh1cmxEYXRhcy5pZCwgdXNlci50b2tlbik7XG4gICAgICAgICAgICAvLyBsZXMgcHJvY2hhaW5lcyBwdWJsaWNhdGlvbnMgOlxuICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIC8vIExhbmNlbWVudCBkJ3VuZSByZWNoZXJjaGUgOlxuICAgICAgICAgICAgZm9ybVNlYXJjaC5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhcz1nZXREYXRhc0Zyb21JbnB1dHMoZm9ybVNlYXJjaCk7XG4gICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSk7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UubGVuZ3RoPT09MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZTZWFyY2hSZXN1bHQsIFwicFwiLCBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0LCBcIlwiLCBbXCJpbmZvXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0SFRNTD1cIjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiByZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdEhUTUwrPVwiPG9wdGlvbiB2YWx1ZT0nXCIrcmVzcG9uc2VbaV0uaWQrXCInPlwiK3Jlc3BvbnNlW2ldLnRpdGxlK1wiPC9vcHRpb24+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInNlbGVjdFwiLCBzZWxlY3RIVE1MLCBcInNlbGVjdFNlYXJjaFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoU2VsZWN0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VsZWN0U2VhcmNoXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBmdW5jdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaFNlbGVjdC52YWx1ZSE9PVwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3Moc2VhcmNoU2VsZWN0LnZhbHVlLCB1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2U2VhcmNoUmVzdWx0LCBcInBcIiwgc2VydmVyRXJyb3IsIFwiXCIsIFtcImVycm9yXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgeGhyU2VhcmNoLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmKGRhdGFzKVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2guc2VuZChKU09OLnN0cmluZ2lmeShkYXRhcykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFpZGUgw6AgbGEgc2Fpc2llIHBvdXIgbGUgY2xhc3NlbWVudCBkdSBxdWl6XG4gICAgICAgICAgICBpbnB1dENsYXNzaWZpY2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpdlJlc3BvbnNlLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3M9aW5wdXRDbGFzc2lmaWNhdGlvbi52YWx1ZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICAgICAgdGFncy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFRhZz10YWdzWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZihsYXN0VGFnLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyU2VhcmNoVGFncyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hUYWdzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnRhZ3NTZWFyY2hSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscENsYXNzaWZpY2F0aW9uLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoaGVscENsYXNzaWZpY2F0aW9uLCBcImFcIiwgcmVzcG9uc2VbaV0ubmFtZSwgXCIjdGFnXCIrcmVzcG9uc2VbaV0uaWQsIFtcImluZm9cIl0sIHsgaHJlZjpcIiN0YWdcIityZXNwb25zZVtpXS5pZCB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiN0YWdcIityZXNwb25zZVtpXS5pZCkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NbMF09ZS50YXJnZXQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2xhc3NpZmljYXRpb24udmFsdWU9dGFncy5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwQ2xhc3NpZmljYXRpb24uaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaFRhZ3Muc2VuZChKU09OLnN0cmluZ2lmeSh7c2VhcmNoOiBsYXN0VGFnfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBBaWRlIMOgIGxhIHPDqWxlY3Rpb24gZCd1biBncm91cGUgcG91ciBsZSBxdWl6XG4gICAgICAgICAgICBpbnB1dEdyb3VwLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlW1wiR3JvdXBJZFwiXS52YWx1ZT1cIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5wdXQ9aW5wdXRHcm91cC52YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYoZ3JvdXBJbnB1dC5sZW5ndGggPj0gY29uZmlnUXVlc3Rpb25uYWlyZXMuc2VhcmNoR3JvdXBzLm1pbmxlbmd0aClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhoclNlYXJjaEdyb3VwcyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMub3BlbihcIlBPU1RcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLmdyb3VwUm91dGVzK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnNlYXJjaEdyb3Vwc1JvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoR3JvdXBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBHcm91cC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGhlbHBHcm91cCwgXCJhXCIsIHJlc3BvbnNlW2ldLnRpdGxlLCBcIiNncm91cFwiK3Jlc3BvbnNlW2ldLmlkLCBbXCJpbmZvXCJdLCB7IGhyZWY6XCIjZ3JvdXBcIityZXNwb25zZVtpXS5pZCB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIiNncm91cFwiK3Jlc3BvbnNlW2ldLmlkKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRHcm91cC52YWx1ZT1yZXNwb25zZVtpXS50aXRsZStcIiAoXCIrcmVzcG9uc2VbaV0uaWQrXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmVbXCJHcm91cElkXCJdLnZhbHVlPXJlc3BvbnNlW2ldLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KHJlc3BvbnNlW2ldLm1heFJhbmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFJhbmtJbkdyb3VwLnZhbHVlPXJlc3BvbnNlW2ldLm1heFJhbmsrMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFua0luR3JvdXAudmFsdWU9MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwR3JvdXAuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aHJTZWFyY2hHcm91cHMuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICAgIHhoclNlYXJjaEdyb3Vwcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyU2VhcmNoR3JvdXBzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe3NlYXJjaEdyb3VwczogZ3JvdXBJbnB1dH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZSBsJ2Vudm9pIGR1IGZvcm11bGFpcmUgZGVzIGluZm9zIGRlIGJhc2UgZHUgcXVpelxuICAgICAgICAgICAgZm9ybVF1ZXN0aW9ubmFpcmUuYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBkaXZSZXNwb25zZS5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YXM9Z2V0RGF0YXNGcm9tSW5wdXRzKGZvcm1RdWVzdGlvbm5haXJlKTtcbiAgICAgICAgICAgICAgICBpZighaXNFbXB0eShkYXRhcy5yYW5rSW5Hcm91cCkgJiYgaXNFbXB0eShkYXRhcy5Hcm91cElkKSlcbiAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIG5lZWRHcm91cElmUmFuaywgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGlzRW1wdHkoZGF0YXMucmFua0luR3JvdXApICYmICFpc0VtcHR5KGRhdGFzLkdyb3VwSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMucmFua0luR3JvdXA9MTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeGhyUXVlc3Rpb25uYWlyZURhdGFzID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSAmJiAoZGF0YXMuZGVsZXRlT2shPT11bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJERUxFVEVcIiwgYXBpVXJsK2NvbmZpZ1F1ZXN0aW9ubmFpcmVzLnF1ZXN0aW9ubmFpcmVSb3V0ZXMrXCIvXCIrZGF0YXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFpc0VtcHR5KGRhdGFzLmlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5vcGVuKFwiUFVUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiK2RhdGFzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9wZW4oXCJQT1NUXCIsIGFwaVVybCtjb25maWdRdWVzdGlvbm5haXJlcy5xdWVzdGlvbm5haXJlUm91dGVzK1wiL1wiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMSAmJiByZXNwb25zZS5pZCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgYWRkT2tNZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXMuaWQ9cmVzcG9uc2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dOZXh0UXVlc3Rpb25uYWlyZXModXNlci50b2tlbik7Ly8gcGV1dCBhdm9pciDDqXZvbHXDqSBzdWl2YW50IGNlIHF1aSBzJ2VzdCBwYXNzw6lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5tZXNzYWdlICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkocmVzcG9uc2UubWVzc2FnZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlID0gcmVzcG9uc2UubWVzc2FnZS5qb2luKFwiPGJyPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSA9IHJlc3BvbnNlLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UmVzcG9uc2UsIFwicFwiLCByZXNwb25zZS5tZXNzYWdlLCBcIlwiLCBbXCJzdWNjZXNzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd05leHRRdWVzdGlvbm5haXJlcyh1c2VyLnRva2VuKTsvLyBwZXV0IGF2b2lyIMOpdm9sdcOpIHN1aXZhbnQgY2UgcXVpIHMnZXN0IHBhc3PDqVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHJlc3BvbnNlLmVycm9ycykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnMuam9pbihcIjxicj5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyA9IHNlcnZlckVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlJlc3BvbnNlLCBcInBcIiwgcmVzcG9uc2UuZXJyb3JzLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZSZXNwb25zZSwgXCJwXCIsIHNlcnZlckVycm9yLCBcIlwiLCBbXCJlcnJvclwiXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YXMuZGVsZXRlT2sgPT09IHVuZGVmaW5lZCAmJiByZXNwb25zZS5lcnJvcnMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Zvcm1RdWVzdGlvbm5haXJlSW5mb3MoZGF0YXMuaWQsIHVzZXIudG9rZW4pOy8vIG9uIGFjdHVhbGlzZSBsZXMgZG9ubsOpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5lcnJvcnMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1RdWVzdGlvbm5haXJlLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkxpbmtzLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZJbGx1c3RyYXRpb25zLmlubmVySFRNTD1cIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZRdWVzdGlvbnMuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgeGhyUXVlc3Rpb25uYWlyZURhdGFzLnNldFJlcXVlc3RIZWFkZXIoXCJBdXRob3JpemF0aW9uXCIsIFwiQmVhcmVyIFwiK3VzZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZihkYXRhcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHhoclF1ZXN0aW9ubmFpcmVEYXRhcy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGFzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtTGluay5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNlbmRMaW5rRm9ybSh1c2VyLnRva2VuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm9ybUlsbHVzdHJhdGlvbi5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNlbmRJbGx1c3RyYXRpb25Gb3JtKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3JtUXVlc3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBzZW5kUXVlc3Rpb25Gb3JtKHVzZXIudG9rZW4pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2Q3Jhc2gsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTtcbmhlbGxvRGV2KCk7IiwiLy8gRk9OQ1RJT05TIFVUSUxFUyBBVSBTVE9DS0FHRSBMT0NBTCAoU0VTU0lPTiwgQ09PS0lFUywgSU5ERVhEQiwgRVRDLilcbi8vIFJldmVuaXIgcG91ciBnw6lyZXIgbGUgY2FzIG/DuSBsb2NhbC5zdG9yYWdlIG4nZXN0IHBhcyBjb25udSBwb3VyIHV0aWxpc2VyIGNvb2tpZVxuICAgIFxuZXhwb3J0IGNvbnN0IHNhdmVMb2NhbHkgPSAobmFtZSwgZGF0YSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbHkgPSAobmFtZSwganNvbj1mYWxzZSkgPT5cbntcbiAgICBpZihqc29uKVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKSk7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVMb2NhbHkgPSAobmFtZSkgPT5cbntcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuYW1lKTtcbn0iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuLy8gRm9uY3Rpb24gYXNzb2NpYW50IGxlcyBhdHRyaWJ1dHMgZm91cm5pcyDDoCB1biBjaGFtcCBkZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgYWRkRWxlbWVudCA9IChlbHRQYXJlbnQsIGVsdFR5cGUsIGVsdENvbnRlbnQ9XCJcIiwgZWx0SWQ9XCJcIiwgZWx0Q2xhc3M9W10sIGVsdEF0dHJpYnV0ZXM9e30sIHJlcGxhY2U9dHJ1ZSkgPT5cbntcbiAgICBpZihpc0VtcHR5KGVsdFR5cGUpIHx8IGlzRW1wdHkoZWx0UGFyZW50KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2VcbiAgICB7XG4gICAgICAgIGNvbnN0IG5ld0VsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbHRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdElkKSkvLyB0ZXN0ZXIgc2kgbCdpZCBuJ2VzdCBwYXMgZMOpasOgIHV0aWxpc8OpIGRhbnMgbGUgRE9NID9cbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaWQ9ZWx0SWQ7XG5cbiAgICAgICAgaWYoQXJyYXkuaXNBcnJheShlbHRDbGFzcykgJiYgZWx0Q2xhc3MubGVuZ3RoIT0wKVxuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGkgaW4gZWx0Q2xhc3MpXG4gICAgICAgICAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKGVsdENsYXNzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHR5cGVvZiBlbHRBdHRyaWJ1dGVzID09PSBcIm9iamVjdFwiKSAvLyAhISB0b3VzIGxlcyBvYmpldHMgbmUgc29udCBwYXMgb2tcbiAgICAgICAge1xuICAgICAgICAgICAgZm9yKGxldCBhdHRyaWJ1dE5hbWUgaW4gZWx0QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dE5hbWUsIGVsdEF0dHJpYnV0ZXNbYXR0cmlidXROYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighaXNFbXB0eShlbHRDb250ZW50KSlcbiAgICAgICAgICAgIG5ld0VsZW1lbnQuaW5uZXJIVE1MPWVsdENvbnRlbnQucmVwbGFjZSgvXFxuL2csXCI8YnI+XCIpOy8vIGlubmVySFRNTCBwZXJtZXQgZCdham91dGVyIGR1IHRleHRlIGF5YW50IGx1aS1tw6ptZSBkZXMgYmFsaXNlcywgZXRjLlxuICAgICAgICAgICAgXG4gICAgICAgIGlmKHJlcGxhY2UpXG4gICAgICAgICAgICBlbHRQYXJlbnQuaW5uZXJIVE1MPVwiXCI7XG4gICAgICAgIGVsdFBhcmVudC5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9ICAgIFxufSIsIi8vIENlIHNjcmlwdCBmb3Vybml0IGRlcyBmb25jdGlvbnMgdXRpbGlzw6llcyBzdXIgdG91dGVzIGxlcyBwYWdlcyBkdSBzaXRlXG5cbmV4cG9ydCBjb25zdCBoZWxsb0RldiA9ICgpID0+XG57XG4gICAgY29uc29sZS5sb2coXCIqKioqIEhlbGxvIGFtaSBkw6l2ZWxvcHBldXIgOi0pXFxuXFxuTGUgY29kZSBkZSBXaWtpTGVybmkgZXN0IGxpYnJlIGV0IHZvdXMgcG91dmV6IGxlIHRyb3V2ZXIgc2kgR2l0bGFiIDpcXG5odHRwczovL2dpdGxhYi5jb20vbGVmYWJsYWIvd2lraWxlcm5pXFxuXFxuUG91ciBsZXMgc3VnZ2VzdGlvbnMgZCdhbcOpbGlvcmF0aW9uIG91IHF1ZXN0aW9ucyA6IGRldkB3aWxpbGVybmkuY29tICoqKipcIik7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY2NvdW50TGluayA9IChzdGF0dXMsIGNvbmZpZ1RlbXBsYXRlKSA9Plxue1xuICAgIGNvbnN0IGxpbms9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhY2NvdW50SGVhZExpbmtcIik7XG4gICAgY29uc3QgaG9tZVBhZ2U9c3RhdHVzK1wiSG9tZVBhZ2VcIjtcbiAgICBsaW5rLmhyZWY9XCIvXCIrY29uZmlnVGVtcGxhdGVbaG9tZVBhZ2VdO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBzZXRBdHRyaWJ1dGVzVG9JbnB1dHMgPSAoaW5wdXRzQ29uZiwgbXlGb3JtKSA9Plxue1xuICAgIGZvcihsZXQgaSBpbiBteUZvcm0uZWxlbWVudHMpXG4gICAge1xuICAgICAgICBpZighaXNFbXB0eShteUZvcm0uZWxlbWVudHNbaV0uaWQpKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgaWRJbnB1dD1teUZvcm0uZWxlbWVudHNbaV0uaWQ7XG4gICAgICAgICAgICBpZihpbnB1dHNDb25mW2lkSW5wdXRdIT09dW5kZWZpbmVkKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxldCBpbnB1dEhUTUw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRJbnB1dCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXR0cmlidXRlIGluIGlucHV0c0NvbmZbaWRJbnB1dF0pXG4gICAgICAgICAgICAgICAgICAgIGlucHV0SFRNTC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBpbnB1dHNDb25mW2lkSW5wdXRdW2F0dHJpYnV0ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBSw6ljdXDDqHJlIHRvdXRlcyBsZXMgdmFsZXVycyBkZSBjaGFtcHMgZW4gb21ldHRhbnQgbGVzIGNoZWNrYm94IG5vbiBjb2Now6llcywgZXRjLlxuZXhwb3J0IGNvbnN0IGdldERhdGFzRnJvbUlucHV0cyA9IChteUZvcm0pID0+XG57XG4gICAgY29uc3QgZGF0YXM9e307XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobXlGb3JtKTtcbiAgICBmb3IobGV0IGVudHJpZSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpXG4gICAgICAgZGF0YXNbZW50cmllWzBdXT1lbnRyaWVbMV07XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBWaWRlIHRvdXMgbGVzIGNoYW1wcyBkJ3VuIGZvcm11bGFpcmUsIHkgY29tcHJpcyBoaWRkZW4sIGNoZWNrYm94LCBldGMuXG4vLyBSZXZvaXIgcG91ciBsZXMgc2VsZWN0XG5leHBvcnQgY29uc3QgZW1weUZvcm0gPSAobXlGb3JtKSA9Plxue1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG15Rm9ybSk7XG4gICAgZm9yKGxldCBlbnRyaWUgb2YgZm9ybURhdGEuZW50cmllcygpKVxuICAgIHtcbiAgICAgICAgaWYobXlGb3JtLmVsZW1lbnRzW2VudHJpZVswXV0udHlwZT09XCJjaGVja2JveFwiIHx8IG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnR5cGU9PVwicmFkaW9cIilcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLmNoZWNrZWQ9ZmFsc2U7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG15Rm9ybS5lbGVtZW50c1tlbnRyaWVbMF1dLnZhbHVlPVwiXCI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gVmlkZSBldCBjYWNoZSBsZSBmb3JtdWxhaXJlXG5leHBvcnQgY29uc3QgZW1weUFuZEhpZGVGb3JtID0gKG15Rm9ybSkgPT5cbntcbiAgICBlbXB5Rm9ybShteUZvcm0pO1xuICAgIG15Rm9ybS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiByw6ljdXDDqXJhbnQgbGVzIHBhcmFtw6h0cmVzIHBhc3PDqXMgcGFyIGwndXJsXG5leHBvcnQgY29uc3QgZ2V0VXJsUGFyYW1zID0gKCkgPT5cbntcbiAgICBpZihpc0VtcHR5KGxvY2F0aW9uLnNlYXJjaCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KFwiJlwiKTtcbiAgICBpZighQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJzKSB8fCBwYXJhbWV0ZXJzLmxlbmd0aD09PTApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgbGV0IHBhcmFtLCBkYXRhcz17fTtcbiAgICBmb3IobGV0IGkgaW4gcGFyYW1ldGVycylcbiAgICB7XG4gICAgICAgIHBhcmFtID0gcGFyYW1ldGVyc1tpXS5zcGxpdChcIj1cIik7XG4gICAgICAgIGlmKHBhcmFtLmxlbmd0aD09PTIpXG4gICAgICAgICAgICBkYXRhc1twYXJhbVswXV09ZGVjb2RlVVJJKHBhcmFtWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufSIsImltcG9ydCB7IGFwaVVybCwgYXZhaWxhYmxlTGFuZ3MsIHNpdGVVcmwsIHRoZW1lIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy9pbnN0YW5jZS5qc1wiO1xuY29uc3QgbGFuZz1hdmFpbGFibGVMYW5nc1swXTtcblxuY29uc3QgY29uZmlnVGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vLi4vLi4vdmlld3MvXCIrdGhlbWUrXCIvY29uZmlnL1wiK2xhbmcrXCIuanNcIik7XG5cbmltcG9ydCB7ICBjaGVja0xvZ2luUm91dGUsIHRpbWVEaWZmZXJlbmNlTWF4LCB0aW1lRGlmZmVyZW5jZU1pbiwgdXNlclJvdXRlcyB9IGZyb20gXCIuLi8uLi8uLi9jb25maWcvdXNlcnMuanNcIjtcblxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHksIHNhdmVMb2NhbHkgfSBmcm9tIFwiLi9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSBcIi4uLy4uLy4uL3Rvb2xzL21haW5cIjtcblxuZXhwb3J0IGNvbnN0IGdldFRpbWVEaWZmZXJlbmNlID0gKCkgPT5cbntcbiAgICAvLyBtdWx0aXBsaWVyIHBhciAtMSwgY2FyIGMnZXN0IGNlIHF1J2lsIGZhdXQgXCJham91dGVyXCIgw6AgbCdoZXVyZSBVVEMgcG91ciByZXZlbmlyIGVuIGhldXJlIGxvY2FsZSBxdWkgbSdpbnTDqXJlc3NlIGV0IG5vbiBsJ2ludmVyc2VcbiAgICBjb25zdCB0aW1lTG9jYWw9bmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpKi0xO1xuICAgIGlmKHRpbWVMb2NhbCA+IHRpbWVEaWZmZXJlbmNlTWF4IHx8IHRpbWVMb2NhbCA8IHRpbWVEaWZmZXJlbmNlTWluKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiB0aW1lTG9jYWw7XG59XG5cbi8vIEondXRpbGlzZSBsZSBzdG9ja2FnZSBsb2NhbCBkdSBuYXZpZ2F0ZXVyIHBvdXIgZW5yZWdpc3RyZXIgbGVzIGRvbm7DqWVzIHBlcm1ldHRhbnQgZGUgcmVjb25uYcOudHJlIGwndXRpbGlzYXRldXIgcGFyIGxhIHN1aXRlXG4vLyBTZXVsIGxlIHNlcnZldXIgcG91cnJhIHbDqXJpZmllciBxdWUgbGVzIGlkZW50aWZpYW50cyBzb250ICh0b3Vqb3VycykgdmFsaWRlcy5cbmV4cG9ydCBjb25zdCBzZXRTZXNzaW9uID0gKHVzZXJJZCwgdG9rZW4sIGR1cmF0aW9uVFMpID0+XG57XG4gICAgY29uc3Qgc3RvcmFnZVVzZXI9XG4gICAge1xuICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvblRTXG4gICAgfVxuICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHN0b3JhZ2VVc2VyKTtcbn1cblxuLy8gVsOpcmlmaWUgcXUnaWwgeSBhIGRlcyBkb25uw6llcyBsb2NhbGVzIGNvbmNlcm5hbnQgbGUgcsOpc3VsdGF0IGQndW4gcXVpeiBvdSBkJ3VuIGdyb3VwZSBkZSBxdWl6c1xuLy8gRXQgbGVzIGFqb3V0ZSBhdXggZG9ubsOpZXMgZW52b3nDqWVzIHBhciBsZXMgZm9ybXVsYWlyZXMgZCdpbnNjcmlwdGlvbi9jb25uZXhpb24gc2kgYydlc3QgbGUgY2FzXG5leHBvcnQgY29uc3QgY2hlY2tBbnN3ZXJEYXRhcyA9IChkYXRhcykgPT5cbntcbiAgICBjb25zdCBsYXN0QW5zd2VyPWdldExvY2FseShcImxhc3RBbnN3ZXJcIik7XG4gICAgaWYoIWlzRW1wdHkobGFzdEFuc3dlcikpXG4gICAge1xuICAgICAgICBjb25zdCBhbnN3ZXI9SlNPTi5wYXJzZShsYXN0QW5zd2VyKTtcbiAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLmR1cmF0aW9uKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJDb3JyZWN0QW5zd2VycykgJiYgIWlzRW1wdHkoYW5zd2VyLm5iUXVlc3Rpb25zKSAmJiAoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkgfHwgIWlzRW1wdHkoYW5zd2VyLkdyb3VwSWQpKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZGF0YXMuZHVyYXRpb249YW5zd2VyLmR1cmF0aW9uO1xuICAgICAgICAgICAgZGF0YXMubmJDb3JyZWN0QW5zd2Vycz1hbnN3ZXIubmJDb3JyZWN0QW5zd2VycztcbiAgICAgICAgICAgIGRhdGFzLm5iUXVlc3Rpb25zPWFuc3dlci5uYlF1ZXN0aW9ucztcbiAgICAgICAgICAgIGlmKCFpc0VtcHR5KGFuc3dlci5RdWVzdGlvbm5haXJlSWQpKVxuICAgICAgICAgICAgICAgIGRhdGFzLlF1ZXN0aW9ubmFpcmVJZD1hbnN3ZXIuUXVlc3Rpb25uYWlyZUlkO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGRhdGFzLkdyb3VwSWQ9YW5zd2VyLkdyb3VwSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFzO1xufVxuXG4vLyBDZXR0ZSBmb25jdGlvbiB0ZXN0ZSBsYSBjb25uZXhpb24gZGUgbCd1dGlsaXNhdGV1ciBkJ3VuZSBwYWdlXG4vLyBPbiBwZXV0IGZvdXJuaXMgdW5lIGxpc3RlIGRlIHN0YXR1dHMgYWNjZXB0w6lzIChzaSB2aWRlID0gdG91cyksIGFpbnNpIHF1J3VuZSB1cmwgZGUgcmVkaXJlY3Rpb24gc2kgbm9uIGNvbm5lY3TDqSwgdW4gbWVzc2FnZSBkJ2VycmV1ciDDoCBhZmZpY2hlciBzdXIgbGEgcGFnZSBkZSBkZXN0aW5hdGlvbiBldCBsJ3VybCBzdXIgbGFxdWVsbGUgcmV2ZW5pciB1bmUgZm9pcyBjb25uZWN0w6lcbmV4cG9ydCBjb25zdCBjaGVja1Nlc3Npb24gPSBhc3luYyAoc3RhdHVzPVtdLCB1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKSA9Plxue1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIHtcbiAgICAgICAgY29uc3QgdXNlckRhdGFzPWdldExvY2FseShcInVzZXJcIik7XG4gICAgICAgIGlmKGlzRW1wdHkodXNlckRhdGFzKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPUpTT04ucGFyc2UodXNlckRhdGFzKTtcbiAgICAgICAgICAgIGlmKGlzRW1wdHkodXNlci5pZCkgfHzCoGlzRW1wdHkodXNlci50b2tlbikgfHwgaXNFbXB0eSh1c2VyLmR1cmF0aW9uKSB8fCB1c2VyLmR1cmF0aW9uIDwgRGF0ZS5ub3coKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytjaGVja0xvZ2luUm91dGUrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9ICgpID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCAmJiByZXNwb25zZS5pc1ZhbGlkICYmIHJlc3BvbnNlLmlkICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UuaWQ9PT11c2VyLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubmFtZT1yZXNwb25zZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubGFuZ3VhZ2U9cmVzcG9uc2UubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci50aW1lRGlmZmVyZW5jZT1yZXNwb25zZS50aW1lRGlmZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnN0YXR1cz1yZXNwb25zZS5zdGF0dXM7Ly8gYydlc3QgbGUgdG9rZW4gcXVpIHNlcnQgw6AgdsOpcmlmaWVyIGxlIHN0YXR1dCDDoCBjaGFxdWUgcmVxdcOqdGUgw6AgbCdBUElcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlTG9jYWx5KFwidXNlclwiLCB1c2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaSBpbCBzJ2FnaXQgZCd1biBcInVzZXJcIiBldCBxdWUgc29uIGFib25uZW1lbnQgYSBleHBpcsOpLCBqZSBsZSByZWRpcmlnZSB2ZXJzIGxhIGNhaXNzZSA6LSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5zdGF0dXM9PT1cInVzZXJcIiAmJiByZXNwb25zZS5uYkRheXNPayA8PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQWNjb3VudD1zaXRlVXJsK1wiL1wiK2NvbmZpZ1RlbXBsYXRlLmFjY291bnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKHVybEFjY291bnQpPT09LTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKFwiL1wiK2NvbmZpZ1RlbXBsYXRlLmFjY291bnRQYWdlK1wiI3N1YnNjcmliZVwiKTsvLyBwYXNzw6llIGRpcmVjdGVtZW50IGljaSwgbCdhbmNyZSAjc3Vic2NyaWJlIG5lIGZvbmN0aW9ubmUgcGFzICE/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cy5sZW5ndGghPT0wICYmIHN0YXR1cy5pbmRleE9mKHJlc3BvbnNlLnN0YXR1cyk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIENldHRlIGZvbmN0aW9uIHNlcnQgw6AgbGEgcHLDqWPDqWRlbnRlIGVuIGNhcyBkZSBjb25uZXhpb24gbm9uIHZhbGlkZVxuY29uc3QgcmVkaXJlY3RVc2VyID0gKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgaWYoIWlzRW1wdHkobWVzc2FnZSkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJtZXNzYWdlXCIsIG1lc3NhZ2UpO1xuICAgIGlmKCFpc0VtcHR5KHVybFdhbnRlZCkpXG4gICAgICAgIHNhdmVMb2NhbHkoXCJ1cmxcIiwgdXJsV2FudGVkKTtcbiAgICBpZighaXNFbXB0eSh1cmxSZWRpcmVjdGlvbikpXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odXJsUmVkaXJlY3Rpb24pO1xufSJdLCJzb3VyY2VSb290IjoiIn0=