homebridge-luxor
Version:
Homebridge Plug-in for the FX Luminaire (Luxor) lighting controller
163 lines • 29.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ILightType = exports.ZD_Light = void 0;
class ZD_Light {
constructor(platform, accessory) {
this.controller = platform.controller;
this.accessory = accessory;
this.log = platform.log;
this.platform = platform;
this.context = this.accessory.context;
this.log.info(`Initializing ${this.accessory.displayName}.`);
this.setServices();
}
setServices() {
// Make sure you provided a name for service otherwise it may not visible in some HomeKit apps.
// if (this.context.status === 'new') {
try {
this.accessory.getService(this.platform.Service.AccessoryInformation)
.setCharacteristic(this.platform.Characteristic.Manufacturer, "Luxor")
.setCharacteristic(this.platform.Characteristic.Model, this.context.type)
.setCharacteristic(this.platform.Characteristic.SerialNumber, this.accessory.UUID);
this.service = this.accessory.getService(this.platform.Service.Lightbulb) || this.accessory.addService(this.platform.Service.Lightbulb);
this.service.setCharacteristic(this.platform.Characteristic.Name, this.accessory.displayName);
this.service.getCharacteristic(this.platform.Characteristic.On)
.on('get', this.getOn.bind(this))
.on('set', this.setOn.bind(this));
this.service.getCharacteristic(this.platform.Characteristic.Brightness)
.on('set', this.setBrightness.bind(this))
.on('get', this.getBrightness.bind(this));
this.context.status = 'current';
this.getCurrentStateAsync().then(() => {
this.setCharacteristics();
}).catch((err) => {
this.log.error(`${this.accessory.displayName} setServices error: ${err}`);
});
}
catch (err) {
this.log.error(`setServices ${err}`);
}
this.accessory.on('identify', async () => {
this.log.info(`Identifying ${this.accessory.displayName}. Lights will flash thrice.`);
await this.illuminateGroupAsync(100);
await this.sleep(3000);
await this.illuminateGroupAsync(0);
await this.sleep(3000);
await this.illuminateGroupAsync(100);
await this.sleep(3000);
await this.illuminateGroupAsync(0);
});
this.controller.registerCallback(this.accessory.UUID, this.context.type, this.context.groupNumber, this.platform.Characteristic.Brightness, this.callbackBrightness.bind(this));
}
async sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
getOn(callback) {
this.log.debug("Getting power state for: ", this.accessory.displayName);
this.getCurrentStateAsync().then(() => {
callback(null, this.context.isOn);
}).catch((err) => {
this.log.error(`${this.accessory.displayName} error: ${err}`);
this.context.isOn = false;
callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */, false);
});
}
setOn(desiredState, callback) {
if (this.context.isOn === desiredState) {
this.log.debug('Not changing power to %s because it is already %s', desiredState ? 'On' : 'Off', this.context.isOn ? 'On' : 'Off');
callback(null);
}
else {
this.illuminateGroupAsync(desiredState ? this.context.brightness || 100 : 0).then(() => {
callback(null);
}).catch((err) => {
this.log.error(`${this.accessory.displayName} setOn error: ${err}`);
callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */);
});
}
}
getBrightness(callback) {
this.getCurrentStateAsync().then(() => {
callback(null, this.context.brightness);
}).catch((err) => {
this.log.error(`${this.accessory.displayName} getBrightness error: ${err}`);
callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */, false);
});
}
setBrightness(desiredBrightness, callback) {
if (this.context.brightness === desiredBrightness) {
this.log.debug('Not changing brightness to %s because it is already %s', desiredBrightness, this.context.brightness);
callback(null);
}
else {
this.illuminateGroupAsync(desiredBrightness).then(() => {
callback(null);
}).catch((err) => {
this.log.error(`${this.accessory.displayName} setBrightness error: ${err}`);
callback(-70412 /* NOT_ALLOWED_IN_CURRENT_STATE */, false);
});
}
}
async illuminateGroupAsync(desiredIntensity) {
return new Promise(async (resolve, reject) => {
try {
this.log.info(`${this.accessory.displayName} turning ${desiredIntensity > 0 ? 'on' : 'off'} with brightness ${desiredIntensity}`);
let result = await this.controller.IlluminateGroupAsync(this.context.groupNumber, desiredIntensity);
if (result.StatusStr === 'Ok') {
this.context.brightness = desiredIntensity;
this.context.isOn = this.context.brightness > 0;
this.service.updateCharacteristic(this.platform.Characteristic.On, desiredIntensity > 0);
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, desiredIntensity);
resolve();
}
else {
this.log.error(`${this.accessory.displayName} returned ${result.StatusStr} trying to set intensity ${desiredIntensity}.`);
reject();
}
}
catch (err) {
this.log.error(`${this.accessory.displayName} illuminateGroupAsync error: ${err}`);
reject(err);
}
;
});
}
setCharacteristics() {
this.service.updateCharacteristic(this.platform.Characteristic.On, typeof this.context.isOn !== 'undefined' ? this.context.isOn : false);
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, typeof this.context.brightness !== 'undefined' ? this.context.brightness : 0);
}
// this method used for event handling
async getCurrentStateAsync() {
return new Promise(async (resolve, reject) => {
try {
let group = await this.controller.GetGroupAsync(this.context.groupNumber);
this.context.brightness = group.Intensity;
this.context.isOn = this.context.brightness > 0;
resolve();
}
catch (err) {
this.log.error(`${this.accessory.displayName} getCurrentStateAsync error: ${err}`);
reject(err);
}
;
});
}
// this method used for callbacks
callbackBrightness(intensity) {
if (intensity !== this.context.brightness) {
this.context.brightness = intensity;
this.context.isOn = intensity > 0;
this.log.debug(`${this.accessory.displayName} updated isOn to ${intensity > 0} and brightness ${intensity}.`);
this.service.updateCharacteristic(this.platform.Characteristic.On, intensity > 0);
this.service.updateCharacteristic(this.platform.Characteristic.Brightness, intensity);
}
}
}
exports.ZD_Light = ZD_Light;
var ILightType;
(function (ILightType) {
ILightType["ZD"] = "ZD";
ILightType["ZDC"] = "ZDC";
ILightType["THEME"] = "Theme";
})(ILightType = exports.ILightType || (exports.ILightType = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWkRfTGlnaHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGlnaHRzL1pEX0xpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLE1BQWEsUUFBUTtJQU9qQixZQUFZLFFBQXVCLEVBQUUsU0FBNEI7UUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBbUIsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0QsV0FBVztRQUNQLCtGQUErRjtRQUMvRix1Q0FBdUM7UUFFdkMsSUFBSTtZQUVBLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO2lCQUNwRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDO2lCQUNyRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQ3hFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRW5GLElBQUksQ0FBQyxP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R0FBRyxDQUFDLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzlHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUN6RjtJQUNMLENBQUM7Q0FDSjtBQW5LRCw0QkFtS0M7QUFFRCxJQUFZLFVBRVg7QUFGRCxXQUFZLFVBQVU7SUFDbEIsdUJBQVMsQ0FBQTtJQUFFLHlCQUFXLENBQUE7SUFBRSw2QkFBZSxDQUFBO0FBQzNDLENBQUMsRUFGVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQUVyQiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgU2VydmljZSwgUGxhdGZvcm1BY2Nlc3NvcnksIENoYXJhY3RlcmlzdGljVmFsdWUsIENoYXJhY3RlcmlzdGljU2V0Q2FsbGJhY2ssIENoYXJhY3RlcmlzdGljR2V0Q2FsbGJhY2ssIExvZ2dlciwgSEFQU3RhdHVzIH0gZnJvbSAnaG9tZWJyaWRnZSc7XG5pbXBvcnQgeyBJQ29udGV4dCwgTHV4b3JQbGF0Zm9ybSB9IGZyb20gJy4uL0x1eG9yUGxhdGZvcm0nO1xuaW1wb3J0IHsgQmFzZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9jb250cm9sbGVyL0Jhc2VDb250cm9sbGVyJztcblxuZXhwb3J0IGNsYXNzIFpEX0xpZ2h0IHtcbiAgICBwcm90ZWN0ZWQgYWNjZXNzb3J5OiBQbGF0Zm9ybUFjY2Vzc29yeTtcbiAgICBwcm90ZWN0ZWQgbG9nOiBMb2dnZXI7XG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IFNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IEJhc2VDb250cm9sbGVyO1xuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogTHV4b3JQbGF0Zm9ybTtcbiAgICBwcm90ZWN0ZWQgY29udGV4dDogSUNvbnRleHQ7XG4gICAgY29uc3RydWN0b3IocGxhdGZvcm06IEx1eG9yUGxhdGZvcm0sIGFjY2Vzc29yeTogUGxhdGZvcm1BY2Nlc3NvcnkpIHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gcGxhdGZvcm0uY29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5hY2Nlc3NvcnkgPSBhY2Nlc3Nvcnk7XG4gICAgICAgIHRoaXMubG9nID0gcGxhdGZvcm0ubG9nO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIHRoaXMuY29udGV4dCA9IHRoaXMuYWNjZXNzb3J5LmNvbnRleHQgYXMgSUNvbnRleHQ7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYEluaXRpYWxpemluZyAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfS5gKTtcbiAgICAgICAgdGhpcy5zZXRTZXJ2aWNlcygpO1xuICAgIH1cbiAgICBzZXRTZXJ2aWNlcygpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHlvdSBwcm92aWRlZCBhIG5hbWUgZm9yIHNlcnZpY2Ugb3RoZXJ3aXNlIGl0IG1heSBub3QgdmlzaWJsZSBpbiBzb21lIEhvbWVLaXQgYXBwcy5cbiAgICAgICAgLy8gaWYgKHRoaXMuY29udGV4dC5zdGF0dXMgPT09ICduZXcnKSB7XG5cbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NvcnkuZ2V0U2VydmljZSh0aGlzLnBsYXRmb3JtLlNlcnZpY2UuQWNjZXNzb3J5SW5mb3JtYXRpb24pXG4gICAgICAgICAgICAuc2V0Q2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5NYW51ZmFjdHVyZXIsIFwiTHV4b3JcIilcbiAgICAgICAgICAgIC5zZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk1vZGVsLCB0aGlzLmNvbnRleHQudHlwZSlcbiAgICAgICAgICAgIC5zZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLlNlcmlhbE51bWJlciwgdGhpcy5hY2Nlc3NvcnkuVVVJRCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHRoaXMuYWNjZXNzb3J5LmdldFNlcnZpY2UodGhpcy5wbGF0Zm9ybS5TZXJ2aWNlLkxpZ2h0YnVsYikgfHwgdGhpcy5hY2Nlc3NvcnkuYWRkU2VydmljZSh0aGlzLnBsYXRmb3JtLlNlcnZpY2UuTGlnaHRidWxiKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk5hbWUsIHRoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uKVxuICAgICAgICAgICAgLm9uKCdnZXQnLCB0aGlzLmdldE9uLmJpbmQodGhpcykpXG4gICAgICAgICAgICAub24oJ3NldCcsIHRoaXMuc2V0T24uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLkJyaWdodG5lc3MpXG4gICAgICAgICAgICAub24oJ3NldCcsIHRoaXMuc2V0QnJpZ2h0bmVzcy5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdnZXQnLCB0aGlzLmdldEJyaWdodG5lc3MuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdGF0dXMgPSAnY3VycmVudCc7XG4gICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRTdGF0ZUFzeW5jKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDaGFyYWN0ZXJpc3RpY3MoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IHNldFNlcnZpY2VzIGVycm9yOiAke2Vycn1gKSAgICAgICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKXtcbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGBzZXRTZXJ2aWNlcyAke2Vycn1gKVxuICAgICAgICB9XG5cblxuICAgICAgICB0aGlzLmFjY2Vzc29yeS5vbignaWRlbnRpZnknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBJZGVudGlmeWluZyAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfS4gIExpZ2h0cyB3aWxsIGZsYXNoIHRocmljZS5gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaWxsdW1pbmF0ZUdyb3VwQXN5bmMoMTAwKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoMzAwMCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmlsbHVtaW5hdGVHcm91cEFzeW5jKDApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCgzMDAwKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaWxsdW1pbmF0ZUdyb3VwQXN5bmMoMTAwKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoMzAwMClcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaWxsdW1pbmF0ZUdyb3VwQXN5bmMoMCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmFjY2Vzc29yeS5VVUlELCB0aGlzLmNvbnRleHQudHlwZSwgdGhpcy5jb250ZXh0Lmdyb3VwTnVtYmVyLCB0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLkJyaWdodG5lc3MsIHRoaXMuY2FsbGJhY2tCcmlnaHRuZXNzLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBhc3luYyBzbGVlcChtcykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gICAgfVxuICAgIGdldE9uKGNhbGxiYWNrOiBDaGFyYWN0ZXJpc3RpY0dldENhbGxiYWNrKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFwiR2V0dGluZyBwb3dlciBzdGF0ZSBmb3I6IFwiLCB0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgdGhpcy5nZXRDdXJyZW50U3RhdGVBc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdGhpcy5jb250ZXh0LmlzT24pO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7ICAgXG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNPbiA9IGZhbHNlO1xuICAgICAgICAgICAgY2FsbGJhY2soSEFQU3RhdHVzLk5PVF9BTExPV0VEX0lOX0NVUlJFTlRfU1RBVEUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldE9uKGRlc2lyZWRTdGF0ZTogYm9vbGVhbiwgY2FsbGJhY2s6IENoYXJhY3RlcmlzdGljU2V0Q2FsbGJhY2spOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pc09uID09PSBkZXNpcmVkU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKCdOb3QgY2hhbmdpbmcgcG93ZXIgdG8gJXMgYmVjYXVzZSBpdCBpcyBhbHJlYWR5ICVzJywgZGVzaXJlZFN0YXRlID8gJ09uJyA6ICdPZmYnLCB0aGlzLmNvbnRleHQuaXNPbiA/ICdPbicgOiAnT2ZmJyk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaWxsdW1pbmF0ZUdyb3VwQXN5bmMoZGVzaXJlZFN0YXRlID8gdGhpcy5jb250ZXh0LmJyaWdodG5lc3MgfHwgMTAwIDogMCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7ICBcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gc2V0T24gZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soSEFQU3RhdHVzLk5PVF9BTExPV0VEX0lOX0NVUlJFTlRfU1RBVEUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QnJpZ2h0bmVzcyhjYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNHZXRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEN1cnJlbnRTdGF0ZUFzeW5jKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLmNvbnRleHQuYnJpZ2h0bmVzcyk7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsgIFxuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IGdldEJyaWdodG5lc3MgZXJyb3I6ICR7ZXJyfWApXG4gICAgICAgICAgICBjYWxsYmFjayhIQVBTdGF0dXMuTk9UX0FMTE9XRURfSU5fQ1VSUkVOVF9TVEFURSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0QnJpZ2h0bmVzcyhkZXNpcmVkQnJpZ2h0bmVzczogbnVtYmVyLCBjYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNTZXRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmJyaWdodG5lc3MgPT09IGRlc2lyZWRCcmlnaHRuZXNzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZygnTm90IGNoYW5naW5nIGJyaWdodG5lc3MgdG8gJXMgYmVjYXVzZSBpdCBpcyBhbHJlYWR5ICVzJywgZGVzaXJlZEJyaWdodG5lc3MsIHRoaXMuY29udGV4dC5icmlnaHRuZXNzKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbGx1bWluYXRlR3JvdXBBc3luYyhkZXNpcmVkQnJpZ2h0bmVzcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7ICBcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gc2V0QnJpZ2h0bmVzcyBlcnJvcjogJHtlcnJ9YClcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhIQVBTdGF0dXMuTk9UX0FMTE9XRURfSU5fQ1VSUkVOVF9TVEFURSwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBpbGx1bWluYXRlR3JvdXBBc3luYyhkZXNpcmVkSW50ZW5zaXR5OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHJlc29sdmUsIHJlamVjdCk9PntcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbyhgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gdHVybmluZyAke2Rlc2lyZWRJbnRlbnNpdHkgPiAwID8gJ29uJyA6ICdvZmYnfSB3aXRoIGJyaWdodG5lc3MgJHtkZXNpcmVkSW50ZW5zaXR5fWApO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuSWxsdW1pbmF0ZUdyb3VwQXN5bmModGhpcy5jb250ZXh0Lmdyb3VwTnVtYmVyLCBkZXNpcmVkSW50ZW5zaXR5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LlN0YXR1c1N0ciA9PT0gJ09rJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYnJpZ2h0bmVzcyA9IGRlc2lyZWRJbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc09uID0gdGhpcy5jb250ZXh0LmJyaWdodG5lc3MgPiAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5PbiwgZGVzaXJlZEludGVuc2l0eSA+IDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5CcmlnaHRuZXNzLCBkZXNpcmVkSW50ZW5zaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IHJldHVybmVkICR7cmVzdWx0LlN0YXR1c1N0cn0gdHJ5aW5nIHRvIHNldCBpbnRlbnNpdHkgJHtkZXNpcmVkSW50ZW5zaXR5fS5gKVxuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IGlsbHVtaW5hdGVHcm91cEFzeW5jIGVycm9yOiAke2Vycn1gKVxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIHNldENoYXJhY3RlcmlzdGljcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuT24sIHR5cGVvZiB0aGlzLmNvbnRleHQuaXNPbiAhPT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmNvbnRleHQuaXNPbiA6IGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuQnJpZ2h0bmVzcywgdHlwZW9mIHRoaXMuY29udGV4dC5icmlnaHRuZXNzICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuY29udGV4dC5icmlnaHRuZXNzIDogMCk7XG4gICAgfVxuICAgIC8vIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgYXN5bmMgZ2V0Q3VycmVudFN0YXRlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGF3YWl0IHRoaXMuY29udHJvbGxlci5HZXRHcm91cEFzeW5jKHRoaXMuY29udGV4dC5ncm91cE51bWJlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmJyaWdodG5lc3MgPSBncm91cC5JbnRlbnNpdHk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzT24gPSB0aGlzLmNvbnRleHQuYnJpZ2h0bmVzcyA+IDA7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSBnZXRDdXJyZW50U3RhdGVBc3luYyBlcnJvcjogJHtlcnJ9YClcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICB9XG4gICAgLy8gdGhpcyBtZXRob2QgdXNlZCBmb3IgY2FsbGJhY2tzXG4gICAgY2FsbGJhY2tCcmlnaHRuZXNzKGludGVuc2l0eTogbnVtYmVyKTogdm9pZCB7XG5cbiAgICAgICAgaWYgKGludGVuc2l0eSAhPT0gdGhpcy5jb250ZXh0LmJyaWdodG5lc3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5icmlnaHRuZXNzID0gaW50ZW5zaXR5O1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzT24gPSBpbnRlbnNpdHkgPiAwO1xuICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IHVwZGF0ZWQgaXNPbiB0byAke2ludGVuc2l0eSA+IDB9IGFuZCBicmlnaHRuZXNzICR7aW50ZW5zaXR5fS5gKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCBpbnRlbnNpdHkgPiAwKTtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLkJyaWdodG5lc3MsIGludGVuc2l0eSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIElMaWdodFR5cGUge1xuICAgIFpEID0gJ1pEJywgWkRDID0gJ1pEQycsIFRIRU1FID0gJ1RoZW1lJ1xufSJdfQ==