@cabinfo.eu/astrophysics-library
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
470 lines • 45.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* This class define physics constants and calculated physics constants.
*
* Instanciation example :
*
* ```typescript
* const instance = new CPhysicsConstants();
* ```
*
* @remarks
* This method is part of the {@link core-library#Statistics | Statistics subsystem}.
*
* @author Alain Deseine
*
* @copyright CEI Alain Deseine 1992-2019
*
* @beta
*
* Copyright (C) 2019 Alain Deseine
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
export class CConstant {
/**
* Constructor.
*
* The constructor of this class calculate calculated physics constants.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} name
* @param {?} symbol
* @param {?} value
* @param {?} unit
* @param {?} description
*/
constructor(name, symbol, value, unit, description) {
// Set physics constants
this.name = name;
this.symbol = symbol;
this.value = value;
this.unit = unit;
this.description = description;
} // eo constructor
} // eo CConstant class
if (false) {
/** @type {?} */
CConstant.prototype.name;
/** @type {?} */
CConstant.prototype.symbol;
/** @type {?} */
CConstant.prototype.value;
/** @type {?} */
CConstant.prototype.unit;
/** @type {?} */
CConstant.prototype.description;
}
// eo CConstant class
export class CPhysicsConstants {
/**
* Constructor.
*
* The constructor of this class calculate calculated physics constants.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
*/
constructor() {
this.constants = [];
// Set physics constants
this.constants.push(new CConstant('PI constant', 'π', Math.PI, 'None', ''));
this.constants.push(new CConstant('Celerity', 'c', 299792458, 'm.s-1', 'Celerity of light in vaccum'));
this.constants.push(new CConstant('Planck constant', 'h', 6.62607015e-34, 'J.s', 'The Planck constant is a physical constant that is the quantum of electromagnetic action, which relates the energy carried by a photon to its frequency'));
this.constants.push(new CConstant('Boltzmann constant', 'k', 1.38064852e-23, 'J.K-1', 'The Boltzmann constant (kB or k) is a physical constant which relates the average relative kinetic energy of particles in a gas with the temperature of the gas and occurs in Planck\'s law of black-body radiation and in Boltzmann\'s entropy formula.'));
this.constants.push(new CConstant('Gravitational constant', 'G', 6.67408e-11, 'N.m2.kg-2', 'Gravitational constant is an empirical physical constant involved in the calculation of gravitational effects in Isaac Newton\'s law of universal gravitation and in Albert Einstein\'s general theory of relativity.')); // TODO Alain : Vérifier unité
this.constants.push(new CConstant('Elementary charge', 'e', 1.602176634e-19, 'A.s', ''));
this.constants.push(new CConstant('Coulomb', 'C', 1, 'A.s', ''));
this.constants.push(new CConstant('Avogadro constant', 'NA', 6.022140857, 'mol-1', ''));
this.constants.push(new CConstant('Standard acceleration', 'g', 9.80665, 'm.s-2', 'Standard acceleration due to gravity on earth'));
this.constants.push(new CConstant('Bohr radius', 'a0', 0.52917721092, 'Å', 'The Bohr radius is approximately equal to the most probable distance between the nucleus and the electron in a hydrogen atom in its ground state. '));
this.constants.push(new CConstant('Ideal gas constant', 'R', 8.3144598, 'J.K-1.mol-1', ''));
this.constants.push(new CConstant('Unified mass unit (dalton)', 'u', 1.660538921e-27, 'kg', 'Standard unit of mass that quantifies mass on an atomic or molecular scale'));
this.constants.push(new CConstant('Vacuum permeability', 'µ0', 1.2566e-6, 'T.m.A-1', 'Vacuum permeability is the magnetic permeability in a classical vacuum.'));
this.constants.push(new CConstant('Vacuum permittivity', 'ε0', 8.85418782e-12, 'F.m-1', 'Vacuum permittivity is an ideal, (baseline) physical constant, which is the value of the absolute dielectric permittivity of classical vacuum.'));
this.constants.push(new CConstant('Impedance of free space', 'Z0', 376.730, 'Ω', 'The impedance of free space equals the product of the vacuum permeability μ0 and the speed of light in vacuum c0.'));
this.constants.push(new CConstant('Astronomical unit', 'au', 149597870700, 'm', 'Astronomical unit is the distance from Earth to the Sun'));
this.constants.push(new CConstant('Parsec', 'pc', 648000 / Math.PI * 149597870700, 'm', 'The parsec is a unit of length used to measure large distances to astronomical objects outside the Solar System. A parsec is defined as the distance at which one astronomical unit subtends an angle of one arcsecond,[1] which corresponds to 648000/π astronomical units.'));
this.constants.push(new CConstant('Light year', 'lr', 9460730472580800, 'm', 'Light-year is the distance that light travels in vacuum in one Julian year (365.25 days).'));
this.constants.push(new CConstant('Electronvolt', 'eV', 1.602176565e-19, 'J', ''));
// Set physical quantities
/** Solar system object mass */
this.constants.push(new CConstant('Solar mass', 'M☉', 1.9884e30, 'kg', ''));
this.constants.push(new CConstant('Earth mass', 'M⊕', 5.9722e24, 'kg', ''));
this.constants.push(new CConstant('Lunar mass', 'ML', 7.342e22, 'kg', ''));
this.constants.push(new CConstant('Jupiter mass', 'MJ', 1.8986e27, 'kg', ''));
/** Solar system object radius */
this.constants.push(new CConstant('Solar radius', 'R☉', 696342000, 'm', ''));
this.constants.push(new CConstant('Earth radius', 'R⊕', 6378137, 'm', ''));
this.constants.push(new CConstant('Lunar radius', 'RL', 1737400, 'm', ''));
/** Particle mass */
this.constants.push(new CConstant('Electron mass', 'ML', 9.10938291e-31, 'kg', ''));
this.constants.push(new CConstant('Neutron mass', 'ML', 1.67493e-27, 'kg', ''));
this.constants.push(new CConstant('Proton mass', 'ML', 1.672649e-27, 'kg', ''));
this.constants.forEach((/**
* @param {?} element
* @return {?}
*/
element => {
this[element.symbol] = element.value;
}));
}
/**
* getConstantInfo method.
*
* this method simply log to the console class properties and methods.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} name
* @return {?}
*/
getConstantInfo(name) {
return this.constants.find((/**
* @param {?} i
* @return {?}
*/
i => i.symbol === name));
} // eo getConstantInfo method
// eo getConstantInfo method
/**
* logConstants method.
*
* this method simply log to the console class properties and methods.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @return {?}
*/
logConstants() {
console.log(this.constants);
} // eo logConstants method
// eo logConstants method
/**
* toJSON method.
*
* this method return the public and protected object properties.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @return {?}
*/
toJSON() {
/** @type {?} */
let properties = Object.getOwnPropertyNames(this);
return properties;
} // eo toJSON method
// eo toJSON method
/**
*
* Conversion helpers
*
*/
/**
* unit of length conversion helpers
*/
/**
* meter2au method.
*
* this method convert meters to astronomical unit.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
meter2au(value) {
return Math.round(value / this.au * 1000000) / 1000000;
} // eo meter2au method
// eo meter2au method
/**
* au2meter method.
*
* this method convert astronomical unit to meters.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
au2meter(value) {
return value * this.au;
} // eo au2meter method
// eo au2meter method
/**
* au2kilometer method.
*
* this method convert astronomical unit to kilometers.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
au2kilometer(value) {
return value * this.au / 1000;
} // eo au2kilometer method
// eo au2kilometer method
/**
* meter2pc method.
*
* this method convert meters to parsec.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
meter2pc(value) {
return Math.round(value / this.pc * 1000000) / 1000000;
} // eo meter2pc method
// eo meter2pc method
/**
* pc2meter method.
*
* this method convert parsec to meters.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
pc2meter(value) {
return value * this.pc;
} // eo pc2meter method
// eo pc2meter method
/**
* pc2kilometer method.
*
* this method convert parsec to kilometers.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
pc2kilometer(value) {
return value * this.pc / 1000;
} // eo pc2kilometer method
// eo pc2kilometer method
/**
* pc2au method.
*
* this method convert parsec to astronomical unit.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
pc2au(value) {
return this.meter2au(this.pc2meter(value));
} // eo pc2au method
// eo pc2au method
/**
* au2pc method.
*
* this method convert astronomical unit to parsec.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
au2pc(value) {
return this.meter2pc(this.au2meter(value));
} // eo au2pc method
// eo au2pc method
/**
* lr2pc method.
*
* this method convert light year unit to parsec.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
lr2pc(value) {
return this.meter2pc(this.lr2meter(value));
} // eo lr2pc method
// eo lr2pc method
/**
* lr2au method.
*
* this method convert light year to astronomical unit.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
lr2au(value) {
return this.meter2au(this.lr2meter(value));
} // eo lr2au method
// eo lr2au method
/**
* lr2meter method.
*
* this method convert light year to meter.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
lr2meter(value) {
return value * this.lr;
} // eo lr2meter method
// eo lr2meter method
/**
* lr2kilometer method.
*
* this method convert light year to kilometer.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
lr2kilometer(value) {
return value * this.lr / 1000;
} // eo lr2kilometer method
// eo lr2kilometer method
/**
* meter2lr method.
*
* this method convert meter to light year.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
meter2lr(value) {
return Math.round(value / this.lr * 1000000) / 1000000;
} // eo meter2lr method
// eo meter2lr method
/**
* au2lr method.
*
* this method convert astronomical unit to light year.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
au2lr(value) {
return this.meter2lr(this.au2meter(value));
} // eo au2lr method
// eo au2lr method
/**
* pc2lr method.
*
* this method convert parsec to light year.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
pc2lr(value) {
return this.meter2lr(this.pc2meter(value));
} // eo pc2lr method
// eo pc2lr method
/**
* unit of mass conversion helpers
*/
/**
* kg2ev method.
*
* this method convert kilogram to electronvolt.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
kg2ev(value) {
return Math.round((value / this.eV * Math.pow(this.c, 2)) * 1000000) / 1000000;
} // eo kg2ev method
// eo kg2ev method
/**
* ev2kg method.
*
* this method convert kilogram to electronvolt using Albert Einstein formula E=mc2.
*
* \@remarks
* This method is part of the {\@link core-library#Statistics | Statistics subsystem}.
*
* \@beta
* @param {?} value
* @return {?}
*/
ev2kg(value) {
return value * this.eV / Math.pow(this.c, 2);
} // eo ev2kg method
}
if (false) {
/** @type {?} */
CPhysicsConstants.prototype.constants;
/* Skipping unhandled member: [index: string]: any;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN0cm9waHlzaWNzLWxpYnJhcnkucGh5c2ljcy1jb25zdGFudHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2FiaW5mby5ldS9hc3Ryb3BoeXNpY3MtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9hc3Ryb3BoeXNpY3MtbGlicmFyeS5waHlzaWNzLWNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsTUFBTSxPQUFPLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQmxCLFlBQWMsSUFBWSxFQUFFLE1BQWMsRUFBRSxLQUFhLEVBQUUsSUFBWSxFQUFFLFdBQW1CO1FBQ3hGLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFhLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFXLE1BQU0sQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFZLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFhLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFNLFdBQVcsQ0FBQztJQUN0QyxDQUFDLENBQUMsaUJBQWlCO0NBQ3RCLENBQUMscUJBQXFCOzs7SUF6Qm5CLHlCQUFvQjs7SUFDcEIsMkJBQXNCOztJQUN0QiwwQkFBcUI7O0lBQ3JCLHlCQUFvQjs7SUFDcEIsZ0NBQTJCOzs7QUF1Qi9CLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7Ozs7O0lBZ0IxQjtRQWJPLGNBQVMsR0FBa0IsRUFBRSxDQUFDO1FBY2pDLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBRSxJQUFJLFNBQVMsQ0FBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBRSxDQUFFLENBQUM7UUFDaEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUUsSUFBSSxTQUFTLENBQUUsVUFBVSxFQUFF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Ozs7Ozs7Ozs7O0lBY2IsS0FBSyxDQUFFLEtBQWE7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUUsS0FBSyxDQUFFLENBQUUsQ0FBQztJQUNuRCxDQUFDLENBQUMsa0JBQWtCOzs7Ozs7Ozs7Ozs7Ozs7OztJQW9CYixLQUFLLENBQUUsS0FBYTtRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUUsQ0FBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDeEYsQ0FBQyxDQUFDLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7SUFjYixLQUFLLENBQUUsS0FBYTtRQUN2QixPQUFPLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUUsQ0FBQztJQUNuRCxDQUFDLENBQUMsa0JBQWtCO0NBR3ZCOzs7SUE3WUcsc0NBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiICAvKipcbiAgICogVGhpcyBjbGFzcyBkZWZpbmUgcGh5c2ljcyBjb25zdGFudHMgYW5kIGNhbGN1bGF0ZWQgcGh5c2ljcyBjb25zdGFudHMuXG4gICAqXG4gICAqIEluc3RhbmNpYXRpb24gZXhhbXBsZSA6IFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBpbnN0YW5jZSA9IG5ldyBDUGh5c2ljc0NvbnN0YW50cygpO1xuICAgKiBgYGBcbiAgICogXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICogIFxuICAgKiBAYXV0aG9yIEFsYWluIERlc2VpbmVcbiAgICogXG4gICAqIEBjb3B5cmlnaHQgQ0VJIEFsYWluIERlc2VpbmUgMTk5Mi0yMDE5XG4gICAqIFxuICAgKiBAYmV0YSBcbiAgICogXG4gICAqIENvcHlyaWdodCAoQykgMjAxOSBBbGFpbiBEZXNlaW5lXG4gICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxuICAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlXG4gICAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuXG4gICAqIFxuICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFU1xuICAgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GXG4gICAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SXG4gICAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVNcbiAgICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuICAgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOXG4gICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gICAqIFxuICAgKi9cblxuZXhwb3J0IGNsYXNzIENDb25zdGFudCB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc3ltYm9sOiBzdHJpbmc7XG4gICAgcHVibGljIHZhbHVlOiBudW1iZXI7XG4gICAgcHVibGljIHVuaXQ6IHN0cmluZztcbiAgICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdG9yLiBcbiAgICAgKiBcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhpcyBjbGFzcyBjYWxjdWxhdGUgY2FsY3VsYXRlZCBwaHlzaWNzIGNvbnN0YW50cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIGNvbnN0cnVjdG9yICggbmFtZTogc3RyaW5nLCBzeW1ib2w6IHN0cmluZywgdmFsdWU6IG51bWJlciwgdW5pdDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nICkge1xuICAgICAgICAvLyBTZXQgcGh5c2ljcyBjb25zdGFudHNcbiAgICAgICAgdGhpcy5uYW1lICAgICAgICAgICA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3ltYm9sICAgICAgICAgPSBzeW1ib2w7XG4gICAgICAgIHRoaXMudmFsdWUgICAgICAgICAgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51bml0ICAgICAgICAgICA9IHVuaXQ7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gICAgPSBkZXNjcmlwdGlvbjtcbiAgICB9IC8vIGVvIGNvbnN0cnVjdG9yXG59IC8vIGVvIENDb25zdGFudCBjbGFzc1xuXG5leHBvcnQgY2xhc3MgQ1BoeXNpY3NDb25zdGFudHMge1xuXG4gICAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gICAgcHVibGljIGNvbnN0YW50czogQ0NvbnN0YW50W10gICA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IuIFxuICAgICAqIFxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGlzIGNsYXNzIGNhbGN1bGF0ZSBjYWxjdWxhdGVkIHBoeXNpY3MgY29uc3RhbnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICAvLyBTZXQgcGh5c2ljcyBjb25zdGFudHNcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1BJIGNvbnN0YW50JywgJ8+AJywgTWF0aC5QSSwgJ05vbmUnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdDZWxlcml0eScsICdjJywgMjk5NzkyNDU4LCAnbS5zLTEnLCAnQ2VsZXJpdHkgb2YgbGlnaHQgaW4gdmFjY3VtJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdQbGFuY2sgY29uc3RhbnQnLCAnaCcsIDYuNjI2MDcwMTVlLTM0LCAnSi5zJywgJ1RoZSBQbGFuY2sgY29uc3RhbnQgaXMgYSBwaHlzaWNhbCBjb25zdGFudCB0aGF0IGlzIHRoZSBxdWFudHVtIG9mIGVsZWN0cm9tYWduZXRpYyBhY3Rpb24sIHdoaWNoIHJlbGF0ZXMgdGhlIGVuZXJneSBjYXJyaWVkIGJ5IGEgcGhvdG9uIHRvIGl0cyBmcmVxdWVuY3knICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0JvbHR6bWFubiBjb25zdGFudCcsICdrJywgMS4zODA2NDg1MmUtMjMsICdKLkstMScsICdUaGUgQm9sdHptYW5uIGNvbnN0YW50IChrQiBvciBrKSBpcyBhIHBoeXNpY2FsIGNvbnN0YW50IHdoaWNoIHJlbGF0ZXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUga2luZXRpYyBlbmVyZ3kgb2YgcGFydGljbGVzIGluIGEgZ2FzIHdpdGggdGhlIHRlbXBlcmF0dXJlIG9mIHRoZSBnYXMgYW5kIG9jY3VycyBpbiBQbGFuY2tcXCdzIGxhdyBvZiBibGFjay1ib2R5IHJhZGlhdGlvbiBhbmQgaW4gQm9sdHptYW5uXFwncyBlbnRyb3B5IGZvcm11bGEuJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdHcmF2aXRhdGlvbmFsIGNvbnN0YW50JywgJ0cnLCA2LjY3NDA4ZS0xMSwgJ04ubTIua2ctMicsICdHcmF2aXRhdGlvbmFsIGNvbnN0YW50IGlzIGFuIGVtcGlyaWNhbCBwaHlzaWNhbCBjb25zdGFudCBpbnZvbHZlZCBpbiB0aGUgY2FsY3VsYXRpb24gb2YgZ3Jhdml0YXRpb25hbCBlZmZlY3RzIGluIElzYWFjIE5ld3RvblxcJ3MgbGF3IG9mIHVuaXZlcnNhbCBncmF2aXRhdGlvbiBhbmQgaW4gQWxiZXJ0IEVpbnN0ZWluXFwncyBnZW5lcmFsIHRoZW9yeSBvZiByZWxhdGl2aXR5LicgKSApOyAvLyBUT0RPIEFsYWluIDogVsOpcmlmaWVyIHVuaXTDqVxuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnRWxlbWVudGFyeSBjaGFyZ2UnLCdlJywgMS42MDIxNzY2MzRlLTE5LCAnQS5zJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQ291bG9tYicsJ0MnLCAxLCAnQS5zJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQXZvZ2Fkcm8gY29uc3RhbnQnLCdOQScsIDYuMDIyMTQwODU3LCAnbW9sLTEnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdTdGFuZGFyZCBhY2NlbGVyYXRpb24nLCdnJywgOS44MDY2NSwgJ20ucy0yJywgJ1N0YW5kYXJkIGFjY2VsZXJhdGlvbiBkdWUgdG8gZ3Jhdml0eSBvbiBlYXJ0aCcgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQm9ociByYWRpdXMnLCdhMCcsIDAuNTI5MTc3MjEwOTIsICfDhScsICdUaGUgQm9ociByYWRpdXMgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB0aGUgbW9zdCBwcm9iYWJsZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBudWNsZXVzIGFuZCB0aGUgZWxlY3Ryb24gaW4gYSBoeWRyb2dlbiBhdG9tIGluIGl0cyBncm91bmQgc3RhdGUuICcgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnSWRlYWwgZ2FzIGNvbnN0YW50JywnUicsIDguMzE0NDU5OCwgJ0ouSy0xLm1vbC0xJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnVW5pZmllZCBtYXNzIHVuaXQgKGRhbHRvbiknLCd1JywgMS42NjA1Mzg5MjFlLTI3LCAna2cnLCAnU3RhbmRhcmQgdW5pdCBvZiBtYXNzIHRoYXQgcXVhbnRpZmllcyBtYXNzIG9uIGFuIGF0b21pYyBvciBtb2xlY3VsYXIgc2NhbGUnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1ZhY3V1bSBwZXJtZWFiaWxpdHknLCfCtTAnLCAxLjI1NjZlLTYsICdULm0uQS0xJywgJ1ZhY3V1bSBwZXJtZWFiaWxpdHkgaXMgdGhlIG1hZ25ldGljIHBlcm1lYWJpbGl0eSBpbiBhIGNsYXNzaWNhbCB2YWN1dW0uJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdWYWN1dW0gcGVybWl0dGl2aXR5JywnzrUwJywgOC44NTQxODc4MmUtMTIsICdGLm0tMScsICdWYWN1dW0gcGVybWl0dGl2aXR5IGlzIGFuIGlkZWFsLCAoYmFzZWxpbmUpIHBoeXNpY2FsIGNvbnN0YW50LCB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGFic29sdXRlIGRpZWxlY3RyaWMgcGVybWl0dGl2aXR5IG9mIGNsYXNzaWNhbCB2YWN1dW0uJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdJbXBlZGFuY2Ugb2YgZnJlZSBzcGFjZScsJ1owJywgMzc2LjczMCwgJ86pJywgJ1RoZSBpbXBlZGFuY2Ugb2YgZnJlZSBzcGFjZSBlcXVhbHMgdGhlIHByb2R1Y3Qgb2YgdGhlIHZhY3V1bSBwZXJtZWFiaWxpdHkgzrwwIGFuZCB0aGUgc3BlZWQgb2YgbGlnaHQgaW4gdmFjdXVtIGMwLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnQXN0cm9ub21pY2FsIHVuaXQnLCdhdScsIDE0OTU5Nzg3MDcwMCwgJ20nLCAnQXN0cm9ub21pY2FsIHVuaXQgaXMgdGhlIGRpc3RhbmNlIGZyb20gRWFydGggdG8gdGhlIFN1bicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnUGFyc2VjJywncGMnLCA2NDgwMDAgLyBNYXRoLlBJICogMTQ5NTk3ODcwNzAwLCAnbScsICdUaGUgcGFyc2VjIGlzIGEgdW5pdCBvZiBsZW5ndGggdXNlZCB0byBtZWFzdXJlIGxhcmdlIGRpc3RhbmNlcyB0byBhc3Ryb25vbWljYWwgb2JqZWN0cyBvdXRzaWRlIHRoZSBTb2xhciBTeXN0ZW0uIEEgcGFyc2VjIGlzIGRlZmluZWQgYXMgdGhlIGRpc3RhbmNlIGF0IHdoaWNoIG9uZSBhc3Ryb25vbWljYWwgdW5pdCBzdWJ0ZW5kcyBhbiBhbmdsZSBvZiBvbmUgYXJjc2Vjb25kLFsxXSB3aGljaCBjb3JyZXNwb25kcyB0byA2NDgwMDAvz4AgYXN0cm9ub21pY2FsIHVuaXRzLicgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnTGlnaHQgeWVhcicsJ2xyJywgOTQ2MDczMDQ3MjU4MDgwMCwgJ20nLCAnTGlnaHQteWVhciBpcyB0aGUgZGlzdGFuY2UgdGhhdCBsaWdodCB0cmF2ZWxzIGluIHZhY3V1bSBpbiBvbmUgSnVsaWFuIHllYXIgKDM2NS4yNSBkYXlzKS4nICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VsZWN0cm9udm9sdCcsJ2VWJywgMS42MDIxNzY1NjVlLTE5LCAnSicsICcnICkgKTtcblxuICAgICAgICAvLyBTZXQgcGh5c2ljYWwgcXVhbnRpdGllc1xuXG4gICAgICAgIC8qKiBTb2xhciBzeXN0ZW0gb2JqZWN0IG1hc3MgKi9cbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ1NvbGFyIG1hc3MnLCdN4piJJywgMS45ODg0ZTMwLCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdFYXJ0aCBtYXNzJywnTeKKlScsIDUuOTcyMmUyNCwgJ2tnJywgJycgKSApO1xuICAgICAgICB0aGlzLmNvbnN0YW50cy5wdXNoKCBuZXcgQ0NvbnN0YW50KCAnTHVuYXIgbWFzcycsJ01MJywgNy4zNDJlMjIsICdrZycsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0p1cGl0ZXIgbWFzcycsJ01KJywgMS44OTg2ZTI3LCAna2cnLCAnJyApICk7XG5cbiAgICAgICAgLyoqIFNvbGFyIHN5c3RlbSBvYmplY3QgcmFkaXVzICovXG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdTb2xhciByYWRpdXMnLCdS4piJJywgNjk2MzQyMDAwLCAnbScsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VhcnRoIHJhZGl1cycsJ1LiipUnLCA2Mzc4MTM3LCAnbScsICcnICkgKTtcbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0x1bmFyIHJhZGl1cycsJ1JMJywgMTczNzQwMCwgJ20nLCAnJyApICk7XG5cbiAgICAgICAgLyoqIFBhcnRpY2xlIG1hc3MgKi9cbiAgICAgICAgdGhpcy5jb25zdGFudHMucHVzaCggbmV3IENDb25zdGFudCggJ0VsZWN0cm9uIG1hc3MnLCdNTCcsIDkuMTA5MzgyOTFlLTMxLCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdOZXV0cm9uIG1hc3MnLCdNTCcsIDEuNjc0OTNlLTI3LCAna2cnLCAnJyApICk7XG4gICAgICAgIHRoaXMuY29uc3RhbnRzLnB1c2goIG5ldyBDQ29uc3RhbnQoICdQcm90b24gbWFzcycsJ01MJywgMS42NzI2NDllLTI3LCAna2cnLCAnJyApICk7XG5cblxuICAgICAgICB0aGlzLmNvbnN0YW50cy5mb3JFYWNoKCBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXNbZWxlbWVudC5zeW1ib2xdICAgID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBnZXRDb25zdGFudEluZm8gbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBzaW1wbHkgbG9nIHRvIHRoZSBjb25zb2xlIGNsYXNzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgZ2V0Q29uc3RhbnRJbmZvKCBuYW1lOiBzdHJpbmcgKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RhbnRzLmZpbmQoIGkgPT4gaS5zeW1ib2wgPT09IG5hbWUgKTtcbiAgICB9IC8vIGVvIGdldENvbnN0YW50SW5mbyBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbG9nQ29uc3RhbnRzIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2Qgc2ltcGx5IGxvZyB0byB0aGUgY29uc29sZSBjbGFzcyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgIHB1YmxpYyBsb2dDb25zdGFudHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCB0aGlzLmNvbnN0YW50cyApO1xuICAgIH0gLy8gZW8gbG9nQ29uc3RhbnRzIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiB0b0pTT04gbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm4gdGhlIHB1YmxpYyBhbmQgcHJvdGVjdGVkIG9iamVjdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIHRvSlNPTigpOiBPYmplY3Qge1xuICAgICAgICBsZXQgcHJvcGVydGllcyAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyggdGhpcyApO1xuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9IC8vIGVvIHRvSlNPTiBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQ29udmVyc2lvbiBoZWxwZXJzXG4gICAgICogXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiB1bml0IG9mIGxlbmd0aCBjb252ZXJzaW9uIGhlbHBlcnNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIG1ldGVyMmF1IG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBtZXRlcnMgdG8gYXN0cm9ub21pY2FsIHVuaXQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgbWV0ZXIyYXUoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoIHZhbHVlIC8gdGhpcy5hdSAqIDEwMDAwMDAgKSAvIDEwMDAwMDA7XG4gICAgfSAvLyBlbyBtZXRlcjJhdSBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogYXUybWV0ZXIgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGFzdHJvbm9taWNhbCB1bml0IHRvIG1ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJtZXRlciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdmFsdWUgKiB0aGlzLmF1O1xuICAgIH0gLy8gZW8gYXUybWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIGF1MmtpbG9tZXRlciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8ga2lsb21ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5hdSAvIDEwMDA7XG4gICAgfSAvLyBlbyBhdTJraWxvbWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIG1ldGVyMnBjIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBtZXRlcnMgdG8gcGFyc2VjLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIG1ldGVyMnBjKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKCB2YWx1ZSAvIHRoaXMucGMgKiAxMDAwMDAwICkgLyAxMDAwMDAwO1xuICAgIH0gLy8gZW8gbWV0ZXIycGMgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMm1ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIHBjMm1ldGVyKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMucGM7XG4gICAgfSAvLyBlbyBwYzJtZXRlciBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogcGMya2lsb21ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8ga2lsb21ldGVycy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBwYzJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5wYyAvIDEwMDA7XG4gICAgfSAvLyBlbyBwYzJraWxvbWV0ZXIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMmF1IG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gYXN0cm9ub21pY2FsIHVuaXQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgcGMyYXUoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0ZXIyYXUoIHRoaXMucGMybWV0ZXIoIHZhbHVlICkgKTtcbiAgICB9IC8vIGVvIHBjMmF1IG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBhdTJwYyBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8gcGFyc2VjLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGF1MnBjKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGVyMnBjKCB0aGlzLmF1Mm1ldGVyKCB2YWx1ZSApICk7XG4gICAgfSAvLyBlbyBhdTJwYyBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbHIycGMgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGxpZ2h0IHllYXIgdW5pdCB0byBwYXJzZWMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHtAbGluayBjb3JlLWxpYnJhcnkjU3RhdGlzdGljcyB8IFN0YXRpc3RpY3Mgc3Vic3lzdGVtfS5cbiAgICAgKlxuICAgICAqIEBiZXRhXG4gICAgICovXG5cbiAgICBwdWJsaWMgbHIycGMoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0ZXIycGMoIHRoaXMubHIybWV0ZXIoIHZhbHVlICkgKTtcbiAgICB9IC8vIGVvIGxyMnBjIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBscjJhdSBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgbGlnaHQgeWVhciB0byBhc3Ryb25vbWljYWwgdW5pdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBscjJhdSggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJhdSggdGhpcy5scjJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gbHIyYXUgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIGxyMm1ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBsaWdodCB5ZWFyIHRvIG1ldGVyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGxyMm1ldGVyKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMubHI7XG4gICAgfSAvLyBlbyBscjJtZXRlciBtZXRob2RcblxuXG4gICAgLyoqXG4gICAgICogbHIya2lsb21ldGVyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBsaWdodCB5ZWFyIHRvIGtpbG9tZXRlci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBscjJraWxvbWV0ZXIoIHZhbHVlOiBudW1iZXIgKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICogdGhpcy5sciAvIDEwMDA7XG4gICAgfSAvLyBlbyBscjJraWxvbWV0ZXIgbWV0aG9kXG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBtZXRlcjJsciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgbWV0ZXIgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBtZXRlcjJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCggdmFsdWUgLyB0aGlzLmxyICogMTAwMDAwMCApIC8gMTAwMDAwMDtcbiAgICB9IC8vIGVvIG1ldGVyMmxyIG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBhdTJsciBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQgYXN0cm9ub21pY2FsIHVuaXQgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBhdTJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJsciggdGhpcy5hdTJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gYXUybHIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHBjMmxyIG1ldGhvZC4gXG4gICAgICogXG4gICAgICogdGhpcyBtZXRob2QgY29udmVydCBwYXJzZWMgdG8gbGlnaHQgeWVhci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBwYzJsciggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRlcjJsciggdGhpcy5wYzJtZXRlciggdmFsdWUgKSApO1xuICAgIH0gLy8gZW8gcGMybHIgbWV0aG9kXG5cblxuICAgIC8qKlxuICAgICAqIHVuaXQgb2YgbWFzcyBjb252ZXJzaW9uIGhlbHBlcnNcbiAgICAgKi9cblxuXG4gICAgXG4gICAgLyoqXG4gICAgICoga2cyZXYgbWV0aG9kLiBcbiAgICAgKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBjb252ZXJ0IGtpbG9ncmFtIHRvIGVsZWN0cm9udm9sdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBtZXRob2QgaXMgcGFydCBvZiB0aGUge0BsaW5rIGNvcmUtbGlicmFyeSNTdGF0aXN0aWNzIHwgU3RhdGlzdGljcyBzdWJzeXN0ZW19LlxuICAgICAqXG4gICAgICogQGJldGFcbiAgICAgKi9cblxuICAgIHB1YmxpYyBrZzJldiggdmFsdWU6IG51bWJlciApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCggKCB2YWx1ZSAvIHRoaXMuZVYgKiBNYXRoLnBvdyggdGhpcy5jLCAyICkgKSAqIDEwMDAwMDApIC8gMTAwMDAwMDtcbiAgICB9IC8vIGVvIGtnMmV2IG1ldGhvZFxuXG5cbiAgICAvKipcbiAgICAgKiBldjJrZyBtZXRob2QuIFxuICAgICAqIFxuICAgICAqIHRoaXMgbWV0aG9kIGNvbnZlcnQga2lsb2dyYW0gdG8gZWxlY3Ryb252b2x0IHVzaW5nIEFsYmVydCBFaW5zdGVpbiBmb3JtdWxhIEU9bWMyLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSB7QGxpbmsgY29yZS1saWJyYXJ5I1N0YXRpc3RpY3MgfCBTdGF0aXN0aWNzIHN1YnN5c3RlbX0uXG4gICAgICpcbiAgICAgKiBAYmV0YVxuICAgICAqL1xuXG4gICAgcHVibGljIGV2MmtnKCB2YWx1ZTogbnVtYmVyICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAqIHRoaXMuZVYgLyBNYXRoLnBvdyggdGhpcy5jLCAyICk7XG4gICAgfSAvLyBlbyBldjJrZyBtZXRob2RcblxuXG59Il19