UNPKG

homebridge-luxor

Version:

Homebridge Plug-in for the FX Luminaire (Luxor) lighting controller

127 lines 21.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Theme = void 0; const ZD_Light_1 = require("./ZD_Light"); class Theme extends ZD_Light_1.ZD_Light { constructor(platform, accessory) { super(platform, accessory); } setServices() { 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.Switch) || this.accessory.addService(this.platform.Service.Switch); this.service.setCharacteristic(this.platform.Characteristic.Name, this.accessory.displayName); this.accessory.getService(this.platform.Service.Switch) .getCharacteristic(this.platform.Characteristic.On) .on('get', this.getOn.bind(this)) .on('set', this.setOn.bind(this)); this.accessory.on('identify', async () => { this.log.info(`Identifying ${this.accessory.displayName}. Scene will turn on for 5s and then off.`); await this.illuminateTheme(); await this.sleep(3000); await this.illuminateTheme(0); }); this.getCurrentStateAsync().then(() => { this.setCharacteristics(); }).catch((err) => { this.log.error(`${this.accessory.displayName} setServices error: ${err}`); }); // don't register "fake" illumate/extinguish all themes. // don't register any themes because we don't care if the controller thinks they are on; // we want them to show as 'off' so they can act as a push button /* if (this.context.themeIndex < 100) { this.controller.registerCallback(this.accessory.UUID, this.context.type, this.context.themeIndex, this.platform.Characteristic.On, this.callbackBrightness.bind(this)); } */ } getOn(callback) { // Themes should always show as off callback(null, 0); } setOn(desiredOn, callback) { callback(null); // call callback first so we don't encounter 6s delay and downstream status' can update properly setTimeout(async () => { await this.illuminateTheme(), 100; }); } ; async illuminateTheme(desiredState = 1) { try { this.log.info(`${this.accessory.displayName} turning ${desiredState === 1 ? 'on' : 'off'}`); if (this.context.themeIndex === 101) { //all off await this.controller.ExtinguishAllAsync(); this.service.updateCharacteristic(this.platform.Characteristic.On, false); this.context.isOn = false; this.context.OnOff = 0; } else if (this.context.themeIndex === 100) { //all on await this.controller.IlluminateAllAsync(); this.service.updateCharacteristic(this.platform.Characteristic.On, false); this.context.isOn = false; this.context.OnOff = 0; } else { // if theme is on (on the luxor) turn it off so we can turn it on. It won't // set the theme if it is already "on" even if other lights have changed await this.controller.IlluminateThemeAsync(this.context.themeIndex, 0); if (desiredState === 1) { await this.sleep(100); await this.controller.IlluminateThemeAsync(this.context.themeIndex, 1); } this.service.updateCharacteristic(this.platform.Characteristic.On, false); this.context.isOn = false; this.context.OnOff = 0; if (this.context.isOn) { this.context.isOn = false; this.context.OnOff = 0; await this.sleep(1000); // don't actually turn of switch or it will turn off lights // await this.controller.IlluminateThemeAsync(this.context.themeIndex, this.context.OnOff); this.service.updateCharacteristic(this.platform.Characteristic.On, false); } } await this.sleep(500); await this.controller.updateLights(true); } catch (err) { this.log.error(`${this.accessory.displayName} illuminateTheme: ${err}`); } } ; setCharacteristics() { this.service.updateCharacteristic(this.platform.Characteristic.On, typeof this.context.isOn !== 'undefined' ? this.context.isOn : false); } // this method used for event handling async getCurrentStateAsync() { try { //themes should always show as off even if the controller has the state of 'on' this.context.isOn = false; this.context.OnOff = 0; return Promise.resolve(); } catch (err) { this.log.error(`${this.accessory.displayName} getCurrentStateAsync error: ${err}`); return Promise.reject(err); } } ; // this method used for callbacks async callbackOn(isOn) { try { if (this.context.isOn !== isOn) { this.log.debug(`${this.accessory.displayName} updated isOn to ${isOn ? 'on' : 'off'}.`); this.context.isOn = isOn; this.context.OnOff = isOn ? 1 : 0; this.service.updateCharacteristic(this.platform.Characteristic.On, this.context.isOn); } return Promise.resolve(); } catch (err) { this.log.error(err); return Promise.reject(err); } } } exports.Theme = Theme; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGlnaHRzL1RoZW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLHlDQUFrRDtBQUlsRCxNQUFhLEtBQU0sU0FBUSxtQkFBUTtJQU8vQixZQUFZLFFBQXVCLEVBQUUsU0FBNEI7UUFDN0QsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO2FBQ2hFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUM7YUFDckUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ3hFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENB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O1lBQ0EsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLG9CQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pGO1lBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDNUI7UUFDRCxPQUFPLEdBQUcsRUFBRTtZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQUU7SUFDcEUsQ0FBQztDQUNKO0FBOUhELHNCQThIQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgU2VydmljZSwgUGxhdGZvcm1BY2Nlc3NvcnksIENoYXJhY3RlcmlzdGljVmFsdWUsIENoYXJhY3RlcmlzdGljU2V0Q2FsbGJhY2ssIENoYXJhY3RlcmlzdGljR2V0Q2FsbGJhY2ssIExvZ2dlciB9IGZyb20gJ2hvbWVicmlkZ2UnO1xuaW1wb3J0IHsgSUNvbnRleHQsIEx1eG9yUGxhdGZvcm0gfSBmcm9tICcuLi9MdXhvclBsYXRmb3JtJztcbmltcG9ydCB7IEJhc2VDb250cm9sbGVyIH0gZnJvbSAnLi4vY29udHJvbGxlci9CYXNlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBJTGlnaHRUeXBlLCBaRF9MaWdodCB9IGZyb20gJy4vWkRfTGlnaHQnO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVqZWN0cyB9IGZyb20gJ2Fzc2VydCc7XG5cbmV4cG9ydCBjbGFzcyBUaGVtZSBleHRlbmRzIFpEX0xpZ2h0IHtcbiAgICBwcm90ZWN0ZWQgYWNjZXNzb3J5OiBQbGF0Zm9ybUFjY2Vzc29yeTtcbiAgICBwcm90ZWN0ZWQgbG9nOiBMb2dnZXI7XG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IFNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IEJhc2VDb250cm9sbGVyO1xuICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogTHV4b3JQbGF0Zm9ybTtcbiAgICBwcm90ZWN0ZWQgY29udGV4dDogSUNvbnRleHQ7XG4gICAgY29uc3RydWN0b3IocGxhdGZvcm06IEx1eG9yUGxhdGZvcm0sIGFjY2Vzc29yeTogUGxhdGZvcm1BY2Nlc3NvcnkpIHtcbiAgICAgICAgc3VwZXIocGxhdGZvcm0sIGFjY2Vzc29yeSk7XG4gICAgfVxuXG4gICAgc2V0U2VydmljZXMoKSB7XG4gICAgICAgIHRoaXMuYWNjZXNzb3J5LmdldFNlcnZpY2UodGhpcy5wbGF0Zm9ybS5TZXJ2aWNlLkFjY2Vzc29yeUluZm9ybWF0aW9uKVxuICAgICAgICAgICAgLnNldENoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuTWFudWZhY3R1cmVyLCBcIkx1eG9yXCIpXG4gICAgICAgICAgICAuc2V0Q2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5Nb2RlbCwgdGhpcy5jb250ZXh0LnR5cGUpXG4gICAgICAgICAgICAuc2V0Q2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5TZXJpYWxOdW1iZXIsIHRoaXMuYWNjZXNzb3J5LlVVSUQpO1xuICAgICAgICB0aGlzLnNlcnZpY2UgPSB0aGlzLmFjY2Vzc29yeS5nZXRTZXJ2aWNlKHRoaXMucGxhdGZvcm0uU2VydmljZS5Td2l0Y2gpIHx8IHRoaXMuYWNjZXNzb3J5LmFkZFNlcnZpY2UodGhpcy5wbGF0Zm9ybS5TZXJ2aWNlLlN3aXRjaCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5zZXRDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk5hbWUsIHRoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lKTtcblxuICAgICAgICB0aGlzLmFjY2Vzc29yeS5nZXRTZXJ2aWNlKHRoaXMucGxhdGZvcm0uU2VydmljZS5Td2l0Y2gpXG4gICAgICAgICAgICAuZ2V0Q2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5PbilcbiAgICAgICAgICAgIC5vbignZ2V0JywgdGhpcy5nZXRPbi5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLm9uKCdzZXQnLCB0aGlzLnNldE9uLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWNjZXNzb3J5Lm9uKCdpZGVudGlmeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oYElkZW50aWZ5aW5nICR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9LiAgU2NlbmUgd2lsbCB0dXJuIG9uIGZvciA1cyBhbmQgdGhlbiBvZmYuYCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmlsbHVtaW5hdGVUaGVtZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCgzMDAwKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaWxsdW1pbmF0ZVRoZW1lKDApO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuZ2V0Q3VycmVudFN0YXRlQXN5bmMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhcmFjdGVyaXN0aWNzKCk7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsgICAgXG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gc2V0U2VydmljZXMgZXJyb3I6ICR7ZXJyfWApOyAgICAgXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gZG9uJ3QgcmVnaXN0ZXIgXCJmYWtlXCIgaWxsdW1hdGUvZXh0aW5ndWlzaCBhbGwgdGhlbWVzLlxuICAgICAgICAvLyBkb24ndCByZWdpc3RlciBhbnkgdGhlbWVzIGJlY2F1c2Ugd2UgZG9uJ3QgY2FyZSBpZiB0aGUgY29udHJvbGxlciB0aGlua3MgdGhleSBhcmUgb247XG4gICAgICAgIC8vIHdlIHdhbnQgdGhlbSB0byBzaG93IGFzICdvZmYnIHNvIHRoZXkgY2FuIGFjdCBhcyBhIHB1c2ggYnV0dG9uXG4gICAgICAgIC8qIGlmICh0aGlzLmNvbnRleHQudGhlbWVJbmRleCA8IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5hY2Nlc3NvcnkuVVVJRCwgdGhpcy5jb250ZXh0LnR5cGUsIHRoaXMuY29udGV4dC50aGVtZUluZGV4LCB0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCB0aGlzLmNhbGxiYWNrQnJpZ2h0bmVzcy5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSAqL1xuICAgIH1cbiAgICBnZXRPbihjYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNHZXRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICAvLyBUaGVtZXMgc2hvdWxkIGFsd2F5cyBzaG93IGFzIG9mZlxuICAgICAgICBjYWxsYmFjayhudWxsLCAwKTtcbiAgICB9XG4gICAgc2V0T24oZGVzaXJlZE9uOiBib29sZWFuLCBjYWxsYmFjazogQ2hhcmFjdGVyaXN0aWNTZXRDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICBjYWxsYmFjayhudWxsKTsgIC8vIGNhbGwgY2FsbGJhY2sgZmlyc3Qgc28gd2UgZG9uJ3QgZW5jb3VudGVyIDZzIGRlbGF5IGFuZCBkb3duc3RyZWFtIHN0YXR1cycgY2FuIHVwZGF0ZSBwcm9wZXJseVxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsgYXdhaXQgdGhpcy5pbGx1bWluYXRlVGhlbWUoKSwgMTAwIH0pO1xuICAgIH07XG5cbiAgICBhc3luYyBpbGx1bWluYXRlVGhlbWUoZGVzaXJlZFN0YXRlOiBudW1iZXIgPSAxKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGAke3RoaXMuYWNjZXNzb3J5LmRpc3BsYXlOYW1lfSB0dXJuaW5nICR7ZGVzaXJlZFN0YXRlID09PSAxID8gJ29uJyA6ICdvZmYnfWApXG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnRoZW1lSW5kZXggPT09IDEwMSkge1xuICAgICAgICAgICAgICAgIC8vYWxsIG9mZlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5FeHRpbmd1aXNoQWxsQXN5bmMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlQ2hhcmFjdGVyaXN0aWModGhpcy5wbGF0Zm9ybS5DaGFyYWN0ZXJpc3RpYy5PbiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc09uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Lk9uT2ZmID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250ZXh0LnRoZW1lSW5kZXggPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIC8vYWxsIG9uXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLklsbHVtaW5hdGVBbGxBc3luYygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzT24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuT25PZmYgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlbWUgaXMgb24gKG9uIHRoZSBsdXhvcikgdHVybiBpdCBvZmYgc28gd2UgY2FuIHR1cm4gaXQgb24uICBJdCB3b24ndCBcbiAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHRoZW1lIGlmIGl0IGlzIGFscmVhZHkgXCJvblwiIGV2ZW4gaWYgb3RoZXIgbGlnaHRzIGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5JbGx1bWluYXRlVGhlbWVBc3luYyh0aGlzLmNvbnRleHQudGhlbWVJbmRleCwgMCk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2lyZWRTdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlci5JbGx1bWluYXRlVGhlbWVBc3luYyh0aGlzLmNvbnRleHQudGhlbWVJbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzT24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuT25PZmYgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuaXNPbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNPbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuT25PZmYgPSAwO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSB0dXJuIG9mIHN3aXRjaCBvciBpdCB3aWxsIHR1cm4gb2ZmIGxpZ2h0c1xuICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGlzLmNvbnRyb2xsZXIuSWxsdW1pbmF0ZVRoZW1lQXN5bmModGhpcy5jb250ZXh0LnRoZW1lSW5kZXgsIHRoaXMuY29udGV4dC5Pbk9mZik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCg1MDApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyLnVwZGF0ZUxpZ2h0cyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gaWxsdW1pbmF0ZVRoZW1lOiAke2Vycn1gKVxuICAgICAgICB9XG4gICAgfTtcbiAgICBzZXRDaGFyYWN0ZXJpc3RpY3MoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVDaGFyYWN0ZXJpc3RpYyh0aGlzLnBsYXRmb3JtLkNoYXJhY3RlcmlzdGljLk9uLCB0eXBlb2YgdGhpcy5jb250ZXh0LmlzT24gIT09ICd1bmRlZmluZWQnID8gdGhpcy5jb250ZXh0LmlzT24gOiBmYWxzZSk7XG4gICAgfVxuICAgIC8vIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgYXN5bmMgZ2V0Q3VycmVudFN0YXRlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIC8vdGhlbWVzIHNob3VsZCBhbHdheXMgc2hvdyBhcyBvZmYgZXZlbiBpZiB0aGUgY29udHJvbGxlciBoYXMgdGhlIHN0YXRlIG9mICdvbidcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc09uID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuT25PZmYgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycil7XG4gICAgICAgICAgICB0aGlzLmxvZy5lcnJvcihgJHt0aGlzLmFjY2Vzc29yeS5kaXNwbGF5TmFtZX0gZ2V0Q3VycmVudFN0YXRlQXN5bmMgZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGNhbGxiYWNrc1xuICAgIGFzeW5jIGNhbGxiYWNrT24oaXNPbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pc09uICE9PSBpc09uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYCR7dGhpcy5hY2Nlc3NvcnkuZGlzcGxheU5hbWV9IHVwZGF0ZWQgaXNPbiB0byAke2lzT24gPyAnb24nIDogJ29mZid9LmApO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc09uID0gaXNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuT25PZmYgPSBpc09uID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUNoYXJhY3RlcmlzdGljKHRoaXMucGxhdGZvcm0uQ2hhcmFjdGVyaXN0aWMuT24sIHRoaXMuY29udGV4dC5pc09uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7IHRoaXMubG9nLmVycm9yKGVycik7IHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpOyB9XG4gICAgfVxufSJdfQ==