1487 lines
203 KiB
JavaScript
1487 lines
203 KiB
JavaScript
/******/ (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/homeManager.js");
|
||
/******/ })
|
||
/************************************************************************/
|
||
/******/ ({
|
||
|
||
/***/ "../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/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 ^\\.\\/.*\\/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/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 : « L’homme 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 l’article 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. C’est toujours <b>le contenu de l’article Wikipédia qui fait foi</b> concernant les « bonnes » réponses. C’est une façon de tester à la fois votre capacité d’attention et votre mémoire. Les articles de Wikipédia peuvent évoluer, donc n’hésitez pas <a href='/contact.html'>à me signaler une erreur</a>.</p><p><b>WikiLerni vous propose d’autres 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 d’articles est <b>suivie d’un 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>L’inscription 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/homeManager.js":
|
||
/*!****************************!*\
|
||
!*** ./src/homeManager.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 _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 _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config/questionnaires.js */ "../config/questionnaires.js");
|
||
/* harmony import */ var _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__);
|
||
/* harmony import */ var _tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tools/clientstorage.js */ "./src/tools/clientstorage.js");
|
||
/* harmony import */ var _tools_dom_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./tools/dom.js */ "./src/tools/dom.js");
|
||
/* harmony import */ var _tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./tools/everywhere.js */ "./src/tools/everywhere.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../tools/main */ "../tools/main.js");
|
||
/* harmony import */ var _tools_main__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_tools_main__WEBPACK_IMPORTED_MODULE_6__);
|
||
/* 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); }); }; }
|
||
|
||
// -- PAGE D'ACCUEIL POUR LES GESTIONNAIRES
|
||
/// 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, on récupère les stats générales et des dernières 24H et les affiche
|
||
/// On liste ensuite les prochains quizs devant être publiés en faisant ressortir ceux devant être complétés + la prochaine date sans quiz
|
||
/// Un menu permet à l'utilisateur d'accéder aux formulaires permettant de gérer les quizs et les comptes utilisateurs et abonnements
|
||
/// Un message venant d'une autre page peut aussi être à afficher lors du premier chargement.
|
||
/// Temporairement, c'est ici aussi que l'on peut régénérer tout le HTML -> à terme dans homeAdmin !
|
||
// Fichier de configuration côté client :
|
||
|
||
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"); // Fonctions utiles au script :
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// Dictionnaires :
|
||
|
||
var _require = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/general$")("./" + lang + "/general"),
|
||
notAllowed = _require.notAllowed,
|
||
serverError = _require.serverError,
|
||
statsAdmin = _require.statsAdmin;
|
||
|
||
var _require2 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/questionnaire$")("./" + lang + "/questionnaire"),
|
||
nextDateWithoutQuestionnaire = _require2.nextDateWithoutQuestionnaire,
|
||
nextQuestionnairesList = _require2.nextQuestionnairesList,
|
||
questionnaireNeedBeCompleted = _require2.questionnaireNeedBeCompleted;
|
||
|
||
var _require3 = __webpack_require__("../lang sync recursive ^\\.\\/.*\\/user$")("./" + lang + "/user"),
|
||
welcomeMessage = _require3.welcomeMessage; // Principaux éléments du DOM manipulés :
|
||
|
||
|
||
var divMain = document.getElementById("main-content");
|
||
var divCrash = document.getElementById("crash");
|
||
var divMessage = document.getElementById("message");
|
||
var divQuestionnaires = document.getElementById("questionnaires");
|
||
var btnRegenerate = document.getElementById("wantRegenerate");
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__["helloDev"])();
|
||
|
||
var initialise = /*#__PURE__*/function () {
|
||
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
||
var isConnected, user, xhrStats, xhrNextQuestionnaires;
|
||
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: notAllowed,
|
||
color: "error"
|
||
});
|
||
|
||
case 3:
|
||
isConnected = _context.sent;
|
||
|
||
if (isConnected) {
|
||
user = Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["getLocaly"])("user", true);
|
||
Object(_tools_everywhere_js__WEBPACK_IMPORTED_MODULE_5__["updateAccountLink"])(user.status, configTemplate);
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divMessage, "h2", welcomeMessage.replace("#NAME", user.name));
|
||
divMain.style.display = "block";
|
||
|
||
if (!Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["isEmpty"])(Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["getLocaly"])("message"))) {
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divMessage, "p", Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["getLocaly"])("message", true).message, "", [Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["getLocaly"])("message", true).color], "", false);
|
||
Object(_tools_clientstorage_js__WEBPACK_IMPORTED_MODULE_3__["removeLocaly"])("message");
|
||
} // Les stats sur les comptes utilisateurs :
|
||
|
||
|
||
xhrStats = new XMLHttpRequest();
|
||
xhrStats.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__["getAdminStats"]);
|
||
|
||
xhrStats.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
|
||
if (this.status === 200) {
|
||
var mapText = {
|
||
NB_USERS_24H: response.nbNewUsers24H,
|
||
NB_SUBSCRIPTIONS_24H: response.Subscriptions.nbSubscriptions24H,
|
||
NB_USERS_DELETED_24H: response.nbDeletedUsers24H,
|
||
NB_ANSWERS_24H: response.Answers.nbAnswers24H,
|
||
NB_USERS_TOT: response.nbNewUsersTot,
|
||
NB_SUBSCRIPTIONS_TOT: response.Subscriptions.nbSubscriptionsTot,
|
||
NB_SUBSCRIPTIONS_PREMIUM: response.Subscriptions.nbSubscriptionsPremium,
|
||
NB_ANSWERS_TOT: response.Answers.nbAnswersTot,
|
||
NB_USERS_DELETED_TOT: response.nbDeletedUsersTot,
|
||
NB_USERS_DELETED_VALIDED: response.nbDeletedUsersWasValided,
|
||
NB_USERS_DELETED_PREMIUM: response.nbDeletedUsersTotWasPremium
|
||
};
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divMessage, "p", Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["replaceAll"])(statsAdmin, mapText), "", "", "", false);
|
||
}
|
||
}
|
||
};
|
||
|
||
xhrStats.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrStats.send(); // Les questionnaires bientôt publiés :
|
||
|
||
xhrNextQuestionnaires = new XMLHttpRequest();
|
||
xhrNextQuestionnaires.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__["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_6__["dateFormat"])(response.questionnaires[i].datePublishing, _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]) + ": <a href='" + configTemplate.questionnairesManagementPage + "?id=" + 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_4__["addElement"])(divQuestionnaires, "h2", nextQuestionnairesList.replace("#NB", response.questionnaires.length));
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divQuestionnaires, "h4", nextDateWithoutQuestionnaire + Object(_tools_main__WEBPACK_IMPORTED_MODULE_6__["dateFormat"])(response.dateNeeded, _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["availableLangs"][0]), "", ["info"], "", false);
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divQuestionnaires, "ul", listHTML, "", "", "", false);
|
||
}
|
||
}
|
||
};
|
||
|
||
xhrNextQuestionnaires.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrNextQuestionnaires.send(); // Traitement demande régénérer HTML
|
||
|
||
btnRegenerate.addEventListener("click", function (e) {
|
||
e.preventDefault();
|
||
var xhrRegenerate = new XMLHttpRequest();
|
||
xhrRegenerate.open("GET", _config_instance_js__WEBPACK_IMPORTED_MODULE_0__["apiUrl"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__["questionnaireRoutes"] + _config_questionnaires_js__WEBPACK_IMPORTED_MODULE_2__["regenerateHTML"]);
|
||
|
||
xhrRegenerate.onreadystatechange = function () {
|
||
if (this.readyState == XMLHttpRequest.DONE) {
|
||
var response = JSON.parse(this.responseText);
|
||
if (this.status === 200 && response.message != undefined) Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divMessage, "p", response.message, "", ["success"], "", false);else Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divMessage, "p", serverError, "", ["error"], "", false);
|
||
}
|
||
};
|
||
|
||
xhrRegenerate.setRequestHeader("Content-Type", "application/json");
|
||
xhrRegenerate.setRequestHeader("Authorization", "Bearer " + user.token);
|
||
xhrRegenerate.send();
|
||
});
|
||
}
|
||
|
||
_context.next = 11;
|
||
break;
|
||
|
||
case 7:
|
||
_context.prev = 7;
|
||
_context.t0 = _context["catch"](0);
|
||
Object(_tools_dom_js__WEBPACK_IMPORTED_MODULE_4__["addElement"])(divCrash, "p", serverError, "", ["error"]);
|
||
console.error(_context.t0);
|
||
|
||
case 11:
|
||
case "end":
|
||
return _context.stop();
|
||
}
|
||
}
|
||
}, _callee, null, [[0, 7]]);
|
||
}));
|
||
|
||
return function initialise() {
|
||
return _ref.apply(this, arguments);
|
||
};
|
||
}();
|
||
|
||
initialise();
|
||
|
||
/***/ }),
|
||
|
||
/***/ "./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/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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4uL2NvbmZpZy9pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzIiwid2VicGFjazovLy8uLi9jb25maWcvdXNlcnMuanMiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcgc3luYyBeXFwuXFwvLipcXC9nZW5lcmFsJCIsIndlYnBhY2s6Ly8vLi4vbGFuZyBzeW5jIF5cXC5cXC8uKlxcL3F1ZXN0aW9ubmFpcmUkIiwid2VicGFjazovLy8uLi9sYW5nIHN5bmMgXlxcLlxcLy4qXFwvdXNlciQiLCJ3ZWJwYWNrOi8vLy4uL2xhbmcvZnIvZ2VuZXJhbC5qcyIsIndlYnBhY2s6Ly8vLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzIiwid2VicGFjazovLy8uLi9sYW5nL2ZyL3VzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL3Rvb2xzL21haW4uanMiLCJ3ZWJwYWNrOi8vLy4uL3ZpZXdzIHN5bmMgXlxcLlxcLy4qXFwuanMkIiwid2VicGFjazovLy8uLi92aWV3cy9kZWZhdWx0L2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi4vdmlld3Mvd2lraWxlcm5pL2NvbmZpZy9mci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaG9tZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2NsaWVudHN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Rvb2xzL2RvbS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvZXZlcnl3aGVyZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdG9vbHMvdXNlcnMuanMiXSwibmFtZXMiOlsidXNlcnMiLCJyZXF1aXJlIiwicXVlc3Rpb25uYWlyZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXBpVXJsIiwic2l0ZVVybCIsImFkbWluTmFtZSIsImFkbWluRW1haWwiLCJzZW5kZXJOYW1lIiwic2VuZGVyRW1haWwiLCJhZG1pbkxhbmciLCJ0aGVtZSIsImF2YWlsYWJsZUxhbmdzIiwic2l0ZU5hbWUiLCJiZWdpbkNvZGVHb2RmYXRoZXIiLCJkZWZhdWx0UmVjZWlwdERheXMiLCJjcm9uVGltaW5nQWxlcnRJblNlY29uZGUiLCJyZXNwb25zZVRpbWluZ0FsZXJ0SW5TZWNvbmRlIiwidG9rZW5TaWdudXBWYWxpZGF0aW9uVGltZUluSG91cnMiLCJ0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzIiwidG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VycyIsInRva2VuQ29ubmV4aW9uTWF4VGltZUluRGF5cyIsInRva2VuTG9naW5DaGFuZ2luZ1RpbWVJbkhvdXJzIiwidG9rZW5EZWxldGVVc2VyVGltZUluSG91cnMiLCJ0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXMiLCJmcmVlQWNjb3VudFRpbWluZ0luRGF5cyIsImZyZWVBY2NvdW50RXhwaXJhdGlvbk5vdGlmaWNhdGlvbkluRGF5cyIsImFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXMiLCJhY2NvdW50RXhwaXJhdGlvblNlY29uZE5vdGlmaWNhdGlvbkluRGF5cyIsImluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5cyIsIm5iUXVlc3Rpb25zTWluIiwibmJRdWVzdGlvbnNNYXgiLCJuYkNob2ljZXNNYXgiLCJuYk5ld1F1ZXN0aW9ubmFpcmVzIiwiaG91ckdpdmVOZXdRdWVzdGlvbm5haXJlQmVnaW4iLCJob3VyR2l2ZU5ld1F1ZXN0aW9ubmFpcmVFbmQiLCJtYXhRdWVzdGlvbm5haXJlU2VuZGVkQXRTYW1lVGltZSIsIm1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzIiwiZmllbGROZXdRdWVzdGlvbm5haXJlcyIsIm5iUXVlc3Rpb25uYWlyZXNCeUdyb3VwTWluIiwibmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXgiLCJuYklsbHVzdHJhdGlvbnNNaW4iLCJuYklsbHVzdHJhdGlvbnNNYXgiLCJtYXhJbGx1c3RyYXRpb25TaXplaW5PY3RldCIsIm1pbWVUeXBlc0ZvcklsbHVzdHJhdGlvbiIsImlsbHVzdHJhdGlvbnNXaWR0aE1heEluUHgiLCJpbGx1c3RyYXRpb25zTWluaWF0dXJlc1dpZHRoTWF4SW5QeCIsIm5iTGlua3NNaW4iLCJuYkxpbmtzTWF4IiwicGFzc3dvcmQiLCJtaW5sZW5ndGgiLCJkaXJDYWNoZVVzZXJzIiwiZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMiLCJkaXJDYWNoZVF1ZXN0aW9ubmFpcmVzIiwiZGlyQ2FjaGVRdWVzdGlvbnMiLCJkaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMiLCJkaXJIVE1MUXVlc3Rpb25uYWlyZXMiLCJkaXJXZWJRdWVzdGlvbm5haXJlcyIsInF1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJnZXRMaXN0TmV4dFF1ZXN0aW9ubmFpcmVzIiwiZ2V0UXVlc3Rpb25uYWlyZVJvdXRlcyIsImdldFJhbmRvbVF1ZXN0aW9ubmFpcmVzUm91dGUiLCJnZXRTdGF0c1F1ZXN0aW9ubmFpcmVzIiwicHJldmlld1F1ZXN0aW9ubmFpcmVSb3V0ZXMiLCJwdWJsaXNoZWRRdWVzdGlvbm5haXJlUm91dGVzIiwicmVnZW5lcmF0ZUhUTUwiLCJzZWFyY2hBZG1pblF1ZXN0aW9ubmFpcmVzUm91dGUiLCJzZWFyY2hRdWVzdGlvbm5haXJlc1JvdXRlIiwiZ3JvdXBSb3V0ZXMiLCJnZXRHcm91cFJvdXRlIiwicHJldmlld0dyb3VwUm91dGVzIiwic2VhcmNoR3JvdXBzUm91dGUiLCJxdWVzdGlvbnNSb3V0ZSIsInRhZ3NTZWFyY2hSb3V0ZSIsImdldEFkbWluU3RhdHMiLCJnZXRQcmV2aW91c0Fuc3dlcnMiLCJnZXRTdGF0c0Fuc3dlcnMiLCJzYXZlQW5zd2Vyc1JvdXRlIiwiUXVlc3Rpb25uYWlyZSIsInRpdGxlIiwibWF4bGVuZ3RoIiwicmVxdWlyZWQiLCJzbHVnIiwiaW50cm9kdWN0aW9uIiwic2VhcmNoUXVlc3Rpb25uYWlyZXMiLCJHcm91cCIsIlF1ZXN0aW9uIiwidGV4dCIsInJhbmsiLCJtaW4iLCJkZWZhdWx0VmFsdWUiLCJDaG9pY2UiLCJzZWFyY2giLCJzZWFyY2hHcm91cHMiLCJkaXJDYWNoZUdyb3VwcyIsImRpckNhY2hlVGFncyIsImRpckhUTUxHcm91cHMiLCJkaXJIVE1MTmV3cyIsImRpckhUTUxUYWdzIiwiZGlyV2ViR3JvdXBzIiwiZGlyV2ViTmV3cyIsImRpcldlYlRhZ3MiLCJuYlJhbmRvbVJlc3VsdHMiLCJuYlRhZ3NNaW4iLCJuYlRhZ3NNYXgiLCJ1c2VyUm91dGVzIiwiY2hlY2tEZWxldGVMaW5rUm91dGUiLCJjaGVja0lmSXNFbWFpbGZyZWVSb3V0ZSIsImNoZWNrTG9naW5Sb3V0ZSIsImNoZWNrTmV3TG9naW5MaW5rUm91dGUiLCJjaGVja1N1YnNjcmliZVRva2VuUm91dGUiLCJjb25uZWN0aW9uUm91dGUiLCJjb25uZWN0aW9uV2l0aExpbmtSb3V0ZSIsImNyZWF0ZVVzZXJSb3V0ZSIsImdldEdvZENoaWxkcyIsImdldEdvZGZhdGhlclJvdXRlIiwiZ2V0TG9naW5MaW5rUm91dGUiLCJnZXRQYXltZW50cyIsImdldFVzZXJJbmZvcyIsImdldFVzZXJzUXVlc3Rpb25uYWlyZXNSb3V0ZSIsInNlYXJjaFVzZXJSb3V0ZSIsInNpZ251cENvbXBsZXRpb25Sb3V0ZSIsInN1YnNjcmliZVJvdXRlIiwidW5zdWJzY3JpYmVSb3V0ZSIsInVwZGF0ZVVzZXJJbmZvcyIsInZhbGlkYXRlVXNlclJvdXRlIiwibmFtZSIsImVtYWlsIiwibmV3UGFzc3dvcmQiLCJjb2RlR29kZmF0aGVyIiwiY2d1T2siLCJ2YWx1ZSIsInRpbWVEaWZmZXJlbmNlTWluIiwidGltZURpZmZlcmVuY2VNYXgiLCJkaXJDYWNoZVVzZXJzV2l0aG91dEFuc3dlcnMiLCJhZGRCdG5UeHQiLCJhZGRPa01lc3NhZ2UiLCJhbGVydE5ld1dpbmRvdyIsImJhZFVybCIsImJ0bkxpbmtUb1F1ZXN0aW9ubmFpcmUiLCJidG5Qcm9wb3NlQ29ubmVjdGlvbiIsImJ0blByb3Bvc2VTdWJzY3JpYmUiLCJidG5TaG93T25XZWJTaXRlIiwiZGVsZXRlQnRuVHh0IiwiZGVsZXRlRmFpbE1lc3NhZ2UiLCJkZWxldGVPa01lc3NhZ2UiLCJmYWlsQXV0aCIsImZhaWxBdXRoQ3JvbiIsImZhaWxBdXRoSGVhZGVyIiwiZmFpbEF1dGhJZCIsImZhaWxBdXRoVG9rZW4iLCJuZWVkZWRQYXJhbXMiLCJuZXh0UGFnZSIsIm5vdEFsbG93ZWQiLCJub3RSZXF1aXJlZCIsIm5vdFZhbGlkRm9ybWF0IiwicHJldmlvdXNQYWdlIiwic2VydmVyRXJyb3IiLCJzZXJ2ZXJFcnJvckFkbWluIiwic2l0ZUhUTUxUaXRsZSIsInNpdGVNZXRhRGVzY3JpcHRpb24iLCJzY3JpcHRUaW1pbmdBbGVydCIsInNjcmlwdFRpbWluZ0luZm8iLCJzdGF0c0FkbWluIiwic3Vic2NyaXB0aW9uQ2FsbCIsInVwZGF0ZUJ0blR4dCIsInVwZGF0ZU9rTWVzc2FnZSIsImJ0blNlbmRSZXNwb25zZSIsImJ0blNoYXJlUXVpelR4dCIsImJ0blNoYXJlUXVpek1haWxCb2R5IiwiYnRuU2hvd1F1ZXN0aW9ubmFpcmUiLCJjb3JyZWN0QW5zd2VyVHh0IiwiZXN0aW1hdGVkVGltZSIsImVzdGltYXRlZFRpbWVPcHRpb24iLCJzaG9ydCIsIm1lZGl1bSIsImxvbmciLCJleHBsYW5hdGlvbkJlZm9yZVR4dCIsImhhdmVCZWVuUHVibGlzaGVkIiwiaGF2ZUJlZW5SZWdlbmVyYXRlZCIsImxhc3RVcGRhdGVkIiwibGlua0dvVG9OZXh0RWxlbWVudCIsImxpbmtHb1RvUXVpeiIsIm5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGUiLCJuZWVkRXN0aW1hdGVkVGltZSIsIm5lZWRHcm91cElmUmFuayIsIm5lZWRJbnRyb2R1Y3Rpb24iLCJuZWVkS25vd0lmSXNQdWJsaXNoZWQiLCJuZWVkTGFuZ3VhZ2UiLCJuZWVkTm90VG9vTG9uZ1RpdGxlIiwibmVlZE51bWJlckZvclJhbmsiLCJuZWVkVGl0bGUiLCJuZWVkVW5pcXVlVXJsIiwibmVlZFVybCIsIm5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmUiLCJuZXh0UXVlc3Rpb25uYWlyZXNMaXN0IiwicXVlc3Rpb25uYWlyZXNOYW1lIiwicXVlc3Rpb25uYWlyZU5lZWRCZUNvbXBsZXRlZCIsInB1Ymxpc2hlZEF0IiwicHVibGlzaGVkQnkiLCJzZWFyY2hRdWVzdGlvbm5haXJlUmVzdWx0VGl0bGUiLCJzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0Iiwic2VhcmNoUXVlc3Rpb25uYWlyZVdpdGhSZXN1bHQiLCJ3cm9uZ0Fuc3dlclR4dCIsImFscmVhZHlDb25uZWN0ZWQiLCJiYWRMaW5rVmFsaWRhdGlvbk1lc3NhZ2UiLCJiYWRQYXNzd29yZCIsImJ5ZWJ5ZU1lc3NhZ2UiLCJjb25uZWN0aW9uT2siLCJjcmVhdGlvbk9rTWVzc2FnZSIsImNyb25EZWxldGVVbnZhbGlkZWRVc2Vyc01lc3NhZ2UiLCJkZWxldGVJbmFjdGl2ZVVzZXJzTWVzc2FnZSIsImVtYWlsTm90Rm91bmQiLCJmb3Jtc0VtYWlsTGFiZWwiLCJmb3Jtc0VtYWlsUGxhY2Vob2xkZXIiLCJmb3Jtc0NHVU9rTGFiZWwiLCJmb3Jtc1N1Ym1pdFR4dCIsImdvZGZhdGhlckZvdW5kIiwiZ29kZmF0aGVyTm90Rm91bmQiLCJpbmZvc0FkbWluR29kZmF0aGVyIiwiaW5mb3NBZG1pbk5iR29kQ2hpbGRzIiwiaW5mb3NVc2VyRm9yQWRtaW4iLCJpbmZvc1VzZXJOYkdvZENoaWxkcyIsImluZm9zVXNlck5vR29kY2hpbGRzIiwibWFpbERlbGV0ZUJvZHlIVE1MIiwibWFpbERlbGV0ZUJvZHlUeHQiLCJtYWlsRGVsZXRlTGlua0FscmVhZHlNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtGYWlsTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rTWVzc2FnZSIsIm1haWxEZWxldGVMaW5rT2tNZXNzYWdlIiwibWFpbERlbGV0ZUxpbmtUeHQiLCJtYWlsRGVsZXRlU3ViamVjdCIsIm1haWxMb2dpbkxpbmtCb2R5SFRNTCIsIm1haWxMb2dpbkxpbmtCb2R5VHh0IiwibWFpbExvZ2luTGlua01lc3NhZ2UiLCJtYWlsTG9naW5MaW5rU3ViamVjdCIsIm1haWxMb2dpbkxpbmtUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJCb2R5SFRNTCIsIm1haWxUaGFua0dvZGZhdGhlckJvZHlUeHQiLCJtYWlsVGhhbmtHb2RmYXRoZXJMaW5rVHh0IiwibWFpbFRoYW5rR29kZmF0aGVyU3ViamVjdCIsIm1haWxVcGRhdGVMb2dpbkJvZHlIVE1MIiwibWFpbFVwZGF0ZUxvZ2luQm9keVR4dCIsIm1haWxVcGRhdGVMb2dpbkxpbmtNZXNzYWdlIiwibWFpbFVwZGF0ZUxvZ2luTGlua1R4dCIsIm1haWxVcGRhdGVMb2dpbk9rTWVzc2FnZSIsIm1haWxVcGRhdGVMb2dpblN1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keUhUTUwiLCJtYWlsVmFsaWRhdGlvbkxpbmtTQm9keVR4dCIsIm1haWxWYWxpZGF0aW9uTGlua1N1YmplY3QiLCJtYWlsVmFsaWRhdGlvbkxpbmtUeHQiLCJtYWlsVmFsaWRhdGlvbk1lc3NhZ2UiLCJtYWlsV2VsY29tZUJvZHlIVE1MIiwibWFpbFdlbGNvbWVCb2R5VHh0IiwibWFpbFdlbGNvbWVMaW5rVHh0IiwibWFpbFdlbGNvbWVTdWJqZWN0IiwibmVlZEJlQ29ubmVjdGVkIiwibmVlZENob29zZUxvZ2luV2F5IiwibmVlZEVtYWlsIiwibmVlZEtub3dOZXdzbGV0dGVyT2siLCJuZWVkTG9uZ1Bhc3NXb3JkIiwibmVlZE1heFRpbWVEaWZmZXJlbmNlIiwibmVlZE1pblRpbWVEaWZmZXJlbmNlIiwibmVlZE5hbWUiLCJuZWVkTm90VG9vTG9uZ05hbWUiLCJuZWVkTm90VG9vTG9uZ0VtYWlsIiwibmVlZFBhc3NXb3JkIiwibmVlZFNNVFAiLCJuZWVkU01UUE5vdEZvdW5kIiwibmVlZFN0YXR1cyIsIm5lZWRUaW1lRGlmZmVyZW5jZSIsIm5lZWRVR0NPayIsIm5lZWRVbmlxdWVFbWFpbCIsIm5lZWRWYWxpZGF0aW9uVG9Mb2dpbiIsIm5lZWRWYWxpZExhc3RDb25uZWN0aW9uRGF0ZSIsInBhc3N3b3JkQ29waWVkIiwic2VhcmNoVXNlcnNXaXRob3V0UmVzdWx0IiwidG9vTWFueUxvZ2luRmFpbHMiLCJ1cGRhdGVkRmFpbGVkR29kZmF0aGVyTm90Rm91bmQiLCJ1cGRhdGVkTmVlZEdvb2RFbWFpbCIsInVwZGF0ZWROZWVkR29vZEdvZGZhdGhlciIsInVwZGF0ZWROZWVkVW5pcXVlRW1haWwiLCJ1cGRhdGVkTmVlZFZhbGlkYXRlZFVzZXIiLCJ1cGRhdGVkT2tNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlIiwidmFsaWRhdGlvbkFscmVhZHlNZXNzYWdlQWRtaW4iLCJ2YWxpZGF0aW9uTWVzc2FnZSIsInZhbGlkYXRpb25NZXNzYWdlQWRtaW4iLCJ3ZWxjb21lTWVzc2FnZSIsIlRvb2wiLCJteVZhciIsInVuZGVmaW5lZCIsInRyaW0iLCJteVN0cmluZyIsImlzRW1wdHkiLCJtYXgiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJtYXBPYmoiLCJyZXBsYWNlRWx0cyIsIlJlZ0V4cCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwicmVwbGFjZSIsIm1hdGNoZWQiLCJNYXRoIiwiY2VpbCIsImZsb29yIiwicmFuZG9tIiwiZGF0ZVN0cmluZyIsImxhbmciLCJteURhdGUiLCJEYXRlIiwibXlEYXkiLCJnZXREYXRlIiwibXlNb3VudGgiLCJnZXRNb250aCIsIm15WWVhciIsImdldEZ1bGxZZWFyIiwibmJDYXJNaW4iLCJuYkNhck1heCIsIm5iQ2FyIiwibGV0dGVycyIsIm90aGVycyIsImkiLCJoZWFkTGlua3MiLCJhbmNob3IiLCJhdHRyaWJ1dGVzIiwiaHJlZiIsImlkIiwiZm9vdExpbmtzIiwicmVsIiwibWF4UXVlc3Rpb25uYWlyZXNCeVBhZ2UiLCJ1c2VySG9tZVBhZ2UiLCJhZG1pbkhvbWVQYWdlIiwibWFuYWdlckhvbWVQYWdlIiwic3Vic2NyaWJlUGFnZSIsImNvbm5lY3Rpb25QYWdlIiwiYWNjb3VudFBhZ2UiLCJxdWVzdGlvbm5haXJlc01hbmFnZW1lbnRQYWdlIiwidXNlcnNNYW5hZ2VtZW50UGFnZSIsIm5iUXVlc3Rpb25uYWlyZXNVc2VySG9tZVBhZ2UiLCJpbGx1c3RyYXRpb25EaXIiLCJzaXRlU2xvZ2FuIiwiaG9tZVRpdGxlMSIsImhvbWVQMSIsImhvbWVUaXRsZTIiLCJob21lUDIiLCJuZXdRdWVzdGlvbm5haXJlc1RpdGxlIiwibmV3UXVlc3Rpb25uYWlyZXNJbnRybyIsImV4cGxhbmF0aW9uVGl0bGUiLCJleHBsYW5hdGlvblR4dCIsIm5vSlNOb3RpZmljYXRpb24iLCJ0YWdzTGlzdFR4dCIsImFib3V0UGFnZSIsImNndVBhZ2UiLCJkZWxldGVMaW5rUGFnZSIsImxvZ2luTGlua1BhZ2UiLCJuZXdMb2dpbkxpbmtQYWdlIiwic3RvcE1haWxQYWdlIiwidXBkYXRlQWNjb3VudFBhZ2UiLCJ1c2VySG9tZVBhZ2VUeHQiLCJ2YWxpZGF0aW9uTGlua1BhZ2UiLCJtYWlsUmVjaXBpZW50VHh0IiwibGljZW5jZVR4dCIsImhvbWVQYWdlVHh0IiwiaG9tZUJ0bkFib3V0VHh0IiwiaG9tZUJ0blN1YnNjcmliZVR4dCIsIm5ld3NMaXN0VGl0bGUiLCJ0YWdMaXN0VGl0bGUiLCJ0YWdMaXN0TWV0YURlc2MiLCJ0YWdMaXN0SW50cm8iLCJxdWl6RWxlbWVudExpbmtzSW50cm8iLCJxdWl6RWxlbWVudFN1YmNyaXB0aW9uRm9ybVRpdGxlIiwiZXhwbGFuYXRpb25FbGVtZW50VHh0IiwidHdpdHRlckFjY291bnQiLCJtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZSIsImNvbmZpZ1RlbXBsYXRlIiwiZGl2TWFpbiIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXZDcmFzaCIsImRpdk1lc3NhZ2UiLCJkaXZRdWVzdGlvbm5haXJlcyIsImJ0blJlZ2VuZXJhdGUiLCJoZWxsb0RldiIsImluaXRpYWxpc2UiLCJjaGVja1Nlc3Npb24iLCJtZXNzYWdlIiwiY29sb3IiLCJpc0Nvbm5lY3RlZCIsInVzZXIiLCJnZXRMb2NhbHkiLCJ1cGRhdGVBY2NvdW50TGluayIsInN0YXR1cyIsImFkZEVsZW1lbnQiLCJzdHlsZSIsImRpc3BsYXkiLCJyZW1vdmVMb2NhbHkiLCJ4aHJTdGF0cyIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJET05FIiwicmVzcG9uc2UiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJtYXBUZXh0IiwiTkJfVVNFUlNfMjRIIiwibmJOZXdVc2VyczI0SCIsIk5CX1NVQlNDUklQVElPTlNfMjRIIiwiU3Vic2NyaXB0aW9ucyIsIm5iU3Vic2NyaXB0aW9uczI0SCIsIk5CX1VTRVJTX0RFTEVURURfMjRIIiwibmJEZWxldGVkVXNlcnMyNEgiLCJOQl9BTlNXRVJTXzI0SCIsIkFuc3dlcnMiLCJuYkFuc3dlcnMyNEgiLCJOQl9VU0VSU19UT1QiLCJuYk5ld1VzZXJzVG90IiwiTkJfU1VCU0NSSVBUSU9OU19UT1QiLCJuYlN1YnNjcmlwdGlvbnNUb3QiLCJOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0iLCJuYlN1YnNjcmlwdGlvbnNQcmVtaXVtIiwiTkJfQU5TV0VSU19UT1QiLCJuYkFuc3dlcnNUb3QiLCJOQl9VU0VSU19ERUxFVEVEX1RPVCIsIm5iRGVsZXRlZFVzZXJzVG90IiwiTkJfVVNFUlNfREVMRVRFRF9WQUxJREVEIiwibmJEZWxldGVkVXNlcnNXYXNWYWxpZGVkIiwiTkJfVVNFUlNfREVMRVRFRF9QUkVNSVVNIiwibmJEZWxldGVkVXNlcnNUb3RXYXNQcmVtaXVtIiwicmVwbGFjZUFsbCIsInNldFJlcXVlc3RIZWFkZXIiLCJ0b2tlbiIsInNlbmQiLCJ4aHJOZXh0UXVlc3Rpb25uYWlyZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsaXN0SFRNTCIsImRheVN0ciIsIm9wdGlvbnNEYXlTdHIiLCJ3ZWVrZGF5IiwiSW50bCIsIkRhdGVUaW1lRm9ybWF0IiwiZm9ybWF0IiwiZGF0ZVB1Ymxpc2hpbmciLCJkYXRlRm9ybWF0IiwiaXNQdWJsaXNoYWJsZSIsImRhdGVOZWVkZWQiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsInByZXZlbnREZWZhdWx0IiwieGhyUmVnZW5lcmF0ZSIsImNvbnNvbGUiLCJlcnJvciIsInNhdmVMb2NhbHkiLCJkYXRhIiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImpzb24iLCJnZXRJdGVtIiwicmVtb3ZlSXRlbSIsImVsdFBhcmVudCIsImVsdFR5cGUiLCJlbHRDb250ZW50IiwiZWx0SWQiLCJlbHRDbGFzcyIsImVsdEF0dHJpYnV0ZXMiLCJuZXdFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTGlzdCIsImFkZCIsImF0dHJpYnV0TmFtZSIsInNldEF0dHJpYnV0ZSIsImlubmVySFRNTCIsImFwcGVuZENoaWxkIiwibG9nIiwibGluayIsImhvbWVQYWdlIiwiZ2V0VGltZURpZmZlcmVuY2UiLCJ0aW1lTG9jYWwiLCJnZXRUaW1lem9uZU9mZnNldCIsInNldFNlc3Npb24iLCJ1c2VySWQiLCJkdXJhdGlvblRTIiwic3RvcmFnZVVzZXIiLCJkdXJhdGlvbiIsImNoZWNrQW5zd2VyRGF0YXMiLCJkYXRhcyIsImxhc3RBbnN3ZXIiLCJhbnN3ZXIiLCJuYkNvcnJlY3RBbnN3ZXJzIiwibmJRdWVzdGlvbnMiLCJRdWVzdGlvbm5haXJlSWQiLCJHcm91cElkIiwidXJsUmVkaXJlY3Rpb24iLCJ1cmxXYW50ZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInVzZXJEYXRhcyIsInJlZGlyZWN0VXNlciIsIm5vdyIsInhociIsIm9ubG9hZCIsImlzVmFsaWQiLCJsYW5ndWFnZSIsInRpbWVEaWZmZXJlbmNlIiwibmJEYXlzT2siLCJ1cmxBY2NvdW50Iiwid2luZG93IiwibG9jYXRpb24iLCJpbmRleE9mIiwiYXNzaWduIiwib25lcnJvciIsInN0YXR1c1RleHQiXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7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QUNBLElBQU1zSCxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDTixjQUFELEVBQWlCL0csT0FBakIsRUFBMEJnSCxTQUExQixFQUNyQjtBQUNJLE1BQUcsQ0FBQy9NLDJEQUFPLENBQUMrRixPQUFELENBQVgsRUFDSXNFLG9FQUFVLENBQUMsU0FBRCxFQUFZdEUsT0FBWixDQUFWO0FBQ0osTUFBRyxDQUFDL0YsMkRBQU8sQ0FBQytNLFNBQUQsQ0FBWCxFQUNJMUMsb0VBQVUsQ0FBQyxLQUFELEVBQVEwQyxTQUFSLENBQVY7QUFDSixNQUFHLENBQUMvTSwyREFBTyxDQUFDOE0sY0FBRCxDQUFYLEVBQ0llLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkUsTUFBaEIsQ0FBdUJsQixjQUF2QjtBQUNQLENBUkQsQyIsImZpbGUiOiIuL0pTL2hvbWVNYW5hZ2VyLmFwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2hvbWVNYW5hZ2VyLmpzXCIpO1xuIiwiY29uc3QgdXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IHF1ZXN0aW9ubmFpcmVzID0gcmVxdWlyZShcIi4vcXVlc3Rpb25uYWlyZXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID1cbntcbiAgICBhcGlVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaVwiLFxuICAgIHNpdGVVcmw6IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCIsXG4gICAgYWRtaW5OYW1lOiBcIkZhYnJpY2VcIixcbiAgICBhZG1pbkVtYWlsOiBcImRldkB3aWtpbGVybmkuY29tXCIsXG4gICAgc2VuZGVyTmFtZTogXCJXaWtpTGVybmkgKGxvY2FsKVwiLFxuICAgIHNlbmRlckVtYWlsOiBcImJvbmpvdXJAd2lraWxlcm5pLmNvbVwiLFxuICAgIGFkbWluTGFuZzogXCJmclwiLFxuICAgIHRoZW1lOiBcIndpa2lsZXJuaVwiLCAvLyBsZSB0aMOobWUgdXRpbGlzw6kgKGRhbnMgL3ZpZXdzKSBwb3VyIGfDqW7DqXJlciBsZXMgcGFnZXMgSFRNTC4gQ29udGllbnQgc2VzIHByb3ByZXMgZmljaGllcnMgZGUgY29uZmlndXJhdGlvbi5cbiAgICBhdmFpbGFibGVMYW5nczogW1wiZnJcIl0sLy8gTGFuZ3VhZ2VzIGluIHdoaWNoIHRoZSBzaXRlIGlzIGF2YWlsYWJsZS4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBvbmUuXG4gICAgc2l0ZU5hbWU6IFwiV2lraUxlcm5pIChsb2NhbClcIixcbiAgICBiZWdpbkNvZGVHb2RmYXRoZXI6IFwiV0xcIiwgLy8gY2FzZS1zZW5zaXRpdmUgYW5kIGNhbid0IGNvbnRhaW4gXCJAXCIgIVxuICAgIGRlZmF1bHRSZWNlaXB0RGF5czogXCIxNDdcIiwgLy8gUGFyIGTDqWZhdXQsIHF1ZWwocykgam91cihzKSBkZSBsYSBzZW1haW5lLCBsJ3V0aWxpc2F0ZXVyIHJlw6dvaXQtaWwgcXVlbHF1ZSBjaG9zZSA/ICgxPWRpbWFuY2hlLCAyPWx1bmRpLi4uIDc9c2FtZWRpKVxuICAgIGNyb25UaW1pbmdBbGVydEluU2Vjb25kZTogMTIwLCAvLyBmb3IgbG9nc1xuICAgIHJlc3BvbnNlVGltaW5nQWxlcnRJblNlY29uZGU6IDMsIC8vIGlkZW1cbiAgICB0b2tlblNpZ251cFZhbGlkYXRpb25UaW1lSW5Ib3VyczogXCI0OGhcIiwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3plaXQvbXNcbiAgICB0b2tlbkxvZ2luTGlua1RpbWVJbkhvdXJzOiBcIjFoXCIsXG4gICAgdG9rZW5Db25uZXhpb25NaW5UaW1lSW5Ib3VyczogXCIyNGhcIixcbiAgICB0b2tlbkNvbm5leGlvbk1heFRpbWVJbkRheXM6IFwiMTgwIGRheXNcIixcbiAgICB0b2tlbkxvZ2luQ2hhbmdpbmdUaW1lSW5Ib3VyczogXCIxaFwiLC8vIGZvciBlbWFpbCAmIHBhc3N3b3JkIGNoYW5naW5nXG4gICAgdG9rZW5EZWxldGVVc2VyVGltZUluSG91cnM6IFwiMWhcIixcbiAgICB0b2tlblVuc3Vic2NyaWJlTGlua1RpbWVJbkRheXM6IFwiNyBkYXlzXCIsIC8vIHRva2VuIHNlbmQgd2l0aCBzdWJzY3JpcHRpb24ncyBlbWFpbHNcbiAgICBmcmVlQWNjb3VudFRpbWluZ0luRGF5czogMTUsXG4gICAgZnJlZUFjY291bnRFeHBpcmF0aW9uTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGFjY291bnRFeHBpcmF0aW9uRmlyc3ROb3RpZmljYXRpb25JbkRheXM6IDEwLFxuICAgIGFjY291bnRFeHBpcmF0aW9uU2Vjb25kTm90aWZpY2F0aW9uSW5EYXlzOiAzLFxuICAgIGluYWN0aXZlQWNjb3VudFRpbWVUb0RlbGV0ZUluRGF5czogMTgwLFxuICAgIC8vIFF1ZXN0aW9ubmFpcmVzOlxuICAgIG5iUXVlc3Rpb25zTWluOiAxLCAvLyBtaW5pbXVtIG51bWJlciBvZiBxdWVzdGlvbnMgZm9yIHRoZSBxdWVzdGlvbm5haXJlIHRvIGJlIHB1Ymxpc2hhYmxlXG4gICAgbmJRdWVzdGlvbnNNYXg6IDIsIC8vIGlmIDAgPSBub3QgbWF4aW11bVxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJOZXdRdWVzdGlvbm5haXJlczogMTIsLy8gZm9yIFJTUywgZXRjLlxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUJlZ2luOjcsIC8vIGluIHVzZXIgbG9jYWwgdGltZVxuICAgIGhvdXJHaXZlTmV3UXVlc3Rpb25uYWlyZUVuZDoyMSwgLy8gaWRlbVxuICAgIG1heFF1ZXN0aW9ubmFpcmVTZW5kZWRBdFNhbWVUaW1lOiA1MCwgLy8gZm9yIHN1YnNjcmlwdGlvbidzIGUtbWFpbGluZ1xuICAgIG1pblNlYXJjaFF1ZXN0aW9ubmFpcmVzOiAzLFxuICAgIGZpZWxkTmV3UXVlc3Rpb25uYWlyZXMgOiBcInB1Ymxpc2hpbmdBdFwiLCAvLyBmaWVsZCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbGlzdCBvZiB0aGUgbGFzdCBxdWVzdGlvbm5haXJlcywgY2FuIGJlIFwiY3JlYXRlZEF0XCIsIFwidXBkYXRlZEF0XCIgb3IgXCJwdWJsaXNoaW5nQXRcIlxuICAgIC8vIEdyb3VwcyA6XG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNaW46IDIsXG4gICAgbmJRdWVzdGlvbm5haXJlc0J5R3JvdXBNYXg6IDAsXG4gICAgLy8gSWxsdXN0cmF0aW9uczpcbiAgICBuYklsbHVzdHJhdGlvbnNNaW46IDEsXG4gICAgbmJJbGx1c3RyYXRpb25zTWF4OiAxLFxuICAgIG1heElsbHVzdHJhdGlvblNpemVpbk9jdGV0OiAxMDAwMDAwLC8vIHBhcyBjb250csO0bMOpIHBvdXIgbCdpbnN0YW50LiDDgCByZXZvaXIuXG4gICAgbWltZVR5cGVzRm9ySWxsdXN0cmF0aW9uOiBbIFwiaW1hZ2UvanBnXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL3BuZ1wiIF0sXG4gICAgLy8gLS0gVXBsb2FkIGFuZCByZXNpemU6XG4gICAgaWxsdXN0cmF0aW9uc1dpZHRoTWF4SW5QeDogNTAwLFxuICAgIGlsbHVzdHJhdGlvbnNNaW5pYXR1cmVzV2lkdGhNYXhJblB4OiAyMDAsXG4gICAgLy8gTGlua3M6XG4gICAgbmJMaW5rc01pbjogMSxcbiAgICBuYkxpbmtzTWF4OiAxLFxuICAgIC8vIFF1ZXN0aW9ucyAmIHJlc3BvbnNlczpcbiAgICBuYlF1ZXN0aW9uc01pbjogMSxcbiAgICBuYlF1ZXN0aW9uc01heDogMCxcbiAgICBuYkNob2ljZXNNYXg6IDEwLFxuICAgIC8vIMOgIHN1cHByaW1lciBxdWFuZCB0b3VzIGxlcyBcInJlcXVpcmVcIiDDoCBqb3VyOlxuICAgIHBhc3N3b3JkTWluTGVuZ3RoOiB1c2Vycy5wYXNzd29yZC5taW5sZW5ndGgsXG4gICAgZGlyQ2FjaGVVc2VyczogdXNlcnMuZGlyQ2FjaGVVc2VycyxcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VyczogdXNlcnMuZGlyQ2FjaGVVc2Vyc0Fuc3dlcnMsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyxcbiAgICBkaXJDYWNoZVF1ZXN0aW9uczogcXVlc3Rpb25uYWlyZXMuZGlyQ2FjaGVRdWVzdGlvbnMsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJDYWNoZVVzZXJzUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzOiBxdWVzdGlvbm5haXJlcy5kaXJIVE1MUXVlc3Rpb25uYWlyZXMsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXM6IHF1ZXN0aW9ubmFpcmVzLmRpcldlYlF1ZXN0aW9ubmFpcmVzXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbnsgICAgXG4gICAgLy8gQVBJJ3JvdXRlcyAoYWZ0ZXIgXCJhcGlVcmxcIiBkZWZpbmVkIGluIGluc3RhbmNlLmpzKVxuICAgIHF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1ZXN0aW9ubmFpcmVcIiwvLyBsYSBiYXNlIMOgIGxhcXVlbGxlIHMnYWpvdXRlIGxlcyByb3V0ZXMgc3VpdmFudGVzXG4gICAgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlczogXCIvZ2V0bGlzdG5leHRxdWVzdGlvbm5haXJlcy9cIixcbiAgICBnZXRRdWVzdGlvbm5haXJlUm91dGVzOiBcIi9nZXRcIixcbiAgICBnZXRSYW5kb21RdWVzdGlvbm5haXJlc1JvdXRlIDogXCIvZ2V0cmFuZG9tXCIsIFxuICAgIGdldFN0YXRzUXVlc3Rpb25uYWlyZXMgOiBcIi9zdGF0cy9cIixcbiAgICBwcmV2aWV3UXVlc3Rpb25uYWlyZVJvdXRlczogXCIvcHJldmlld1wiLFxuICAgIHB1Ymxpc2hlZFF1ZXN0aW9ubmFpcmVSb3V0ZXM6IFwiL3F1aXovXCIsXG4gICAgcmVnZW5lcmF0ZUhUTUw6IFwiL2h0bWxyZWdlbmVyYXRlZFwiLFxuICAgIHNlYXJjaEFkbWluUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaGFkbWluXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZXNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIGdyb3VwZXMgOlxuICAgIGdyb3VwUm91dGVzOiBcIi9ncm91cFwiLFxuICAgIGdldEdyb3VwUm91dGU6IFwiL2dldC9cIixcbiAgICBwcmV2aWV3R3JvdXBSb3V0ZXM6IFwiL3ByZXZpZXdcIixcbiAgICBzZWFyY2hHcm91cHNSb3V0ZSA6IFwiL3NlYXJjaFwiLFxuICAgIC8vIC0tIHF1ZXN0aW9ucyAmIGNob2ljZXMgOlxuICAgIHF1ZXN0aW9uc1JvdXRlOiBcIi9xdWVzdGlvbi9cIixcbiAgICAvLyAtLSB0YWdzIDpcbiAgICB0YWdzU2VhcmNoUm91dGU6IFwiL3RhZ3Mvc2VhcmNoL1wiLFxuICAgIC8vIC0tIGFuc3dlcnMgOlxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0UHJldmlvdXNBbnN3ZXJzOiBcIi91c2VyL2Fuc3dlcnMvXCIsXG4gICAgZ2V0U3RhdHNBbnN3ZXJzIDogXCIvdXNlci9hbndzd2Vycy9zdGF0cy9cIiwvLyBmb25jdGlvbm5lIGF1c3NpIHBvdXIgbGVzIGdyb3VwZXNcbiAgICBzYXZlQW5zd2Vyc1JvdXRlOiBcIi9hbnN3ZXIvXCIsLy8gaWRlbVxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIFF1ZXN0aW9ubmFpcmUgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICAgICAgaW50cm9kdWN0aW9uOiB7IHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVzIDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgR3JvdXAgOlxuICAgIHtcbiAgICAgICAgdGl0bGU6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHNsdWc6IHsgbWF4bGVuZ3RoOiAxNTAgfSwgLy8gY2hhbXAgcmVxdWlzIG1haXMgY2FsY3Vsw6kgw6AgcGFydGlyIGR1IHRpdHJlIHFkIGxhaXNzw6kgdmlkZSBkYW5zIGxlIGZvcm11bGFpcmVcbiAgICB9LFxuICAgIFF1ZXN0aW9uIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgIHJhbms6IHsgcmVxdWlyZWQ6IHRydWUsIG1pbjoxLCBkZWZhdWx0VmFsdWU6MSB9XG4gICAgfSwgICAgICAgICAgXG4gICAgQ2hvaWNlIDpcbiAgICB7XG4gICAgICAgIHRleHQ6IHsgbWF4bGVuZ3RoOiAyNTUsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICB9LFxuICAgIHNlYXJjaDogeyBtaW5sZW5ndGg6IDMsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoR3JvdXBzOiB7IG1pbmxlbmd0aDogMywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAvLyBFbXBsYWNlbWVudCBkZXMgZmljaGllcnMgSlNPTiBnw6luw6lyw6lzIDpcbiAgICBkaXJDYWNoZUdyb3VwcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvZ3JvdXBzXCIsXG4gICAgZGlyQ2FjaGVRdWVzdGlvbm5haXJlcyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXNcIixcbiAgICBkaXJDYWNoZVF1ZXN0aW9ucyA6IFwiZGF0YXMvcXVlc3Rpb25uYWlyZXMvcXVlc3Rpb25zXCIsXG4gICAgZGlyQ2FjaGVUYWdzIDogXCJkYXRhcy9xdWVzdGlvbm5haXJlcy90YWdzXCIsXG4gICAgZGlyQ2FjaGVVc2Vyc1F1ZXN0aW9ubmFpcmVzIDogXCJkYXRhcy91c2Vycy9xdWVzdGlvbm5haXJlc1wiLFxuICAgIC8vIEVtcGxhY2VtZW50IGRlcyBmaWNoaWVycyBIVE1MIGfDqW7DqXLDqXMgOlxuICAgIGRpckhUTUxHcm91cHMgOiBcImZyb250L3B1YmxpYy9xdWl6L2dwXCIsXG4gICAgZGlySFRNTFF1ZXN0aW9ubmFpcmVzIDogXCJmcm9udC9wdWJsaWMvcXVpelwiLFxuICAgIGRpckhUTUxOZXdzIDogXCJmcm9udC9wdWJsaWMvcXVpenNcIixcbiAgICBkaXJIVE1MVGFncyA6IFwiZnJvbnQvcHVibGljL3F1aXpzXCIsXG4gICAgLy8gSWRlbSBtYWlzIHBvdXIgdXJscyA6XG4gICAgZGlyV2ViR3JvdXBzIDogXCJxdWl6L2dwXCIsXG4gICAgZGlyV2ViUXVlc3Rpb25uYWlyZXMgOiBcInF1aXpcIixcbiAgICBkaXJXZWJOZXdzIDogXCJxdWl6cy9cIixcbiAgICBkaXJXZWJUYWdzIDogXCJxdWl6cy9cIixcbiAgICAvLyBsaW1pdGUgZGVzIHLDqXN1bHRhdCBkdSBtb3RldXIgZGUgcmVjaGVyY2hlLCBxdWFuZCBkZW1hbmRlIGRlIHLDqXN1bHRhdHMgYXUgaGFzYXJkIDpcbiAgICBuYlJhbmRvbVJlc3VsdHMgOiAzLFxuICAgIC8qIFZhbGV1cnMgZW4gZmFpdCBkw6lmaW5pZXMgZGFucyBpbnN0YW5jZS5qcyBkb25jIMOgIHN1cHByaW1lciBxdWFuZCBwbHVzIHV0aWxpc8OpZXMgYWlsbGV1cnMgOiAqL1xuICAgIG5iUXVlc3Rpb25zTWluOiAxLFxuICAgIG5iUXVlc3Rpb25zTWF4OiAwLFxuICAgIG5iQ2hvaWNlc01heDogMTAsXG4gICAgbmJUYWdzTWluOiAwLFxuICAgIG5iVGFnc01heDogMCwgLy8gMCA9IG5vdCBtYXggICAgXG59OyIsIm1vZHVsZS5leHBvcnRzID1cbntcbiAgICAvLyBBUEkncm91dGVzIChhZnRlciBcImFwaVVybFwiIGRlZmluZWQgaW4gaW5zdGFuY2UuanMpXG4gICAgdXNlclJvdXRlczogXCIvdXNlclwiLFxuICAgIGNoZWNrRGVsZXRlTGlua1JvdXRlOiBcIi9jb25maXJtZGVsZXRlL1wiLCAgIFxuICAgIGNoZWNrSWZJc0VtYWlsZnJlZVJvdXRlOiBcIi9pc2VtYWlsZnJlZVwiLFxuICAgIGNoZWNrTG9naW5Sb3V0ZTogXCIvY2hlY2tsb2dpbi9cIixcbiAgICBjaGVja05ld0xvZ2luTGlua1JvdXRlOiBcIi9jb25maXJtbmV3bG9naW4vXCIsXG4gICAgY2hlY2tTdWJzY3JpYmVUb2tlblJvdXRlOiBcIi92YWxpZGF0aW9uL1wiLFxuICAgIGNvbm5lY3Rpb25Sb3V0ZTogXCIvbG9naW5cIixcbiAgICBjb25uZWN0aW9uV2l0aExpbmtSb3V0ZTogXCIvY2hlY2tsb2dpbmxpbmtcIixcbiAgICBjcmVhdGVVc2VyUm91dGU6IFwiL2NyZWF0ZVwiLFxuICAgIGdldEFkbWluU3RhdHM6IFwiL2dldGFkbWluc3RhdHMvXCIsXG4gICAgZ2V0R29kQ2hpbGRzOiBcIi9nZXRnb2RjaGlsZHMvXCIsICAgIFxuICAgIGdldEdvZGZhdGhlclJvdXRlOiBcIi9nZXRnb2RmYXRoZXJpZFwiLFxuICAgIGdldExvZ2luTGlua1JvdXRlOiBcIi9nZXRsb2dpbmxpbmtcIixcbiAgICBnZXRQYXltZW50czogXCIvcGF5bWVudC9nZXRmb3JvbmV1c2VyL1wiLFxuICAgIGdldFVzZXJJbmZvczogXCIvZ2V0L1wiLFxuICAgIGdldFVzZXJzUXVlc3Rpb25uYWlyZXNSb3V0ZTogXCIvZ2V0dXNlcnNxdWVzdGlvbm5haXJlcy9cIiwvLyBsZXMgcXVlc3Rpb25uYWlyZXMgYXV4cXVlbHMgbCd1dGlsaXNhdGV1ciBhIGTDqWrDoCBldSBhY2PDqHMgdmlhIHNvbiBhYm9ubmVtZW50ICAgIFxuICAgIHNlYXJjaFVzZXJSb3V0ZTogXCIvc2VhcmNoL1wiLFxuICAgIHNpZ251cENvbXBsZXRpb25Sb3V0ZTogXCIvc2lnbnVwY29tcGxldGlvbi9cIixcbiAgICBzdWJzY3JpYmVSb3V0ZTogXCIvc2lnbnVwXCIsXG4gICAgdW5zdWJzY3JpYmVSb3V0ZTogXCIvc3Vic2NyaXB0aW9uL3N0b3AvXCIsXG4gICAgdXBkYXRlVXNlckluZm9zOiBcIi9tb2RpZnkvXCIsXG4gICAgdmFsaWRhdGVVc2VyUm91dGU6IFwiL3ZhbGlkYXRlL1wiLFxuICAgIC8vIGZvcm1zIDogw6AgY29tcGzDqXRlciBhdmVjIHZhbGV1cnMgcGFyIGTDqWZhdXQsIGV0Yy4gY2YgbW9kw6hsZVxuICAgIG5hbWU6IHsgbWF4bGVuZ3RoOiA3MCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBlbWFpbDogeyBtYXhsZW5ndGg6IDI1NSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBwYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiwgcmVxdWlyZWQ6IHRydWUgfSwgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmNyeXB0I3NlY3VyaXR5LWlzc3Vlcy1hbmQtY29uY2VybnNcbiAgICBuZXdQYXNzd29yZDogeyBtaW5sZW5ndGg6IDgsIG1heGxlbmd0aDo3MiB9LFxuICAgIGNvZGVHb2RmYXRoZXI6IHsgbWF4bGVuZ3RoOiAyNTUgfSxcbiAgICBjZ3VPazogeyB2YWx1ZTogXCJ0cnVlXCIsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2VhcmNoOiB7IG1pbmxlbmd0aDogMSwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0aW1lRGlmZmVyZW5jZU1pbjogLTcyMCxcbiAgICB0aW1lRGlmZmVyZW5jZU1heDogODQwLFxuICAgIC8vIEpTT04gZGlyXG4gICAgZGlyQ2FjaGVVc2VycyA6IFwiZGF0YXMvdXNlcnNcIixcbiAgICBkaXJDYWNoZVVzZXJzQW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvYW5zd2Vyc1wiLFxuICAgIGRpckNhY2hlVXNlcnNXaXRob3V0QW5zd2VycyA6IFwiZGF0YXMvdXNlcnMvcXVlc3Rpb25uYWlyZXMvd2l0aG91dFwiXG59O1xuIiwidmFyIG1hcCA9IHtcblx0XCIuL2ZyL2dlbmVyYWxcIjogXCIuLi9sYW5nL2ZyL2dlbmVyYWwuanNcIlxufTtcblxuXG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0dmFyIGlkID0gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSk7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKGlkKTtcbn1cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhtYXAsIHJlcSkpIHtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0cmV0dXJuIG1hcFtyZXFdO1xufVxud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IFwiLi4vbGFuZyBzeW5jIHJlY3Vyc2l2ZSBeXFxcXC5cXFxcLy4qXFxcXC9nZW5lcmFsJFwiOyIsInZhciBtYXAgPSB7XG5cdFwiLi9mci9xdWVzdGlvbm5haXJlXCI6IFwiLi4vbGFuZy9mci9xdWVzdGlvbm5haXJlLmpzXCJcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSBcIi4uL2xhbmcgc3luYyByZWN1cnNpdmUgXlxcXFwuXFxcXC8uKlxcXFwvcXVlc3Rpb25uYWlyZSRcIjsiLCJ2YXIgbWFwID0ge1xuXHRcIi4vZnIvdXNlclwiOiBcIi4uL2xhbmcvZnIvdXNlci5qc1wiXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gXCIuLi9sYW5nIHN5bmMgcmVjdXJzaXZlIF5cXFxcLlxcXFwvLipcXFxcL3VzZXIkXCI7IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGFkZEJ0blR4dDogXCJBam91dGVyXCIsXG4gICAgYWRkT2tNZXNzYWdlIDogXCJMZXMgZG9ubsOpZXMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llcy5cIixcbiAgICBhbGVydE5ld1dpbmRvdzogXCJub3V2ZWxsZSBmZW7DqnRyZVwiLFxuICAgIGJhZFVybCA6IFwiVGVudGF0aXZlIGQnYWNjw6hzIMOgIHVuZSBwYWdlIG4nZXhpc3RhbnQgcGFzIDpcIixcbiAgICBidG5MaW5rVG9RdWVzdGlvbm5haXJlIDogXCJBZmZpY2hlciAhXCIsXG4gICAgYnRuUHJvcG9zZUNvbm5lY3Rpb246IFwiSmUgbWUgY29ubmVjdGUuXCIsXG4gICAgYnRuUHJvcG9zZVN1YnNjcmliZTogXCJKZSBjcsOpZSBtb24gY29tcHRlLlwiLFxuICAgIGJ0blNob3dPbldlYlNpdGU6IFwiVm9pciBzdXIgI1NJVEVfTkFNRS5cIixcbiAgICBkZWxldGVCdG5UeHQ6IFwiU3VwcHJpbWVyXCIsXG4gICAgZGVsZXRlRmFpbE1lc3NhZ2UgOiBcIkxhIHN1cHByZXNzaW9uIGRlIGwnZW5yZWdpc3RyZW1lbnQgI0lEIGEgw6ljaG91w6kuXCIsXG4gICAgZGVsZXRlT2tNZXNzYWdlIDogXCJMYSBzdXBwcmVzc2lvbiBhIGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6llLlwiLFxuICAgIGZhaWxBdXRoIDogXCJFcnJldXIgZCdhdXRoZW50aWZpY2F0aW9uLlwiLFxuICAgIGZhaWxBdXRoQ3JvbiA6IFwiVGVudGF0aXZlIGRlIGxhbmNlbWVudCBkJ3VuIGNyb24gc2FucyBsZSBib24gdG9rZW4uXCIsXG4gICAgZmFpbEF1dGhIZWFkZXIgOiBcIkFic2VuY2UgZGUgaGVhZGVyIEF1dGhvcml6YXRpb24uXCIsXG4gICAgZmFpbEF1dGhJZCA6IFwiSWRlbnRpZmlhbnQgbm9uIHZhbGlkZSA6IFwiLFxuICAgIGZhaWxBdXRoVG9rZW4gOiBcIlRva2VuIGludmFsaWRlIG91IHV0aWxpc2F0ZXVyIG5vbiB0cm91dsOpLlwiLFxuICAgIG5lZWRlZFBhcmFtcyA6IFwiRGVzIHBhcmFtw6h0cmVzIG7DqWNlc3NhaXJlcyBtYW5xdWFudHMgc29udCBtYW5xdWFudHMuXCIsXG4gICAgbmV4dFBhZ2UgOiBcIlBhZ2Ugc3VpdmFudGVcIixcbiAgICBub3RBbGxvd2VkIDogXCJWb3VzIG4nYXZleiBwYXMgbGVzIGRyb2l0cyBuw6ljZXNzYWlyZXMgcG91ciBjZXR0ZSBhY3Rpb24uXCIsXG4gICAgbm90UmVxdWlyZWQgOiBcIkZhY3VsdGF0aWYuXCIsXG4gICAgbm90VmFsaWRGb3JtYXQgOiBcIkZvcm1hdCBub24gdmFsaWRlLlwiLFxuICAgIHByZXZpb3VzUGFnZSA6IFwiUGFnZSBwcsOpY8OpZGVudGVcIixcbiAgICBzZXJ2ZXJFcnJvciA6IFwiRMOpc29sw6kuIFVuZSBlcnJldXIgaW1wcsOpdnVlIGVzdCBzdXJ2ZW51ZS4gU2kgY2VsYSBwZXJzaXN0ZSwgbidow6lzaXRleiDDoCBwcsOpdmVuaXIgbCdhZG1pbmlzdHJhdGV1ciBkdSBzaXRlLlwiLFxuICAgIHNlcnZlckVycm9yQWRtaW4gOiBcIkJ1ZyBkZSBsJ2FwcGxpY2F0aW9uIDpcIixcbiAgICBzaXRlSFRNTFRpdGxlIDogXCJXaWtpTGVybmkgOiBsYSBjdWx0dXJlIGfDqW7DqXJhbGUgZW4gbGliZXJ0w6lcIixcbiAgICBzaXRlTWV0YURlc2NyaXB0aW9uIDogXCJBdmVjIFdpa2lMZXJuaSwgdm91cyBhcHByZW5leiBjaGFxdWUgam91ciBkZSBub3V2ZWxsZXMgY2hvc2VzLiBWb3VzIHJlY2V2ZXogZGUgY291cnRzIGFydGljbGVzIGxpc2libGVzIGVuIHF1ZWxxdWVzIG1pbnV0ZXMuIERlcyBxdWl6cyB2b3VzIHBlcm1ldHRlbnQgZW5zdWl0ZSBkZSB0ZXN0ZXIgY2UgcXVlIHZvdXMgYXZleiByZXRlbnUuXCIsXG4gICAgc2NyaXB0VGltaW5nQWxlcnQgOiBcIioqKiBTY3JpcHQgbGVudCA6IFNDUklQVF9USU1JTkcgbWlsbGlzZWNvbmRlcywgcm91dGUgOiBTQ1JJUFRfVVJMXCIsXG4gICAgc2NyaXB0VGltaW5nSW5mbyA6IFwiRHVyw6llIGRlIGxhIHLDqXBvbnNlIDogU0NSSVBUX1RJTUlORyBtaWxsaXNlY29uZGVzLCByb3V0ZSA6IFNDUklQVF9VUkxcIixcbiAgICBzdGF0c0FkbWluIDogXCJEdXJhbnQgbGVzIGRlcm5pw6hyZXMgMjRoIDogTkJfVVNFUlNfMjRIIGNvbXB0ZXMgb250IMOpdMOpIGNyw6nDqXMsIE5CX1NVQlNDUklQVElPTlNfMjRIIHZhbGlkw6lzIGV0IE5CX1VTRVJTX0RFTEVURURfMjRIIHN1cHByaW3DqXMuIE5CX0FOU1dFUlNfMjRIIHLDqXBvbnNlcyBhdXggcXVpenMgb250IMOpdMOpIGVucmVnaXN0csOpZXMuPGJyPkVuIHRvdXQsIGlsIHkgYSA6IE5CX1VTRVJTX1RPVCBjb21wdGVzLCBkb250IE5CX1NVQlNDUklQVElPTlNfVE9UIHZhbGlkw6lzIGV0IE5CX1NVQlNDUklQVElPTlNfUFJFTUlVTSBjb21wdGVzIHByw6ltaXVtLiBOQl9BTlNXRVJTX1RPVCByw6lwb25zZXMgYXV4IHF1aXpzIG9udCDDqXTDqSBlbnJlZ2lzdHLDqWVzLjxicj5QYXJtaSBsZXMgTkJfVVNFUlNfREVMRVRFRF9UT1QgY29tcHRlcyBzdXBwcmltw6lzLCBOQl9VU0VSU19ERUxFVEVEX1ZBTElERUQgYXZhaWVudCB2YWxpZMOpIGxldXIgY29tcHRlIGV0IE5CX1VTRVJTX0RFTEVURURfUFJFTUlVTSBhdmFpZW50IHNvdXNjcml0IHVuIGNvbXB0ZSBwcsOpbWl1bS5cIixcbiAgICBzdWJzY3JpcHRpb25DYWxsOiBcIkluc2NyaXZlei12b3VzICFcIixcbiAgICB1cGRhdGVCdG5UeHQ6IFwiTW9kaWZpZXJcIixcbiAgICB1cGRhdGVPa01lc3NhZ2UgOiBcIkxhIG1pc2Ugw6Agam91ciDDoCBqb3VyIGEgYmllbiDDqXTDqSBlbnJlZ2lzdHLDqWUuXCJcbn07IiwibW9kdWxlLmV4cG9ydHMgPVxue1xuICAgIGJ0blByb3Bvc2VDb25uZWN0aW9uOiBcIkplIG1lIGNvbm5lY3RlLlwiLC8vIGTDqXBsYWPDqSBkYW5zIGdlbmVyYWwuanNcbiAgICBidG5Qcm9wb3NlU3Vic2NyaWJlOiBcIkplIGNyw6llIG1vbiBjb21wdGUuXCIsLy9pZGVtXG4gICAgYnRuU2VuZFJlc3BvbnNlOiBcIlRlc3RleiB2b3MgcsOpcG9uc2VzLlwiLFxuICAgIGJ0blNoYXJlUXVpelR4dDogXCJQYXJ0YWdlciB2aWEgXCIsXG4gICAgYnRuU2hhcmVRdWl6TWFpbEJvZHk6IFwiQm9uam91ciwlMEElMEFWb2ljaSUyMHVuJTIwbGllbiUyMGludGVybmV0JTIwcXVpJTIwZGV2cmFpdCUyMHQnaW50w6lyZXNzZXIgOiUwQVwiLCAgICBcbiAgICBidG5TaG93UXVlc3Rpb25uYWlyZTogXCJSw6lwb25kcmUgYXUgcXVpeiAhXCIsXG4gICAgY29ycmVjdEFuc3dlclR4dDogXCJCb25uZSByw6lwb25zZVwiLFxuICAgIGVzdGltYXRlZFRpbWU6IFwiRHVyw6llIGRlIGxlY3R1cmUgZXN0aW3DqWUgOiBcIixcbiAgICBlc3RpbWF0ZWRUaW1lT3B0aW9uIDpcbiAgICB7XG4gICAgICAgIHNob3J0OiBcImNvdXJ0ZVwiLFxuICAgICAgICBtZWRpdW06IFwibW95ZW5uZVwiLFxuICAgICAgICBsb25nOiBcImxvbmd1ZVwiXG4gICAgfSxcbiAgICBleHBsYW5hdGlvbkJlZm9yZVR4dDogXCJFeHRyYWl0IDpcIixcbiAgICBoYXZlQmVlblB1Ymxpc2hlZCA6IFwiOk5CIG5vdXZlYXV4IHF1ZXN0aW9ubmFpcmVzIG9udCDDqXTDqSBwdWJsacOpcy5cIixcbiAgICBoYXZlQmVlblJlZ2VuZXJhdGVkIDogXCJMZXMgcGFnZXMgSFRNTCBkZSAjTkIxIHF1ZXN0aW9ubmFpcmVzIG91IMOpbMOpbWVudHMgZGUgZ3JvdXBlcywgI05CMiBxdWl6cyBncm91cMOpcyBldCAjTkIzIHRow6htZXMgb250IMOpdMOpIHJlZ8OpbsOpcsOpcy5cIixcbiAgICBsYXN0VXBkYXRlZDogXCJEZXJuacOocmUgbWlzZSDDoCBqb3VyLCBsZSBcIixcbiAgICBsaW5rR29Ub05leHRFbGVtZW50OiBcIkFydGljbGUgc3VpdmFudFwiLFxuICAgIGxpbmtHb1RvUXVpejogXCJBY2PDqWRlciBhdSBxdWl6XCIsICAgIFxuICAgIG5lZWRDb3JyZWN0UHVibGlzaGluZ0RhdGU6IFwiTGEgZGF0ZSBkZSBwdWJsaWNhdGlvbiBmb3VybmllIG4nYSBwYXMgdW4gZm9ybWF0IHZhbGlkZS5cIixcbiAgICBuZWVkRXN0aW1hdGVkVGltZTogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIHVuZSBlc3RpbWF0aW9uIGRlIGxhIGR1csOpZSBkZSBjZSBxdWl6LlwiLFxuICAgIG5lZWRHcm91cElmUmFuazogXCJWb3VzIGF2ZXogc2Fpc2kgdW4gcmFuZyBkZSBjbGFzc2VtZW50LCBzYW5zIHPDqWxlY3Rpb25uZXIgbGUgZ3JvdXBlIGR1IHF1aXouXCIsXG4gICAgbmVlZEludHJvZHVjdGlvbjogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRleHRlIGQnaW50cm9kdWN0aW9uIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZEtub3dJZklzUHVibGlzaGVkOiBcIklsIGZhdXQgc2F2b2lyIHNpIGNlIHF1aXogZXN0IHB1Ymxpw6kuXCIsXG4gICAgbmVlZExhbmd1YWdlOiBcIlZvdXMgZGV2ZXogc8OpbGVjdGlvbm5lciBsYSBsYW5ndWUgZGUgY2UgcXVpei5cIixcbiAgICBuZWVkTm90VG9vTG9uZ1RpdGxlOiBcIkxlIHRpdHJlIGR1IHF1aXogbmUgZG9pdCBwYXMgY29tcHRlciBwbHVzIGRlIDI1NSBjYXJhY3TDqHJlcy5cIixcbiAgICBuZWVkTnVtYmVyRm9yUmFuazogXCJWb3VzIGRldmV6IHNhaXNpciB1biBub21icmUgZW50aWVyIHBvdXIgbGUgcmFuZyBkZSBjZSBxdWVzdGlvbm5haXJlIGRhbnMgc29uIGdyb3VwZS5cIiwgICAgICAgICAgICAgIFxuICAgIG5lZWRUaXRsZTogXCJNZXJjaSBkZSBmb3VybmlyIHVuIHRpdHJlIMOgIHZvdHJlIHF1aXouXCIsXG4gICAgbmVlZFVuaXF1ZVVybDogXCJMJ3VybCBkdSBxdWl6IGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICAgIG5lZWRVcmw6IFwiTWVyY2kgZGUgZm91cm5pciBsJ3VybCDDoCB2b3RyZSBxdWl6LlwiLFxuICAgIG5leHREYXRlV2l0aG91dFF1ZXN0aW9ubmFpcmU6IFwiUHJvY2hhaW5lIGRhdGUgc2FucyBxdWl6IHByb2dyYW1tw6kgOiBcIixcbiAgICBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0OiBcIkxlcyAjTkIgcHJvY2hhaW5zIHF1aXpzIGRldmFudCDDqnRyZSBwdWJsacOpc1wiLFxuICAgIHF1ZXN0aW9ubmFpcmVzTmFtZTogXCJxdWl6XCIsXG4gICAgcXVlc3Rpb25uYWlyZU5lZWRCZUNvbXBsZXRlZDogXCJRdWl6IGluY29tcGxldFwiLFxuICAgIHB1Ymxpc2hlZEF0OiBcIiwgbGVcIixcbiAgICBwdWJsaXNoZWRCeTogXCJRdWl6IHB1Ymxpw6kgcGFyXCIsXG4gICAgc2VhcmNoUXVlc3Rpb25uYWlyZVJlc3VsdFRpdGxlIDogXCJSw6lzdWx0YXQgcG91ciB2b3RyZSByZWNoZXJjaGVcIixcbiAgICBzZWFyY2hRdWVzdGlvbm5haXJlV2l0aE5vUmVzdWx0IDogXCJBdWN1biBxdWl6IG4nYSDDqXTDqSB0cm91dsOpIHBvdXIgdm90cmUgcmVjaGVyY2hlLlwiLFxuICAgIHNlYXJjaFF1ZXN0aW9ubmFpcmVXaXRoUmVzdWx0IDogXCJJbCB5IGEgI05CIGFydGljbGUjUyBjb3JyZXNwb25kYW50IMOgIHZvdHJlIHJlY2hlcmNoZSA6XCIsXG4gICAgd3JvbmdBbnN3ZXJUeHQ6IFwiTWF1dmFpc2UgcsOpcG9uc2VcIlxufTsiLCJtb2R1bGUuZXhwb3J0cyA9XG57XG4gICAgYWxyZWFkeUNvbm5lY3RlZDogXCJWb3VzIMOqdGVzIGTDqWrDoCBjb25uZWN0w6kgYXUgc2l0ZSAhXCIsXG4gICAgYmFkTGlua1ZhbGlkYXRpb25NZXNzYWdlOiBcIlZvdHJlIGxpZW4gZGUgY29uZmlybWF0aW9uIG5lIHNlbWJsZSBwYXMgdmFsaWRlIG91IGJpZW4gaWwgYSBleHBpcsOpLiBWb3VzIHBvdXZleiBlbiByZWNldm9pciB1biBub3V2ZWF1IDxhIGhyZWY9JyNVUkwnPmVuIGNsaXF1YW50IGljaTwvYT4uXCIsXG4gICAgYmFkUGFzc3dvcmQ6IFwiQXVjdW4gY29tcHRlIHV0aWxpc2F0ZXVyIG5lIGNvcnJlc3BvbmQgYXV4IGluZm9ybWF0aW9ucyBzYWlzaWVzLlwiLFxuICAgIGJ5ZWJ5ZU1lc3NhZ2U6IFwiU2kgdm91cyB2b3lleiBjZSBtZXNzYWdlLCBjJ2VzdCBxdWUgdm90cmUgZMOpY29ubmV4aW9uIHMnZXN0IGJpZW4gZMOpcm91bMOpZS48YnI+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+XCIsXG4gICAgLyogQXV0cmVzICovXG4gICAgaWxsdXN0cmF0aW9uRGlyIDogXCIvaW1nL3F1aXpzL1wiLFxuICAgIHR3aXR0ZXJBY2NvdW50OiBcIldpa2lMZXJuaVwiLFxuICAgIG1heFF1ZXN0aW9ubmFpcmVzQnlQYWdlOiAxMixcbiAgICBtYXhRdWVzdGlvbm5haXJlc1NpdGVIb21lUGFnZTogMyxcbiAgICBuYlF1ZXN0aW9ubmFpcmVzVXNlckhvbWVQYWdlIDogMyxcbn07IiwiLy8gLS0gUEFHRSBEJ0FDQ1VFSUwgUE9VUiBMRVMgR0VTVElPTk5BSVJFU1xuXG4vLy8gVsOpcmlmaWUgcXVlIGwndXRpbGlzYXRldXIgZXN0IGJpZW4gY29ubmVjdMOpLCBhIGxlIGJvbiBzdGF0dXQgZXQgbGUgcmVkaXJpZ2UgdmVycyBsZSBmb3JtdWxhaXJlIGQnaW5zY3JpcHRpb24gc2kgY2Ugbidlc3QgcGFzIGxlIGNhcy5cbi8vLyBTaSBjJ2VzdCBvaywgb24gcsOpY3Vww6hyZSBsZXMgc3RhdHMgZ8OpbsOpcmFsZXMgZXQgZGVzIGRlcm5pw6hyZXMgMjRIIGV0IGxlcyBhZmZpY2hlXG4vLy8gT24gbGlzdGUgZW5zdWl0ZSBsZXMgcHJvY2hhaW5zIHF1aXpzIGRldmFudCDDqnRyZSBwdWJsacOpcyBlbiBmYWlzYW50IHJlc3NvcnRpciBjZXV4IGRldmFudCDDqnRyZSBjb21wbMOpdMOpcyArIGxhIHByb2NoYWluZSBkYXRlIHNhbnMgcXVpelxuLy8vIFVuIG1lbnUgcGVybWV0IMOgIGwndXRpbGlzYXRldXIgZCdhY2PDqWRlciBhdXggZm9ybXVsYWlyZXMgcGVybWV0dGFudCBkZSBnw6lyZXIgbGVzIHF1aXpzIGV0IGxlcyBjb21wdGVzIHV0aWxpc2F0ZXVycyBldCBhYm9ubmVtZW50c1xuLy8vIFVuIG1lc3NhZ2UgdmVuYW50IGQndW5lIGF1dHJlIHBhZ2UgcGV1dCBhdXNzaSDDqnRyZSDDoCBhZmZpY2hlciBsb3JzIGR1IHByZW1pZXIgY2hhcmdlbWVudC5cblxuLy8vIFRlbXBvcmFpcmVtZW50LCBjJ2VzdCBpY2kgYXVzc2kgcXVlIGwnb24gcGV1dCByw6lnw6luw6lyZXIgdG91dCBsZSBIVE1MIC0+IMOgIHRlcm1lIGRhbnMgaG9tZUFkbWluICFcblxuLy8gRmljaGllciBkZSBjb25maWd1cmF0aW9uIGPDtHTDqSBjbGllbnQgOlxuaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgdGhlbWUgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5pbXBvcnQgeyBnZXRBZG1pblN0YXRzLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuaW1wb3J0IHsgZ2V0TGlzdE5leHRRdWVzdGlvbm5haXJlcywgcXVlc3Rpb25uYWlyZVJvdXRlcywgcmVnZW5lcmF0ZUhUTUwgfSBmcm9tIFwiLi4vLi4vY29uZmlnL3F1ZXN0aW9ubmFpcmVzLmpzXCI7XG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuLy8gRm9uY3Rpb25zIHV0aWxlcyBhdSBzY3JpcHQgOlxuaW1wb3J0IHsgZ2V0TG9jYWx5LCByZW1vdmVMb2NhbHkgfSBmcm9tIFwiLi90b29scy9jbGllbnRzdG9yYWdlLmpzXCI7XG5pbXBvcnQgeyBhZGRFbGVtZW50IH0gZnJvbSBcIi4vdG9vbHMvZG9tLmpzXCI7XG5pbXBvcnQgeyBoZWxsb0RldiwgdXBkYXRlQWNjb3VudExpbmsgfSBmcm9tIFwiLi90b29scy9ldmVyeXdoZXJlLmpzXCI7XG5pbXBvcnQgeyBkYXRlRm9ybWF0LCBpc0VtcHR5LCByZXBsYWNlQWxsIH0gZnJvbSBcIi4uLy4uL3Rvb2xzL21haW5cIjtcbmltcG9ydCB7IGNoZWNrU2Vzc2lvbiB9IGZyb20gXCIuL3Rvb2xzL3VzZXJzLmpzXCI7XG5cbi8vIERpY3Rpb25uYWlyZXMgOlxuY29uc3QgeyBub3RBbGxvd2VkLCBzZXJ2ZXJFcnJvciwgc3RhdHNBZG1pbiB9ID0gcmVxdWlyZShcIi4uLy4uL2xhbmcvXCIrbGFuZytcIi9nZW5lcmFsXCIpO1xuY29uc3QgeyBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlLCBuZXh0UXVlc3Rpb25uYWlyZXNMaXN0LCBxdWVzdGlvbm5haXJlTmVlZEJlQ29tcGxldGVkIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3F1ZXN0aW9ubmFpcmVcIik7XG5jb25zdCB7IHdlbGNvbWVNZXNzYWdlIH0gPSByZXF1aXJlKFwiLi4vLi4vbGFuZy9cIitsYW5nK1wiL3VzZXJcIik7XG5cbi8vIFByaW5jaXBhdXggw6lsw6ltZW50cyBkdSBET00gbWFuaXB1bMOpcyA6XG5jb25zdCBkaXZNYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluLWNvbnRlbnRcIik7XG5jb25zdCBkaXZDcmFzaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY3Jhc2hcIik7XG5jb25zdCBkaXZNZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXNzYWdlXCIpO1xuY29uc3QgZGl2UXVlc3Rpb25uYWlyZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInF1ZXN0aW9ubmFpcmVzXCIpO1xuY29uc3QgYnRuUmVnZW5lcmF0ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid2FudFJlZ2VuZXJhdGVcIik7XG5cbmhlbGxvRGV2KCk7XG5cbmNvbnN0IGluaXRpYWxpc2UgPSBhc3luYyAoKSA9Plxue1xuICAgIHRyeVxuICAgIHsgICAgICAgIFxuICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZD1hd2FpdCBjaGVja1Nlc3Npb24oW1wibWFuYWdlclwiLCBcImFkbWluXCJdLCBcIi9cIitjb25maWdUZW1wbGF0ZS5jb25uZWN0aW9uUGFnZSwgeyBtZXNzYWdlOiBub3RBbGxvd2VkLCBjb2xvcjpcImVycm9yXCIgfSk7XG4gICAgICAgIGlmKGlzQ29ubmVjdGVkKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB1c2VyPWdldExvY2FseShcInVzZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB1cGRhdGVBY2NvdW50TGluayh1c2VyLnN0YXR1cywgY29uZmlnVGVtcGxhdGUpO1xuICAgICAgICAgICAgYWRkRWxlbWVudChkaXZNZXNzYWdlLCBcImgyXCIsIHdlbGNvbWVNZXNzYWdlLnJlcGxhY2UoXCIjTkFNRVwiLCB1c2VyLm5hbWUpKTtcbiAgICAgICAgICAgIGRpdk1haW4uc3R5bGUuZGlzcGxheT1cImJsb2NrXCI7XG4gICAgICAgICAgICBpZighaXNFbXB0eShnZXRMb2NhbHkoXCJtZXNzYWdlXCIpKSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLm1lc3NhZ2UsIFwiXCIsIFtnZXRMb2NhbHkoXCJtZXNzYWdlXCIsIHRydWUpLmNvbG9yXSwgXCJcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcIm1lc3NhZ2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZXMgc3RhdHMgc3VyIGxlcyBjb21wdGVzIHV0aWxpc2F0ZXVycyA6XG4gICAgICAgICAgICBjb25zdCB4aHJTdGF0cyA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyU3RhdHMub3BlbihcIkdFVFwiLCBhcGlVcmwrdXNlclJvdXRlcytnZXRBZG1pblN0YXRzKTtcbiAgICAgICAgICAgIHhoclN0YXRzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU18yNEggOiByZXNwb25zZS5uYk5ld1VzZXJzMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1NVQlNDUklQVElPTlNfMjRIIDogcmVzcG9uc2UuU3Vic2NyaXB0aW9ucy5uYlN1YnNjcmlwdGlvbnMyNEgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfVVNFUlNfREVMRVRFRF8yNEggOiByZXNwb25zZS5uYkRlbGV0ZWRVc2VyczI0SCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9BTlNXRVJTXzI0SCA6IHJlc3BvbnNlLkFuc3dlcnMubmJBbnN3ZXJzMjRILFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1VTRVJTX1RPVCA6IHJlc3BvbnNlLm5iTmV3VXNlcnNUb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU1VCU0NSSVBUSU9OU19UT1QgOiByZXNwb25zZS5TdWJzY3JpcHRpb25zLm5iU3Vic2NyaXB0aW9uc1RvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TVUJTQ1JJUFRJT05TX1BSRU1JVU0gOiByZXNwb25zZS5TdWJzY3JpcHRpb25zLm5iU3Vic2NyaXB0aW9uc1ByZW1pdW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfQU5TV0VSU19UT1QgOiByZXNwb25zZS5BbnN3ZXJzLm5iQW5zd2Vyc1RvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU19ERUxFVEVEX1RPVCA6IHJlc3BvbnNlLm5iRGVsZXRlZFVzZXJzVG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1VTRVJTX0RFTEVURURfVkFMSURFRCA6IHJlc3BvbnNlLm5iRGVsZXRlZFVzZXJzV2FzVmFsaWRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9VU0VSU19ERUxFVEVEX1BSRU1JVU0gOiByZXNwb25zZS5uYkRlbGV0ZWRVc2Vyc1RvdFdhc1ByZW1pdW1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCByZXBsYWNlQWxsKHN0YXRzQWRtaW4sIG1hcFRleHQpLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHJTdGF0cy5zZXRSZXF1ZXN0SGVhZGVyKFwiQXV0aG9yaXphdGlvblwiLCBcIkJlYXJlciBcIit1c2VyLnRva2VuKTsgXG4gICAgICAgICAgICB4aHJTdGF0cy5zZW5kKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExlcyBxdWVzdGlvbm5haXJlcyBiaWVudMO0dCBwdWJsacOpcyA6ICAgICAgXG4gICAgICAgICAgICBjb25zdCB4aHJOZXh0UXVlc3Rpb25uYWlyZXMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgIHhock5leHRRdWVzdGlvbm5haXJlcy5vcGVuKFwiR0VUXCIsIGFwaVVybCtxdWVzdGlvbm5haXJlUm91dGVzK2dldExpc3ROZXh0UXVlc3Rpb25uYWlyZXMpO1xuICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U9SlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UucXVlc3Rpb25uYWlyZXMpKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdEhUTUw9XCJcIiwgZGF5U3RyLCBvcHRpb25zRGF5U3RyID0geyB3ZWVrZGF5OiAnbG9uZyd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzKVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheVN0cj1uZXcgSW50bC5EYXRlVGltZUZvcm1hdChsYW5nLCBvcHRpb25zRGF5U3RyKS5mb3JtYXQobmV3IERhdGUocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uZGF0ZVB1Ymxpc2hpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCI8bGk+XCIrZGF5U3RyK1wiIFwiK2RhdGVGb3JtYXQocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uZGF0ZVB1Ymxpc2hpbmcsIGF2YWlsYWJsZUxhbmdzWzBdKStcIjogPGEgaHJlZj0nXCIrY29uZmlnVGVtcGxhdGUucXVlc3Rpb25uYWlyZXNNYW5hZ2VtZW50UGFnZStcIj9pZD1cIityZXNwb25zZS5xdWVzdGlvbm5haXJlc1tpXS5pZCtcIic+XCIrcmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0udGl0bGUrXCI8L2E+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcG9uc2UucXVlc3Rpb25uYWlyZXNbaV0uaXNQdWJsaXNoYWJsZT09PWZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0SFRNTCs9XCIgPHNwYW4gY2xhc3M9J2Vycm9yJz4oXCIrcXVlc3Rpb25uYWlyZU5lZWRCZUNvbXBsZXRlZCtcIik8L2xpPlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RIVE1MKz1cIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5xdWVzdGlvbm5haXJlcy5sZW5ndGghPT0wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2UXVlc3Rpb25uYWlyZXMsIFwiaDJcIiwgbmV4dFF1ZXN0aW9ubmFpcmVzTGlzdC5yZXBsYWNlKFwiI05CXCIsIHJlc3BvbnNlLnF1ZXN0aW9ubmFpcmVzLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChkaXZRdWVzdGlvbm5haXJlcywgXCJoNFwiLCBuZXh0RGF0ZVdpdGhvdXRRdWVzdGlvbm5haXJlK2RhdGVGb3JtYXQocmVzcG9uc2UuZGF0ZU5lZWRlZCwgYXZhaWxhYmxlTGFuZ3NbMF0pLCBcIlwiLCBbXCJpbmZvXCJdLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdlF1ZXN0aW9ubmFpcmVzLCBcInVsXCIsIGxpc3RIVE1MLCBcIlwiLCBcIlwiLCBcIlwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4aHJOZXh0UXVlc3Rpb25uYWlyZXMuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7IFxuICAgICAgICAgICAgeGhyTmV4dFF1ZXN0aW9ubmFpcmVzLnNlbmQoKTtcblxuICAgICAgICAgICAgLy8gVHJhaXRlbWVudCBkZW1hbmRlIHLDqWfDqW7DqXJlciBIVE1MXG4gICAgICAgICAgICBidG5SZWdlbmVyYXRlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB4aHJSZWdlbmVyYXRlID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgeGhyUmVnZW5lcmF0ZS5vcGVuKFwiR0VUXCIsIGFwaVVybCtxdWVzdGlvbm5haXJlUm91dGVzK3JlZ2VuZXJhdGVIVE1MKTtcbiAgICAgICAgICAgICAgICB4aHJSZWdlbmVyYXRlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSlcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlPUpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSAyMDAgJiYgcmVzcG9uc2UubWVzc2FnZSE9dW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnQoZGl2TWVzc2FnZSwgXCJwXCIsIHJlc3BvbnNlLm1lc3NhZ2UsIFwiXCIsIFtcInN1Y2Nlc3NcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KGRpdk1lc3NhZ2UsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0sIFwiXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHJSZWdlbmVyYXRlLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgIHhoclJlZ2VuZXJhdGUuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIrdXNlci50b2tlbik7XG4gICAgICAgICAgICAgICAgeGhyUmVnZW5lcmF0ZS5zZW5kKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9XG4gICAgY2F0Y2goZSlcbiAgICB7XG4gICAgICAgIGFkZEVsZW1lbnQoZGl2Q3Jhc2gsIFwicFwiLCBzZXJ2ZXJFcnJvciwgXCJcIiwgW1wiZXJyb3JcIl0pO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbn1cbmluaXRpYWxpc2UoKTsiLCIvLyBGT05DVElPTlMgVVRJTEVTIEFVIFNUT0NLQUdFIExPQ0FMIChTRVNTSU9OLCBDT09LSUVTLCBJTkRFWERCLCBFVEMuKVxuLy8gUmV2ZW5pciBwb3VyIGfDqXJlciBsZSBjYXMgb8O5IGxvY2FsLnN0b3JhZ2Ugbidlc3QgcGFzIGNvbm51IHBvdXIgdXRpbGlzZXIgY29va2llXG4gICAgXG5leHBvcnQgY29uc3Qgc2F2ZUxvY2FseSA9IChuYW1lLCBkYXRhKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldExvY2FseSA9IChuYW1lLCBqc29uPWZhbHNlKSA9Plxue1xuICAgIGlmKGpzb24pXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWUpKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUxvY2FseSA9IChuYW1lKSA9Plxue1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpO1xufSIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG4vLyBGb25jdGlvbiBhc3NvY2lhbnQgbGVzIGF0dHJpYnV0cyBmb3VybmlzIMOgIHVuIGNoYW1wIGRlIGZvcm11bGFpcmVcbmV4cG9ydCBjb25zdCBhZGRFbGVtZW50ID0gKGVsdFBhcmVudCwgZWx0VHlwZSwgZWx0Q29udGVudD1cIlwiLCBlbHRJZD1cIlwiLCBlbHRDbGFzcz1bXSwgZWx0QXR0cmlidXRlcz17fSwgcmVwbGFjZT10cnVlKSA9Plxue1xuICAgIGlmKGlzRW1wdHkoZWx0VHlwZSkgfHwgaXNFbXB0eShlbHRQYXJlbnQpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZWxzZVxuICAgIHtcbiAgICAgICAgY29uc3QgbmV3RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsdFR5cGUpO1xuICAgICAgICBcbiAgICAgICAgaWYoIWlzRW1wdHkoZWx0SWQpKS8vIHRlc3RlciBzaSBsJ2lkIG4nZXN0IHBhcyBkw6lqw6AgdXRpbGlzw6kgZGFucyBsZSBET00gP1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pZD1lbHRJZDtcblxuICAgICAgICBpZihBcnJheS5pc0FycmF5KGVsdENsYXNzKSAmJiBlbHRDbGFzcy5sZW5ndGghPTApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSBpbiBlbHRDbGFzcylcbiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoZWx0Q2xhc3NbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodHlwZW9mIGVsdEF0dHJpYnV0ZXMgPT09IFwib2JqZWN0XCIpIC8vICEhIHRvdXMgbGVzIG9iamV0cyBuZSBzb250IHBhcyBva1xuICAgICAgICB7XG4gICAgICAgICAgICBmb3IobGV0IGF0dHJpYnV0TmFtZSBpbiBlbHRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0TmFtZSwgZWx0QXR0cmlidXRlc1thdHRyaWJ1dE5hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFpc0VtcHR5KGVsdENvbnRlbnQpKVxuICAgICAgICAgICAgbmV3RWxlbWVudC5pbm5lckhUTUw9ZWx0Q29udGVudC5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIik7Ly8gaW5uZXJIVE1MIHBlcm1ldCBkJ2Fqb3V0ZXIgZHUgdGV4dGUgYXlhbnQgbHVpLW3Dqm1lIGRlcyBiYWxpc2VzLCBldGMuXG4gICAgICAgICAgICBcbiAgICAgICAgaWYocmVwbGFjZSlcbiAgICAgICAgICAgIGVsdFBhcmVudC5pbm5lckhUTUw9XCJcIjtcbiAgICAgICAgZWx0UGFyZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuICAgIH0gICAgXG59IiwiLy8gQ2Ugc2NyaXB0IGZvdXJuaXQgZGVzIGZvbmN0aW9ucyB1dGlsaXPDqWVzIHN1ciB0b3V0ZXMgbGVzIHBhZ2VzIGR1IHNpdGVcblxuZXhwb3J0IGNvbnN0IGhlbGxvRGV2ID0gKCkgPT5cbntcbiAgICBjb25zb2xlLmxvZyhcIioqKiogSGVsbG8gYW1pIGTDqXZlbG9wcGV1ciA6LSlcXG5cXG5MZSBjb2RlIGRlIFdpa2lMZXJuaSBlc3QgbGlicmUgZXQgdm91cyBwb3V2ZXogbGUgdHJvdXZlciBzaSBHaXRsYWIgOlxcbmh0dHBzOi8vZ2l0bGFiLmNvbS9sZWZhYmxhYi93aWtpbGVybmlcXG5cXG5Qb3VyIGxlcyBzdWdnZXN0aW9ucyBkJ2Ftw6lsaW9yYXRpb24gb3UgcXVlc3Rpb25zIDogZGV2QHdpbGlsZXJuaS5jb20gKioqKlwiKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjY291bnRMaW5rID0gKHN0YXR1cywgY29uZmlnVGVtcGxhdGUpID0+XG57XG4gICAgY29uc3QgbGluaz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFjY291bnRIZWFkTGlua1wiKTtcbiAgICBjb25zdCBob21lUGFnZT1zdGF0dXMrXCJIb21lUGFnZVwiO1xuICAgIGxpbmsuaHJlZj1cIi9cIitjb25maWdUZW1wbGF0ZVtob21lUGFnZV07XG59IiwiaW1wb3J0IHsgYXBpVXJsLCBhdmFpbGFibGVMYW5ncywgc2l0ZVVybCwgdGhlbWUgfSBmcm9tIFwiLi4vLi4vLi4vY29uZmlnL2luc3RhbmNlLmpzXCI7XG5jb25zdCBsYW5nPWF2YWlsYWJsZUxhbmdzWzBdO1xuXG5jb25zdCBjb25maWdUZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi92aWV3cy9cIit0aGVtZStcIi9jb25maWcvXCIrbGFuZytcIi5qc1wiKTtcblxuaW1wb3J0IHsgIGNoZWNrTG9naW5Sb3V0ZSwgdGltZURpZmZlcmVuY2VNYXgsIHRpbWVEaWZmZXJlbmNlTWluLCB1c2VyUm91dGVzIH0gZnJvbSBcIi4uLy4uLy4uL2NvbmZpZy91c2Vycy5qc1wiO1xuXG5pbXBvcnQgeyBnZXRMb2NhbHksIHJlbW92ZUxvY2FseSwgc2F2ZUxvY2FseSB9IGZyb20gXCIuL2NsaWVudHN0b3JhZ2UuanNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwiLi4vLi4vLi4vdG9vbHMvbWFpblwiO1xuXG5leHBvcnQgY29uc3QgZ2V0VGltZURpZmZlcmVuY2UgPSAoKSA9Plxue1xuICAgIC8vIG11bHRpcGxpZXIgcGFyIC0xLCBjYXIgYydlc3QgY2UgcXUnaWwgZmF1dCBcImFqb3V0ZXJcIiDDoCBsJ2hldXJlIFVUQyBwb3VyIHJldmVuaXIgZW4gaGV1cmUgbG9jYWxlIHF1aSBtJ2ludMOpcmVzc2UgZXQgbm9uIGwnaW52ZXJzZVxuICAgIGNvbnN0IHRpbWVMb2NhbD1uZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqLTE7XG4gICAgaWYodGltZUxvY2FsID4gdGltZURpZmZlcmVuY2VNYXggfHwgdGltZUxvY2FsIDwgdGltZURpZmZlcmVuY2VNaW4pXG4gICAgICAgIHJldHVybiAwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHRpbWVMb2NhbDtcbn1cblxuLy8gSid1dGlsaXNlIGxlIHN0b2NrYWdlIGxvY2FsIGR1IG5hdmlnYXRldXIgcG91ciBlbnJlZ2lzdHJlciBsZXMgZG9ubsOpZXMgcGVybWV0dGFudCBkZSByZWNvbm5hw650cmUgbCd1dGlsaXNhdGV1ciBwYXIgbGEgc3VpdGVcbi8vIFNldWwgbGUgc2VydmV1ciBwb3VycmEgdsOpcmlmaWVyIHF1ZSBsZXMgaWRlbnRpZmlhbnRzIHNvbnQgKHRvdWpvdXJzKSB2YWxpZGVzLlxuZXhwb3J0IGNvbnN0IHNldFNlc3Npb24gPSAodXNlcklkLCB0b2tlbiwgZHVyYXRpb25UUykgPT5cbntcbiAgICBjb25zdCBzdG9yYWdlVXNlcj1cbiAgICB7XG4gICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uVFNcbiAgICB9XG4gICAgc2F2ZUxvY2FseShcInVzZXJcIiwgc3RvcmFnZVVzZXIpO1xufVxuXG4vLyBWw6lyaWZpZSBxdSdpbCB5IGEgZGVzIGRvbm7DqWVzIGxvY2FsZXMgY29uY2VybmFudCBsZSByw6lzdWx0YXQgZCd1biBxdWl6IG91IGQndW4gZ3JvdXBlIGRlIHF1aXpzXG4vLyBFdCBsZXMgYWpvdXRlIGF1eCBkb25uw6llcyBlbnZvecOpZXMgcGFyIGxlcyBmb3JtdWxhaXJlcyBkJ2luc2NyaXB0aW9uL2Nvbm5leGlvbiBzaSBjJ2VzdCBsZSBjYXNcbmV4cG9ydCBjb25zdCBjaGVja0Fuc3dlckRhdGFzID0gKGRhdGFzKSA9Plxue1xuICAgIGNvbnN0IGxhc3RBbnN3ZXI9Z2V0TG9jYWx5KFwibGFzdEFuc3dlclwiKTtcbiAgICBpZighaXNFbXB0eShsYXN0QW5zd2VyKSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGFuc3dlcj1KU09OLnBhcnNlKGxhc3RBbnN3ZXIpO1xuICAgICAgICBpZighaXNFbXB0eShhbnN3ZXIuZHVyYXRpb24pICYmICFpc0VtcHR5KGFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzKSAmJiAhaXNFbXB0eShhbnN3ZXIubmJRdWVzdGlvbnMpICYmICghaXNFbXB0eShhbnN3ZXIuUXVlc3Rpb25uYWlyZUlkKSB8fCAhaXNFbXB0eShhbnN3ZXIuR3JvdXBJZCkpKVxuICAgICAgICB7XG4gICAgICAgICAgICBkYXRhcy5kdXJhdGlvbj1hbnN3ZXIuZHVyYXRpb247XG4gICAgICAgICAgICBkYXRhcy5uYkNvcnJlY3RBbnN3ZXJzPWFuc3dlci5uYkNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgICAgZGF0YXMubmJRdWVzdGlvbnM9YW5zd2VyLm5iUXVlc3Rpb25zO1xuICAgICAgICAgICAgaWYoIWlzRW1wdHkoYW5zd2VyLlF1ZXN0aW9ubmFpcmVJZCkpXG4gICAgICAgICAgICAgICAgZGF0YXMuUXVlc3Rpb25uYWlyZUlkPWFuc3dlci5RdWVzdGlvbm5haXJlSWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZGF0YXMuR3JvdXBJZD1hbnN3ZXIuR3JvdXBJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YXM7XG59XG5cbi8vIENldHRlIGZvbmN0aW9uIHRlc3RlIGxhIGNvbm5leGlvbiBkZSBsJ3V0aWxpc2F0ZXVyIGQndW5lIHBhZ2Vcbi8vIE9uIHBldXQgZm91cm5pcyB1bmUgbGlzdGUgZGUgc3RhdHV0cyBhY2NlcHTDqXMgKHNpIHZpZGUgPSB0b3VzKSwgYWluc2kgcXUndW5lIHVybCBkZSByZWRpcmVjdGlvbiBzaSBub24gY29ubmVjdMOpLCB1biBtZXNzYWdlIGQnZXJyZXVyIMOgIGFmZmljaGVyIHN1ciBsYSBwYWdlIGRlIGRlc3RpbmF0aW9uIGV0IGwndXJsIHN1ciBsYXF1ZWxsZSByZXZlbmlyIHVuZSBmb2lzIGNvbm5lY3TDqVxuZXhwb3J0IGNvbnN0IGNoZWNrU2Vzc2lvbiA9IGFzeW5jIChzdGF0dXM9W10sIHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpID0+XG57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAge1xuICAgICAgICBjb25zdCB1c2VyRGF0YXM9Z2V0TG9jYWx5KFwidXNlclwiKTtcbiAgICAgICAgaWYoaXNFbXB0eSh1c2VyRGF0YXMpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXI9SlNPTi5wYXJzZSh1c2VyRGF0YXMpO1xuICAgICAgICAgICAgaWYoaXNFbXB0eSh1c2VyLmlkKSB8fMKgaXNFbXB0eSh1c2VyLnRva2VuKSB8fCBpc0VtcHR5KHVzZXIuZHVyYXRpb24pIHx8IHVzZXIuZHVyYXRpb24gPCBEYXRlLm5vdygpKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVc2VyKHVybFJlZGlyZWN0aW9uLCBtZXNzYWdlLCB1cmxXYW50ZWQpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIHhoci5vcGVuKFwiR0VUXCIsIGFwaVVybCt1c2VyUm91dGVzK2NoZWNrTG9naW5Sb3V0ZSt1c2VyLnRva2VuKTtcbiAgICAgICAgICAgICAgICB4aHIub25sb2FkID0gKCkgPT5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZT1KU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwICYmIHJlc3BvbnNlLmlzVmFsaWQgJiYgcmVzcG9uc2UuaWQgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZS5pZD09PXVzZXIuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5uYW1lPXJlc3BvbnNlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5sYW5ndWFnZT1yZXNwb25zZS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnRpbWVEaWZmZXJlbmNlPXJlc3BvbnNlLnRpbWVEaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuc3RhdHVzPXJlc3BvbnNlLnN0YXR1czsvLyBjJ2VzdCBsZSB0b2tlbiBxdWkgc2VydCDDoCB2w6lyaWZpZXIgbGUgc3RhdHV0IMOgIGNoYXF1ZSByZXF1w6p0ZSDDoCBsJ0FQSVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVMb2NhbHkoXCJ1c2VyXCIsIHVzZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpIGlsIHMnYWdpdCBkJ3VuIFwidXNlclwiIGV0IHF1ZSBzb24gYWJvbm5lbWVudCBhIGV4cGlyw6ksIGplIGxlIHJlZGlyaWdlIHZlcnMgbGEgY2Fpc3NlIDotKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnN0YXR1cz09PVwidXNlclwiICYmIHJlc3BvbnNlLm5iRGF5c09rIDw9IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxBY2NvdW50PXNpdGVVcmwrXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YodXJsQWNjb3VudCk9PT0tMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oXCIvXCIrY29uZmlnVGVtcGxhdGUuYWNjb3VudFBhZ2UrXCIjc3Vic2NyaWJlXCIpOy8vIHBhc3PDqWUgZGlyZWN0ZW1lbnQgaWNpLCBsJ2FuY3JlICNzdWJzY3JpYmUgbmUgZm9uY3Rpb25uZSBwYXMgIT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzLmxlbmd0aCE9PTAgJiYgc3RhdHVzLmluZGV4T2YocmVzcG9uc2Uuc3RhdHVzKT09PS0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2NhbHkoXCJ1c2VyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0VXNlcih1cmxSZWRpcmVjdGlvbiwgbWVzc2FnZSwgdXJsV2FudGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxvY2FseShcInVzZXJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdFVzZXIodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9ICgpID0+IHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgeGhyLnNlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQ2V0dGUgZm9uY3Rpb24gc2VydCDDoCBsYSBwcsOpY8OpZGVudGUgZW4gY2FzIGRlIGNvbm5leGlvbiBub24gdmFsaWRlXG5jb25zdCByZWRpcmVjdFVzZXIgPSAodXJsUmVkaXJlY3Rpb24sIG1lc3NhZ2UsIHVybFdhbnRlZCkgPT5cbntcbiAgICBpZighaXNFbXB0eShtZXNzYWdlKSlcbiAgICAgICAgc2F2ZUxvY2FseShcIm1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgaWYoIWlzRW1wdHkodXJsV2FudGVkKSlcbiAgICAgICAgc2F2ZUxvY2FseShcInVybFwiLCB1cmxXYW50ZWQpO1xuICAgIGlmKCFpc0VtcHR5KHVybFJlZGlyZWN0aW9uKSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbih1cmxSZWRpcmVjdGlvbik7XG59Il0sInNvdXJjZVJvb3QiOiIifQ==
|