UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

227 lines 21.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { browser, by, element, $$, protractor } from 'protractor'; /** * AbstractTestPage provides common functionality for e2e tests that make use of * the MoH Common Lib. For example, `getNameComponent()` and * `getNameComponentVal()` both correspond to the NameComponent. * @abstract */ export class AbstractTestPage { constructor() { /** * Clicking this button should complete the page, navigate to the next one. * We default it to `.form-bar .submit` but you may overwrite as necessary. */ this.continueButton = element(by.css('.form-bar .submit')); /** * This is the 'Skip To Content' button for Screen Readers that appears when * tabbed to. May be overwritten as necessary. */ this.skipToContentButton = element(by.css('.skip-to-content')); } /** * @return {?} */ continue() { this.continueButton.click(); } /** * @return {?} */ getContinueButton() { return this.continueButton; } /** * Scrolls down to the bottom of the page * @return {?} */ scrollDown() { browser.executeScript('window.scrollTo(0, document.body.scrollHeight)'); } /** * @return {?} */ clickSkipToContent() { this.skipToContentButton.click(); } /** * **NameComponent** - Returns the NameComponent for an associated human * readable label. If the label is a duplicate it will grab the first one * only. * * TODO: Update to "common-name" component when it's imported from PRIME * * @param {?} labelName Human redable label name. * @return {?} */ getNameComponent(labelName) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const label = element.all(by.cssContainingText('lib-prime-name label', labelName)).first(); return element(by.id(yield label.getAttribute('for'))); }); } /** * **NameComponent** - Returns the value within a given NameComponent * * TODO: Update to "common-name" component when it's imported from PRIME * * @param {?} labelName Human readable label name * @return {?} */ getNameComponentVal(labelName) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return (yield this.getNameComponent(labelName)).getAttribute('value'); }); } /** * @return {?} */ formErrors() { return $$('[role=alert] .text-danger'); } /** * Selects from an ng-select component. This includes DropdownComponent * others, like country, province, etc. * * TODO - Need to test this works! Right now just copied from GitHub with * minor tweaks. IDEA - Mirror getNameComponent, where we lookup via the label * text and use the 'for' attribute. * * @param {?} labelId corresponds to labelForId on the <ng-select> * @param {?} optionText the option we want to select * @return {?} */ selectOption(labelId, optionText) { element(by.css(`ng-select[id="${labelId}"]`)).click(); // opens dropdown element(by.cssContainingText('span.ng-option-label', optionText)).click(); // selects option by provided text } /** * Works on same NgSelect components but it sends custom text instead of * selecting a given choice. * @param {?} labelId corresponds to labelForId on the <ng-select> * @param {?} data the text we want to type * @return {?} */ typeOption(labelId, data) { element(by.css(`ng-select[id="${labelId}"]`)).click(); // opens dropdown element(by.css(`input[role="combobox"]`)).sendKeys(data); // type option browser.actions().sendKeys(protractor.Key.ENTER).perform(); // hit enter key } /** * Enter text into an input via ng-reflect-name component * @param {?} refNameVal Value of ng-reflect-name component * @param {?} text Text to enter into the input * @return {?} */ typeText(refNameVal, text) { element(by.css(`input[ng-reflect-name^="${refNameVal}"]`)).sendKeys(text); } /** * Clicks the button based on the text specified * @param {?} classVal Human readable class value for a button * @param {?} text Text inside the button * @return {?} */ clickButton(classVal, text) { element(by.cssContainingText(`button[class*="${classVal}"]`, text)).click(); } /** * Clicks the check box based on the ng-reflect-name component * @param {?} refNameVal Value of ng-reflect-name component * @return {?} */ clickCheckBox(refNameVal) { element(by.css(`input[ng-reflect-name="${refNameVal}"]`)).click(); } /** * Clicks the checkbox which means the user agrees with the info collection notice. * InfoColectionNoticeComponent <common-collection-modal> * @return {?} */ agreeConsentModal() { element(by.css('label[for="agree"]')).element(by.css('strong')).click(); } /** * Clicks continue inside the modal * InfoColectionNoticeComponent <common-collection-modal> * @return {?} */ clickConsentModalContinue() { element(by.css('div[class="modal-footer"]')).element(by.css('button[type="submit"]')).click(); } /** * Checks if the consent modal is currently displayed or not * @return {?} */ checkConsentModal() { return element(by.css('common-consent-modal')).element(by.css('div[aria-labelledby="myLargeModalLabel"]')).isDisplayed(); } /** * Scrolls up to the top of the page * @return {?} */ scrollUp() { browser.executeScript('window.scrollTo(0,0)'); } /** * Types the text inside the first ocurrence of input field * @param {?} refNameVal Value of ng-reflect-name component * @param {?} text Text to enter into the input * @return {?} */ typeTextFirstOccurrence(refNameVal, text) { element.all(by.css(`input[ng-reflect-name^="${refNameVal}"]`)).first().sendKeys(text); } /** * Clicks the link based from the label and text provided * @param {?} label * @param {?} text * @return {?} */ clickLink(label, text) { element(by.cssContainingText(label, text)).click(); } /** * Counts the number of options inside a dropdown box * @param {?} refNameVal * @return {?} */ countLength(refNameVal) { return $$(`select[ng-reflect-name^="${refNameVal}"] option`); } } if (false) { /** * Clicking this button should complete the page, navigate to the next one. * We default it to `.form-bar .submit` but you may overwrite as necessary. * @type {?} */ AbstractTestPage.prototype.continueButton; /** * This is the 'Skip To Content' button for Screen Readers that appears when * tabbed to. May be overwritten as necessary. * @type {?} */ AbstractTestPage.prototype.skipToContentButton; /** * Every class should override this to point to the page it is testing. * Calling navigateTo should go to the corresponding url this page tests. * * * Note - We encourage hardcoding all links in e2e tests and _not_ sharing a * constants file with the application. While this leads to more work, it * avoids the case where incorrect constants (e.g. a typo in a URL) pass the * tests. * * \@example * return browser.get('/enrolment/profile'); * @abstract * @return {?} */ AbstractTestPage.prototype.navigateTo = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGVzdC1wYWdlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbW9oLWNvbW1vbi1saWIvZTJlLyIsInNvdXJjZXMiOlsiYWJzdHJhY3QtdGVzdC1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7QUFPOUUsTUFBTSxPQUFnQixnQkFBZ0I7SUFBdEM7Ozs7O1FBS1MsbUJBQWMsR0FBZSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Ozs7O1FBS2xFLHdCQUFtQixHQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQTJLL0UsQ0FBQzs7OztJQTNKQyxRQUFRO1FBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDOzs7O0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBR0QsVUFBVTtRQUNSLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUMxRSxDQUFDOzs7O0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDOzs7Ozs7Ozs7OztJQVdLLGdCQUFnQixDQUFDLFNBQWlCOzs7a0JBQ2hDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUMxRixPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFD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QUFFLENBQUMsR0FBRyxDQUFDLDJCQUEyQixVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFGLENBQUM7Ozs7Ozs7SUFPRCxTQUFTLENBQUMsS0FBYSxFQUFFLElBQVk7UUFDakMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7SUFNRCxXQUFXLENBQUMsVUFBa0I7UUFDMUIsT0FBTyxFQUFFLENBQUMsNEJBQTRCLFVBQVUsV0FBVyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGOzs7Ozs7O0lBaExDLDBDQUF5RTs7Ozs7O0lBS3pFLCtDQUE2RTs7Ozs7Ozs7Ozs7Ozs7O0lBYzdFLHdEQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJyb3dzZXIsIGJ5LCBlbGVtZW50LCBXZWJFbGVtZW50LCAkJCwgcHJvdHJhY3RvciB9IGZyb20gJ3Byb3RyYWN0b3InO1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0VGVzdFBhZ2UgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGUyZSB0ZXN0cyB0aGF0IG1ha2UgdXNlIG9mXHJcbiAqIHRoZSBNb0ggQ29tbW9uIExpYi4gIEZvciBleGFtcGxlLCBgZ2V0TmFtZUNvbXBvbmVudCgpYCBhbmRcclxuICogYGdldE5hbWVDb21wb25lbnRWYWwoKWAgIGJvdGggY29ycmVzcG9uZCB0byB0aGUgTmFtZUNvbXBvbmVudC5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RQYWdlIHtcclxuICAvKipcclxuICAgKiBDbGlja2luZyB0aGlzIGJ1dHRvbiBzaG91bGQgY29tcGxldGUgdGhlIHBhZ2UsIG5hdmlnYXRlIHRvIHRoZSBuZXh0IG9uZS5cclxuICAgKiBXZSBkZWZhdWx0IGl0IHRvIGAuZm9ybS1iYXIgLnN1Ym1pdGAgYnV0IHlvdSBtYXkgb3ZlcndyaXRlIGFzIG5lY2Vzc2FyeS5cclxuICAgKi9cclxuICBwdWJsaWMgY29udGludWVCdXR0b246IFdlYkVsZW1lbnQgPSBlbGVtZW50KGJ5LmNzcygnLmZvcm0tYmFyIC5zdWJtaXQnKSk7XHJcbiAgLyoqXHJcbiAgICogVGhpcyBpcyB0aGUgJ1NraXAgVG8gQ29udGVudCcgYnV0dG9uIGZvciBTY3JlZW4gUmVhZGVycyB0aGF0IGFwcGVhcnMgd2hlblxyXG4gICAqIHRhYmJlZCB0by4gTWF5IGJlIG92ZXJ3cml0dGVuIGFzIG5lY2Vzc2FyeS5cclxuICAgKi9cclxuICBwdWJsaWMgc2tpcFRvQ29udGVudEJ1dHRvbjogV2ViRWxlbWVudCA9IGVsZW1lbnQoYnkuY3NzKCcuc2tpcC10by1jb250ZW50JykpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVyeSBjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBwb2ludCB0byB0aGUgcGFnZSBpdCBpcyB0ZXN0aW5nLlxyXG4gICAqIENhbGxpbmcgbmF2aWdhdGVUbyBzaG91bGQgZ28gdG8gdGhlIGNvcnJlc3BvbmRpbmcgdXJsIHRoaXMgcGFnZSB0ZXN0cy4gICAqXHJcbiAgICpcclxuICAgKiBOb3RlIC0gV2UgZW5jb3VyYWdlIGhhcmRjb2RpbmcgYWxsIGxpbmtzIGluIGUyZSB0ZXN0cyBhbmQgX25vdF8gc2hhcmluZyBhXHJcbiAgICogY29uc3RhbnRzIGZpbGUgd2l0aCB0aGUgYXBwbGljYXRpb24uIFdoaWxlIHRoaXMgbGVhZHMgdG8gbW9yZSB3b3JrLCBpdFxyXG4gICAqIGF2b2lkcyB0aGUgY2FzZSB3aGVyZSBpbmNvcnJlY3QgY29uc3RhbnRzIChlLmcuIGEgdHlwbyBpbiBhIFVSTCkgcGFzcyB0aGVcclxuICAgKiB0ZXN0cy5cclxuICAgKlxyXG4gICBAZXhhbXBsZVxyXG4gICAqICAgIHJldHVybiBicm93c2VyLmdldCgnL2Vucm9sbWVudC9wcm9maWxlJyk7XHJcbiAgICovXHJcbiAgYWJzdHJhY3QgbmF2aWdhdGVUbygpOiBhbnk7XHJcblxyXG4gIGNvbnRpbnVlKCkge1xyXG4gICAgdGhpcy5jb250aW51ZUJ1dHRvbi5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udGludWVCdXR0b24oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250aW51ZUJ1dHRvbjtcclxuICB9XHJcblxyXG4gIC8qKiBTY3JvbGxzIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSAqL1xyXG4gIHNjcm9sbERvd24oKSB7XHJcbiAgICBicm93c2VyLmV4ZWN1dGVTY3JpcHQoJ3dpbmRvdy5zY3JvbGxUbygwLCBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCknKTtcclxuICB9XHJcblxyXG4gIGNsaWNrU2tpcFRvQ29udGVudCgpIHtcclxuICAgIHRoaXMuc2tpcFRvQ29udGVudEJ1dHRvbi5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogKipOYW1lQ29tcG9uZW50KiogLSBSZXR1cm5zIHRoZSBOYW1lQ29tcG9uZW50IGZvciBhbiBhc3NvY2lhdGVkIGh1bWFuXHJcbiAgICogcmVhZGFibGUgbGFiZWwuIElmIHRoZSBsYWJlbCBpcyBhIGR1cGxpY2F0ZSBpdCB3aWxsIGdyYWIgdGhlIGZpcnN0IG9uZVxyXG4gICAqIG9ubHkuXHJcbiAgICpcclxuICAgKiBUT0RPOiBVcGRhdGUgdG8gXCJjb21tb24tbmFtZVwiIGNvbXBvbmVudCB3aGVuIGl0J3MgaW1wb3J0ZWQgZnJvbSBQUklNRVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGxhYmVsTmFtZSBIdW1hbiByZWRhYmxlIGxhYmVsIG5hbWUuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0TmFtZUNvbXBvbmVudChsYWJlbE5hbWU6IHN0cmluZyk6IFByb21pc2U8V2ViRWxlbWVudD4ge1xyXG4gICAgY29uc3QgbGFiZWwgPSBlbGVtZW50LmFsbChieS5jc3NDb250YWluaW5nVGV4dCgnbGliLXByaW1lLW5hbWUgbGFiZWwnLCBsYWJlbE5hbWUpKS5maXJzdCgpO1xyXG4gICAgcmV0dXJuIGVsZW1lbnQoYnkuaWQoYXdhaXQgbGFiZWwuZ2V0QXR0cmlidXRlKCdmb3InKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogKipOYW1lQ29tcG9uZW50KiogLSBSZXR1cm5zIHRoZSB2YWx1ZSB3aXRoaW4gYSBnaXZlbiBOYW1lQ29tcG9uZW50XHJcbiAgICpcclxuICAgKiBUT0RPOiBVcGRhdGUgdG8gXCJjb21tb24tbmFtZVwiIGNvbXBvbmVudCB3aGVuIGl0J3MgaW1wb3J0ZWQgZnJvbSBQUklNRVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGxhYmVsTmFtZSBIdW1hbiByZWFkYWJsZSBsYWJlbCBuYW1lXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0TmFtZUNvbXBvbmVudFZhbChsYWJlbE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0TmFtZUNvbXBvbmVudChsYWJlbE5hbWUpKS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7XHJcbiAgfVxyXG5cclxuICBmb3JtRXJyb3JzKCkge1xyXG4gICAgcmV0dXJuICQkKCdbcm9sZT1hbGVydF0gLnRleHQtZGFuZ2VyJyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWxlY3RzIGZyb20gYW4gbmctc2VsZWN0IGNvbXBvbmVudC4gVGhpcyBpbmNsdWRlcyBEcm9wZG93bkNvbXBvbmVudFxyXG4gICAqIG90aGVycywgbGlrZSBjb3VudHJ5LCBwcm92aW5jZSwgZXRjLlxyXG4gICAqXHJcbiAgICogVE9ETyAtIE5lZWQgdG8gdGVzdCB0aGlzIHdvcmtzISBSaWdodCBub3cganVzdCBjb3BpZWQgZnJvbSBHaXRIdWIgd2l0aFxyXG4gICAqIG1pbm9yIHR3ZWFrcy4gSURFQSAtIE1pcnJvciBnZXROYW1lQ29tcG9uZW50LCB3aGVyZSB3ZSBsb29rdXAgdmlhIHRoZSBsYWJlbFxyXG4gICAqIHRleHQgYW5kIHVzZSB0aGUgJ2ZvcicgYXR0cmlidXRlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGxhYmVsSWQgY29ycmVzcG9uZHMgdG8gbGFiZWxGb3JJZCBvbiB0aGUgPG5nLXNlbGVjdD5cclxuICAgKiBAcGFyYW0gb3B0aW9uVGV4dCB0aGUgb3B0aW9uIHdlIHdhbnQgdG8gc2VsZWN0XHJcbiAgICovXHJcbiAgc2VsZWN0T3B0aW9uKGxhYmVsSWQ6IHN0cmluZywgb3B0aW9uVGV4dDogc3RyaW5nKSB7XHJcbiAgICBlbGVtZW50KGJ5LmNzcyhgbmctc2VsZWN0W2lkPVwiJHtsYWJlbElkfVwiXWApKS5jbGljaygpOyAvLyBvcGVucyBkcm9wZG93blxyXG4gICAgZWxlbWVudChieS5jc3NDb250YWluaW5nVGV4dCgnc3Bhbi5uZy1vcHRpb24tbGFiZWwnLCBvcHRpb25UZXh0KSkuY2xpY2soKTsgLy8gc2VsZWN0cyBvcHRpb24gYnkgcHJvdmlkZWQgdGV4dFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV29ya3Mgb24gc2FtZSBOZ1NlbGVjdCBjb21wb25lbnRzIGJ1dCBpdCBzZW5kcyBjdXN0b20gdGV4dCBpbnN0ZWFkIG9mXHJcbiAgICogc2VsZWN0aW5nIGEgZ2l2ZW4gY2hvaWNlLlxyXG4gICAqIEBwYXJhbSBsYWJlbElkIGNvcnJlc3BvbmRzIHRvIGxhYmVsRm9ySWQgb24gdGhlIDxuZy1zZWxlY3Q+XHJcbiAgICogQHBhcmFtIGRhdGEgdGhlIHRleHQgd2Ugd2FudCB0byB0eXBlXHJcbiAgICovXHJcbiAgdHlwZU9wdGlvbihsYWJlbElkOiBzdHJpbmcsIGRhdGE6IHN0cmluZykge1xyXG4gICAgZWxlbWVudChieS5jc3MoYG5nLXNlbGVjdFtpZD1cIiR7bGFiZWxJZH1cIl1gKSkuY2xpY2soKTsgLy8gb3BlbnMgZHJvcGRvd25cclxuICAgIGVsZW1lbnQoYnkuY3NzKGBpbnB1dFtyb2xlPVwiY29tYm9ib3hcIl1gKSkuc2VuZEtleXMoZGF0YSk7IC8vIHR5cGUgb3B0aW9uXHJcbiAgICBicm93c2VyLmFjdGlvbnMoKS5zZW5kS2V5cyhwcm90cmFjdG9yLktleS5FTlRFUikucGVyZm9ybSgpOyAvLyBoaXQgZW50ZXIga2V5XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbnRlciB0ZXh0IGludG8gYW4gaW5wdXQgdmlhIG5nLXJlZmxlY3QtbmFtZSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0gcmVmTmFtZVZhbCBWYWx1ZSBvZiBuZy1yZWZsZWN0LW5hbWUgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIHRleHQgVGV4dCB0byBlbnRlciBpbnRvIHRoZSBpbnB1dFxyXG4gICAqL1xyXG4gIHR5cGVUZXh0KHJlZk5hbWVWYWw6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XHJcbiAgICBlbGVtZW50KGJ5LmNzcyhgaW5wdXRbbmctcmVmbGVjdC1uYW1lXj1cIiR7cmVmTmFtZVZhbH1cIl1gKSkuc2VuZEtleXModGV4dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGlja3MgdGhlIGJ1dHRvbiBiYXNlZCBvbiB0aGUgdGV4dCBzcGVjaWZpZWRcclxuICAgKiBAcGFyYW0gY2xhc3NWYWwgSHVtYW4gcmVhZGFibGUgY2xhc3MgdmFsdWUgZm9yIGEgYnV0dG9uXHJcbiAgICogQHBhcmFtIHRleHQgVGV4dCBpbnNpZGUgdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGNsaWNrQnV0dG9uKGNsYXNzVmFsOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xyXG4gICAgZWxlbWVudChieS5jc3NDb250YWluaW5nVGV4dChgYnV0dG9uW2NsYXNzKj1cIiR7Y2xhc3NWYWx9XCJdYCwgdGV4dCkpLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGlja3MgdGhlIGNoZWNrIGJveCBiYXNlZCBvbiB0aGUgbmctcmVmbGVjdC1uYW1lIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSByZWZOYW1lVmFsIFZhbHVlIG9mIG5nLXJlZmxlY3QtbmFtZSBjb21wb25lbnRcclxuICAgKi9cclxuICBjbGlja0NoZWNrQm94KHJlZk5hbWVWYWw6IHN0cmluZykge1xyXG4gICAgZWxlbWVudChieS5jc3MoYGlucHV0W25nLXJlZmxlY3QtbmFtZT1cIiR7cmVmTmFtZVZhbH1cIl1gKSkuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsaWNrcyB0aGUgY2hlY2tib3ggd2hpY2ggbWVhbnMgdGhlIHVzZXIgYWdyZWVzIHdpdGggdGhlIGluZm8gY29sbGVjdGlvbiBub3RpY2UuXHJcbiAgICogSW5mb0NvbGVjdGlvbk5vdGljZUNvbXBvbmVudCA8Y29tbW9uLWNvbGxlY3Rpb24tbW9kYWw+XHJcbiAgICovXHJcbiAgYWdyZWVDb25zZW50TW9kYWwoKSB7XHJcbiAgICBlbGVtZW50KGJ5LmNzcygnbGFiZWxbZm9yPVwiYWdyZWVcIl0nKSkuZWxlbWVudChieS5jc3MoJ3N0cm9uZycpKS5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xpY2tzIGNvbnRpbnVlIGluc2lkZSB0aGUgbW9kYWxcclxuICAgKiBJbmZvQ29sZWN0aW9uTm90aWNlQ29tcG9uZW50IDxjb21tb24tY29sbGVjdGlvbi1tb2RhbD5cclxuICAgKi9cclxuICBjbGlja0NvbnNlbnRNb2RhbENvbnRpbnVlKCkge1xyXG4gICAgZWxlbWVudChieS5jc3MoJ2RpdltjbGFzcz1cIm1vZGFsLWZvb3RlclwiXScpKS5lbGVtZW50KGJ5LmNzcygnYnV0dG9uW3R5cGU9XCJzdWJtaXRcIl0nKSkuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiB0aGUgY29uc2VudCBtb2RhbCBpcyBjdXJyZW50bHkgZGlzcGxheWVkIG9yIG5vdFxyXG4gICAqL1xyXG4gIGNoZWNrQ29uc2VudE1vZGFsKCkge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQoYnkuY3NzKCdjb21tb24tY29uc2VudC1tb2RhbCcpKS5lbGVtZW50KGJ5LmNzcygnZGl2W2FyaWEtbGFiZWxsZWRieT1cIm15TGFyZ2VNb2RhbExhYmVsXCJdJykpLmlzRGlzcGxheWVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY3JvbGxzIHVwIHRvIHRoZSB0b3Agb2YgdGhlIHBhZ2VcclxuICAgKi9cclxuICBzY3JvbGxVcCgpIHtcclxuICAgICAgYnJvd3Nlci5leGVjdXRlU2NyaXB0KCd3aW5kb3cuc2Nyb2xsVG8oMCwwKScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHlwZXMgdGhlIHRleHQgaW5zaWRlIHRoZSBmaXJzdCBvY3VycmVuY2Ugb2YgaW5wdXQgZmllbGRcclxuICAgKiBAcGFyYW0gcmVmTmFtZVZhbCBWYWx1ZSBvZiBuZy1yZWZsZWN0LW5hbWUgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIHRleHQgVGV4dCB0byBlbnRlciBpbnRvIHRoZSBpbnB1dFxyXG4gICAqL1xyXG4gIHR5cGVUZXh0Rmlyc3RPY2N1cnJlbmNlKHJlZk5hbWVWYWw6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgIGVsZW1lbnQuYWxsKGJ5LmNzcyhgaW5wdXRbbmctcmVmbGVjdC1uYW1lXj1cIiR7cmVmTmFtZVZhbH1cIl1gKSkuZmlyc3QoKS5zZW5kS2V5cyh0ZXh0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsaWNrcyB0aGUgbGluayBiYXNlZCBmcm9tIHRoZSBsYWJlbCBhbmQgdGV4dCBwcm92aWRlZFxyXG4gICAqIEBwYXJhbSBsYWJlbFxyXG4gICAqIEBwYXJhbSB0ZXh0XHJcbiAgICovXHJcbiAgY2xpY2tMaW5rKGxhYmVsOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xyXG4gICAgICBlbGVtZW50KGJ5LmNzc0NvbnRhaW5pbmdUZXh0KGxhYmVsLCB0ZXh0KSkuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIG9wdGlvbnMgaW5zaWRlIGEgZHJvcGRvd24gYm94XHJcbiAgICogQHBhcmFtIHJlZk5hbWVWYWxcclxuICAgKi9cclxuICBjb3VudExlbmd0aChyZWZOYW1lVmFsOiBzdHJpbmcpe1xyXG4gICAgICByZXR1cm4gJCQoYHNlbGVjdFtuZy1yZWZsZWN0LW5hbWVePVwiJHtyZWZOYW1lVmFsfVwiXSBvcHRpb25gKTtcclxuICB9XHJcbn1cclxuIl19