annot-server/static/js/pianoroll.js
author rougeronj
Thu, 22 Jan 2015 09:26:43 +0100
changeset 111 a7b72620d227
parent 86 e944c017b8c8
permissions -rw-r--r--
Add variable "wait". When this variable set, the annotsroll wait ignore some annotations, and wait before printing an otherone so there is no superposition. Can be passed as an options
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o;"undefined"!=typeof window?o=window:"undefined"!=typeof global?o=global:"undefined"!=typeof self&&(o=self),o.pianoroll=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * scripts/main.js
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * This is the starting point for your application.
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Take a look at http://browserify.org/ for more info
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 */
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
'use strict';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
var PIXI = require('pixi');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
// Config vars
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
var logger = false;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
var sceneWidth = 1920;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
var prHeight1 = 435;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
var prHeight2 = 645;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
var sceneHeight = prHeight1 + prHeight2;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
var sceneBgColor = 0xFFFFFF;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
var lineColor = 0x444444;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
var pixelsPerSecond1 = Math.floor(sceneWidth / 10); // nb of pixels per second
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
var manualFramerate = pixelsPerSecond1 / 4;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
var pixelsPerSecond2 = Math.floor(sceneWidth / 60); // nb of pixels per second
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
var lineInterval = 5000; // means line every 5 seconds
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
var nbLines = -1;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
var noteHeight = 110;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
var noteColors = [0xB90000, 0x4BDD71, 0xAF931E, 0x1C28BA, 0x536991];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
var colorsReg = {};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
// Vars
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
var noteDict = [];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
// Timecode method
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
var timePageLoaded = Date.now();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
var offsetMusic = false;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
//create an new instance of a pixi stage
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
var stage = new PIXI.Stage(sceneBgColor);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
//create a renderer instance.
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
var renderer = PIXI.autoDetectRenderer(sceneWidth, sceneHeight);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
//add the renderer view element to the DOM
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
document.getElementById('canvasContainer').appendChild(renderer.view);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
var uberContainer = new PIXI.DisplayObjectContainer();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
uberContainer.position.x = Math.floor(sceneWidth*9/10);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
uberContainer.position.y = 0;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
stage.addChild(uberContainer);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
var PianoRoll = require('./pianoroll.js')
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
// Init containers
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
var containerList = [];
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
    55
containerList.push(new PianoRoll(uberContainer, 0, 0, prHeight1, true, pixelsPerSecond1, sceneWidth, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, prHeight1 / 128));
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
    56
containerList.push(new PianoRoll(uberContainer, 0, prHeight1, prHeight2, false, pixelsPerSecond2, sceneWidth, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, prHeight2 / 128));
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
// Line between two containers
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
var graphics = new PIXI.Graphics();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
graphics.beginFill(0xFFFF00);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
graphics.lineStyle(1, lineColor);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
graphics.moveTo(0, prHeight1);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
graphics.lineTo(sceneWidth, prHeight1);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
graphics.endFill();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
stage.addChild(graphics);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
function replaceContainers(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    var diff = (Date.now() - timePageLoaded)/1000;// nb of seconds since page loaded
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    //console.log("replace ! diff1 = ", container1.x - Math.floor(-diff*pixelsPerSecond1), ", diff 2 = ", container2.x - Math.floor(-diff*pixelsPerSecond2));
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    for(var i=0;i<containerList.length;i++){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        containerList[i].moveTo(-diff);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    renderer.render(stage);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
function addNotes(data){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    if(!offsetMusic){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        // get difference between the current note timecode and my zero to set the difference between the canvas's zero and the music's zero
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        // in order to place in real time
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        var now = Date.now();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        var timeBetweenNowAndStart = now - timePageLoaded;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        offsetMusic = timeBetweenNowAndStart - data.content[1];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        //console.log("start: ", timePageLoaded, ", now: ", now, ", timeBetweenNowAndStart = ", timeBetweenNowAndStart, ", offsetMusic = ", offsetMusic);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    var note = data.content[3];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    var velocity = data.content[4];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    if(velocity===0){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        if(typeof noteDict[data.content[2]][note]!=='undefined'){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            // We close the note in container one
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            //console.log("coucou 2", data);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            var duration = data.content[1] - noteDict[data.content[2]][note].ts;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            for(var i=0;i<containerList.length;i++){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                //               addNote(note, startTime,                          duration, velocity,                                 canal)
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                containerList[i].addNote(note, noteDict[data.content[2]][note].ts, duration, noteDict[data.content[2]][note].velocity, data.content[2]);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            // delete entry
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            delete noteDict[data.content[2]][note];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    else{
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        if(typeof noteDict[data.content[2]]==='undefined'){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
            noteDict[data.content[2]] = {};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        noteDict[data.content[2]][note] = {ts: data.content[1], velocity:velocity};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
function addLine(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
    nbLines++;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    for(var i=0;i<containerList.length;i++){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        containerList[i].addLine(nbLines);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
// Socket management
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
var sock = null;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
var ellog = null;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
function log(m) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    if(logger){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        ellog.innerHTML += m + '\n';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        ellog.scrollTop = ellog.scrollHeight;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
window.onload = function(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    if(logger){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        ellog = document.getElementById('log');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    else{
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        document.body.removeChild(document.getElementById('log'));
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
    var wsuri;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    if (window.location.protocol === 'file:') {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        wsuri = 'ws://127.0.0.1:8090/broadcast';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    } else {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        wsuri = 'ws://' + window.location.hostname + ':8090/broadcast';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
    wsuri = wsuri + '?channel=PIANOROLL&event_code='+eventCode;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    if ('WebSocket' in window) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
        sock = new WebSocket(wsuri);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
    } else if ('MozWebSocket' in window) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
        sock = new MozWebSocket(wsuri);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    } else {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        log('Browser does not support WebSocket!');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
        window.location = 'http://autobahn.ws/unsupportedbrowser';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    if (sock) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        sock.onopen = function(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
            if(logger){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
                log('Connected to ' + wsuri);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        sock.onclose = function(e) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
            if(logger){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
                log('Connection closed (wasClean = ' + e.wasClean + ', code = ' + e.code + ', reason = \'' + e.reason + '\')');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
            sock = null;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
        };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
        sock.onmessage = function(e) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
            if(logger){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
                log('Got message: ' + e.data);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
            addNotes(JSON.parse(e.data));
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
// Init page and intervals
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
addLine();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
var moveInterval = window.setInterval(replaceContainers, 1000/manualFramerate);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
var verticalLinesInterval = window.setInterval(addLine, lineInterval);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
// Little inteval to show time
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
var nbSec = 0;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
var mySpan = document.getElementById('myspan');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
function updateTime(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
    nbSec++;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
    var hours = parseInt( nbSec / 3600 ) % 24;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
    var minutes = parseInt( nbSec / 60 ) % 60;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
    var seconds = nbSec % 60;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
    var timeStr = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds  < 10 ? '0' + seconds : seconds);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    mySpan.innerHTML = timeStr;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
var secondInterval = window.setInterval(updateTime, 1000);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
module.exports = {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
    moveInterval: moveInterval,
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    verticalLinesInterval: verticalLinesInterval,
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    secondInterval: secondInterval
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
},{"./pianoroll.js":2,"pixi":"pixi"}],2:[function(require,module,exports){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
/**
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
* js/pianoroll.js
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
*
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
* pianoroll basic component
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
*
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
*/
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
'use strict';
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
var PIXI = require('pixi');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
var randomColor = require('randomColor');
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   214
function PianoRoll(parentContainer, xInit, yInit, height, linesDown, pixelsPerSecond, width, noteColors, colorsReg, lineColor, lineInterval, offsetMusic, noteHeight){
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
    var _this = this;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    this.container = new PIXI.DisplayObjectContainer();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
    this.container.position.x = xInit;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    this.container.position.y = yInit;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
    parentContainer.addChild(this.container);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
    this.linesDown = linesDown;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
    this.height = height;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
    this.pixelsPerSecond = pixelsPerSecond;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
    this.width = width;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
    this.noteColors = noteColors;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
    this.colorsReg = colorsReg || {};
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    this.lineColor = lineColor;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    this.lineInterval = lineInterval;
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   229
    this.offsetMusic = offsetMusic || 0;
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   230
    this.noteHeight = noteHeight;
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    this.addNote = function(note, startTime, duration, velocity, canal){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        //console.log("coucou 1", note, timeFromZero, ts, velocity, pixelsPerSecond, container, prHeight);
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   234
        var beginX = (this.offsetMusic + startTime) * this.pixelsPerSecond / 1000;
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        var width = duration * this.pixelsPerSecond / 1000;
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   236
        if((beginX+width) <  Math.abs(this.container.x) - this.width) {
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   237
            // not visible. do nothing
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   238
            return;
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   239
        }
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
        // We draw the rectangle
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        var graphics = new PIXI.Graphics();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        //console.log("beginX = ", beginX, "canal = ", canal, "color = ", noteColor[canal], "width = ", width, "note = ", note, "velocity = ", velocity);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        var color = this.colorsReg[canal];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        if(typeof(color) === 'undefined') {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
            var colorsRegSize = Object.keys(this.colorsReg).length;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
            if(colorsRegSize < this.noteColors.length) {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
                color = this.colorsReg[canal] = this.noteColors[colorsRegSize];
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
            else {
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
                color = this.colorsReg[canal] = parseInt(randomColor({ luminosity: 'light', hue: 'random', format:'hex'}).replace(/^#/, ''), 16);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
        }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        graphics.beginFill(color, (velocity / 128));
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
        var y = (128-note) * this.height / 128; // (128-note) because y = 0 is for note = 128 and y = 128 for note = 0
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
        graphics.drawRect(0, Math.floor(y - (noteHeight/2) + ((this.height / 128)/2)), width, noteHeight);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        graphics.endFill();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
        graphics.x = beginX;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
        this.container.addChild(graphics);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
    this.addLine = function(lineNb){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
        var graphics = new PIXI.Graphics();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
        var x = -this.container.x;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
        graphics.beginFill(0xFFFF00);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        graphics.lineStyle(1, this.lineColor);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
        var y = this.linesDown ? this.height - 20 : 0;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        graphics.moveTo(x, y);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        graphics.lineTo(x, y + 20);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        graphics.endFill();
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        this.container.addChild(graphics);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        // Add text
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
        var totalSec = lineNb * this.lineInterval / 1000;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        var hours = parseInt( totalSec / 3600 ) % 24;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        var minutes = parseInt( totalSec / 60 ) % 60;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
        var seconds = totalSec % 60;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        var timeStr = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds  < 10 ? '0' + seconds : seconds);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        var fontObj = { font: '10pt Arial', fill: '#444444' };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
        var t = new PIXI.Text(timeStr, fontObj);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        t.x = x + 2;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
        t.y = this.linesDown ? this.height - 15 : 2;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
        this.container.addChild(t);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    this.moveTo = function(diffTime){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
        this.container.x = Math.floor(diffTime*this.pixelsPerSecond);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
    };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    this.removePassedObjets = function(){
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
        var nbChilds = _this.container.children.length;
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   290
        var i = 0, childIsNowDisplayed = false, childrenToRemove = [];
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        while(i<nbChilds && !childIsNowDisplayed){
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   292
            var child = _this.container.children[i++];
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
            //console.log("remove ? ", child.x, child.width, ((child.x + child.width) < (Math.abs(_this.container.x) - _this.width)));
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   294
            if(typeof(child) == 'undefined') {
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   295
                continue;
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   296
            }
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
            if((child.x + child.width) < (Math.abs(_this.container.x) - _this.width)){
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   298
                childrenToRemove.push(child);
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
                //console.log("    remove !!!");
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
            }
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   301
            else {
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
                childIsNowDisplayed = true;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
                //console.log("    childIsNowDisplayed");
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
            }
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        }
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   306
        childrenToRemove.forEach(function(child) {
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   307
            _this.container.removeChild(child);
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   308
        });
84
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        //console.log("before : ", nbChilds, ", after : ", _this.container.children.length);
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
    };
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
    // remove notes each scene width
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
    //var removeInterval = window.setInterval(this.removePassedObjets, 1000 * sceneWidth / this.pixelsPerSecond );
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
    window.setInterval(this.removePassedObjets, 1000 * this.width / this.pixelsPerSecond );
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
}
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
module.exports = PianoRoll;
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
},{"pixi":"pixi","randomColor":"randomColor"}]},{},[1])(1)
d7c5bffdd2d8 rework on pianoroll: extract in own app + "browserify"
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
});
86
e944c017b8c8 propagate small correctionson server
ymh <ymh.work@gmail.com>
parents: 84
diff changeset
   322
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuL2FwcC9qcy9tYWluLmpzIiwiL1VzZXJzL3ltaC9kZXYvcHJvamVjdHMvbW9ucy9kZXYvY2xpZW50L3BpYW5vcm9sbC9hcHAvanMvcGlhbm9yb2xsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8qKlxuICogc2NyaXB0cy9tYWluLmpzXG4gKlxuICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHlvdXIgYXBwbGljYXRpb24uXG4gKiBUYWtlIGEgbG9vayBhdCBodHRwOi8vYnJvd3NlcmlmeS5vcmcvIGZvciBtb3JlIGluZm9cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFBJWEkgPSByZXF1aXJlKCdwaXhpJyk7XG5cbi8vIENvbmZpZyB2YXJzXG52YXIgbG9nZ2VyID0gZmFsc2U7XG52YXIgc2NlbmVXaWR0aCA9IDE5MjA7XG52YXIgcHJIZWlnaHQxID0gNDM1O1xudmFyIHBySGVpZ2h0MiA9IDY0NTtcbnZhciBzY2VuZUhlaWdodCA9IHBySGVpZ2h0MSArIHBySGVpZ2h0MjtcbnZhciBzY2VuZUJnQ29sb3IgPSAweEZGRkZGRjtcbnZhciBsaW5lQ29sb3IgPSAweDQ0NDQ0NDtcbnZhciBwaXhlbHNQZXJTZWNvbmQxID0gTWF0aC5mbG9vcihzY2VuZVdpZHRoIC8gMTApOyAvLyBuYiBvZiBwaXhlbHMgcGVyIHNlY29uZFxudmFyIG1hbnVhbEZyYW1lcmF0ZSA9IHBpeGVsc1BlclNlY29uZDEgLyA0O1xudmFyIHBpeGVsc1BlclNlY29uZDIgPSBNYXRoLmZsb29yKHNjZW5lV2lkdGggLyA2MCk7IC8vIG5iIG9mIHBpeGVscyBwZXIgc2Vjb25kXG52YXIgbGluZUludGVydmFsID0gNTAwMDsgLy8gbWVhbnMgbGluZSBldmVyeSA1IHNlY29uZHNcbnZhciBuYkxpbmVzID0gLTE7XG52YXIgbm90ZUhlaWdodCA9IDExMDtcbnZhciBub3RlQ29sb3JzID0gWzB4QjkwMDAwLCAweDRCREQ3MSwgMHhBRjkzMUUsIDB4MUMyOEJBLCAweDUzNjk5MV07XG52YXIgY29sb3JzUmVnID0ge307XG4vLyBWYXJzXG52YXIgbm90ZURpY3QgPSBbXTtcbi8vIFRpbWVjb2RlIG1ldGhvZFxudmFyIHRpbWVQYWdlTG9hZGVkID0gRGF0ZS5ub3coKTtcbnZhciBvZmZzZXRNdXNpYyA9IGZhbHNlO1xuXG5cbi8vY3JlYXRlIGFuIG5ldyBpbnN0YW5jZSBvZiBhIHBpeGkgc3RhZ2VcbnZhciBzdGFnZSA9IG5ldyBQSVhJLlN0YWdlKHNjZW5lQmdDb2xvcik7XG5cbi8vY3JlYXRlIGEgcmVuZGVyZXIgaW5zdGFuY2UuXG52YXIgcmVuZGVyZXIgPSBQSVhJLmF1dG9EZXRlY3RSZW5kZXJlcihzY2VuZVdpZHRoLCBzY2VuZUhlaWdodCk7XG5cbi8vYWRkIHRoZSByZW5kZXJlciB2aWV3IGVsZW1lbnQgdG8gdGhlIERPTVxuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbnZhc0NvbnRhaW5lcicpLmFwcGVuZENoaWxkKHJlbmRlcmVyLnZpZXcpO1xuXG52YXIgdWJlckNvbnRhaW5lciA9IG5ldyBQSVhJLkRpc3BsYXlPYmplY3RDb250YWluZXIoKTtcbnViZXJDb250YWluZXIucG9zaXRpb24ueCA9IE1hdGguZmxvb3Ioc2NlbmVXaWR0aCo5LzEwKTtcbnViZXJDb250YWluZXIucG9zaXRpb24ueSA9IDA7XG5zdGFnZS5hZGRDaGlsZCh1YmVyQ29udGFpbmVyKTtcblxudmFyIFBpYW5vUm9sbCA9IHJlcXVpcmUoJy4vcGlhbm9yb2xsLmpzJylcblxuLy8gSW5pdCBjb250YWluZXJzXG52YXIgY29udGFpbmVyTGlzdCA9IFtdO1xuY29udGFpbmVyTGlzdC5wdXNoKG5ldyBQaWFub1JvbGwodWJlckNvbnRhaW5lciwgMCwgMCwgcHJIZWlnaHQxLCB0cnVlLCBwaXhlbHNQZXJTZWNvbmQxLCBzY2VuZVdpZHRoLCBub3RlQ29sb3JzLCBjb2xvcnNSZWcsIGxpbmVDb2xvciwgbGluZUludGVydmFsLCBvZmZzZXRNdXNpYywgcHJIZWlnaHQxIC8gMTI4KSk7XG5jb250YWluZXJMaXN0LnB1c2gobmV3IFBpYW5vUm9sbCh1YmVyQ29udGFpbmVyLCAwLCBwckhlaWdodDEsIHBySGVpZ2h0MiwgZmFsc2UsIHBpeGVsc1BlclNlY29uZDIsIHNjZW5lV2lkdGgsIG5vdGVDb2xvcnMsIGNvbG9yc1JlZywgbGluZUNvbG9yLCBsaW5lSW50ZXJ2YWwsIG9mZnNldE11c2ljLCBwckhlaWdodDIgLyAxMjgpKTtcblxuLy8gTGluZSBiZXR3ZWVuIHR3byBjb250YWluZXJzXG52YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpO1xuZ3JhcGhpY3MuYmVnaW5GaWxsKDB4RkZGRjAwKTtcbmdyYXBoaWNzLmxpbmVTdHlsZSgxLCBsaW5lQ29sb3IpO1xuZ3JhcGhpY3MubW92ZVRvKDAsIHBySGVpZ2h0MSk7XG5ncmFwaGljcy5saW5lVG8oc2NlbmVXaWR0aCwgcHJIZWlnaHQxKTtcbmdyYXBoaWNzLmVuZEZpbGwoKTtcbnN0YWdlLmFkZENoaWxkKGdyYXBoaWNzKTtcblxuXG5mdW5jdGlvbiByZXBsYWNlQ29udGFpbmVycygpe1xuICAgIHZhciBkaWZmID0gKERhdGUubm93KCkgLSB0aW1lUGFnZUxvYWRlZCkvMTAwMDsvLyBuYiBvZiBzZWNvbmRzIHNpbmNlIHBhZ2UgbG9hZGVkXG4gICAgLy9jb25zb2xlLmxvZyhcInJlcGxhY2UgISBkaWZmMSA9IFwiLCBjb250YWluZXIxLnggLSBNYXRoLmZsb29yKC1kaWZmKnBpeGVsc1BlclNlY29uZDEpLCBcIiwgZGlmZiAyID0gXCIsIGNvbnRhaW5lcjIueCAtIE1hdGguZmxvb3IoLWRpZmYqcGl4ZWxzUGVyU2Vjb25kMikpO1xuICAgIGZvcih2YXIgaT0wO2k8Y29udGFpbmVyTGlzdC5sZW5ndGg7aSsrKXtcbiAgICAgICAgY29udGFpbmVyTGlzdFtpXS5tb3ZlVG8oLWRpZmYpO1xuICAgIH1cbiAgICByZW5kZXJlci5yZW5kZXIoc3RhZ2UpO1xufVxuXG5mdW5jdGlvbiBhZGROb3RlcyhkYXRhKXtcbiAgICBpZighb2Zmc2V0TXVzaWMpe1xuICAgICAgICAvLyBnZXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IG5vdGUgdGltZWNvZGUgYW5kIG15IHplcm8gdG8gc2V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNhbnZhcydzIHplcm8gYW5kIHRoZSBtdXNpYydzIHplcm9cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gcGxhY2UgaW4gcmVhbCB0aW1lXG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB2YXIgdGltZUJldHdlZW5Ob3dBbmRTdGFydCA9IG5vdyAtIHRpbWVQYWdlTG9hZGVkO1xuICAgICAgICBvZmZzZXRNdXNpYyA9IHRpbWVCZXR3ZWVuTm93QW5kU3RhcnQgLSBkYXRhLmNvbnRlbnRbMV07XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJzdGFydDogXCIsIHRpbWVQYWdlTG9hZGVkLCBcIiwgbm93OiBcIiwgbm93LCBcIiwgdGltZUJldHdlZW5Ob3dBbmRTdGFydCA9IFwiLCB0aW1lQmV0d2Vlbk5vd0FuZFN0YXJ0LCBcIiwgb2Zmc2V0TXVzaWMgPSBcIiwgb2Zmc2V0TXVzaWMpO1xuICAgIH1cbiAgICB2YXIgbm90ZSA9IGRhdGEuY29udGVudFszXTtcbiAgICB2YXIgdmVsb2NpdHkgPSBkYXRhLmNvbnRlbnRbNF07XG4gICAgaWYodmVsb2NpdHk9PT0wKXtcbiAgICAgICAgaWYodHlwZW9mIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0hPT0ndW5kZWZpbmVkJyl7XG4gICAgICAgICAgICAvLyBXZSBjbG9zZSB0aGUgbm90ZSBpbiBjb250YWluZXIgb25lXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiY291Y291IDJcIiwgZGF0YSk7XG4gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBkYXRhLmNvbnRlbnRbMV0gLSBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdLnRzO1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxjb250YWluZXJMaXN0Lmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgYWRkTm90ZShub3RlLCBzdGFydFRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwgdmVsb2NpdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuYWwpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTGlzdFtpXS5hZGROb3RlKG5vdGUsIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV1bbm90ZV0udHMsIGR1cmF0aW9uLCBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdLnZlbG9jaXR5LCBkYXRhLmNvbnRlbnRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVsZXRlIGVudHJ5XG4gICAgICAgICAgICBkZWxldGUgbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXVtub3RlXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgICBpZih0eXBlb2Ygbm90ZURpY3RbZGF0YS5jb250ZW50WzJdXT09PSd1bmRlZmluZWQnKXtcbiAgICAgICAgICAgIG5vdGVEaWN0W2RhdGEuY29udGVudFsyXV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBub3RlRGljdFtkYXRhLmNvbnRlbnRbMl1dW25vdGVdID0ge3RzOiBkYXRhLmNvbnRlbnRbMV0sIHZlbG9jaXR5OnZlbG9jaXR5fTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZExpbmUoKXtcbiAgICBuYkxpbmVzKys7XG4gICAgZm9yKHZhciBpPTA7aTxjb250YWluZXJMaXN0Lmxlbmd0aDtpKyspe1xuICAgICAgICBjb250YWluZXJMaXN0W2ldLmFkZExpbmUobmJMaW5lcyk7XG4gICAgfVxufVxuXG5cblxuLy8gU29ja2V0IG1hbmFnZW1lbnRcbnZhciBzb2NrID0gbnVsbDtcbnZhciBlbGxvZyA9IG51bGw7XG5mdW5jdGlvbiBsb2cobSkge1xuICAgIGlmKGxvZ2dlcil7XG4gICAgICAgIGVsbG9nLmlubmVySFRNTCArPSBtICsgJ1xcbic7XG4gICAgICAgIGVsbG9nLnNjcm9sbFRvcCA9IGVsbG9nLnNjcm9sbEhlaWdodDtcbiAgICB9XG59XG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKXtcblxuICAgIGlmKGxvZ2dlcil7XG4gICAgICAgIGVsbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZycpO1xuICAgIH1cbiAgICBlbHNle1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKSk7XG4gICAgfVxuXG4gICAgdmFyIHdzdXJpO1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdmaWxlOicpIHtcbiAgICAgICAgd3N1cmkgPSAnd3M6Ly8xMjcuMC4wLjE6ODA5MC9icm9hZGNhc3QnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHdzdXJpID0gJ3dzOi8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6ODA5MC9icm9hZGNhc3QnO1xuICAgIH1cbiAgICB3c3VyaSA9IHdzdXJpICsgJz9jaGFubmVsPVBJQU5PUk9MTCZldmVudF9jb2RlPScrZXZlbnRDb2RlO1xuXG4gICAgaWYgKCdXZWJTb2NrZXQnIGluIHdpbmRvdykge1xuICAgICAgICBzb2NrID0gbmV3IFdlYlNvY2tldCh3c3VyaSk7XG4gICAgfSBlbHNlIGlmICgnTW96V2ViU29ja2V0JyBpbiB3aW5kb3cpIHtcbiAgICAgICAgc29jayA9IG5ldyBNb3pXZWJTb2NrZXQod3N1cmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFdlYlNvY2tldCEnKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJ2h0dHA6Ly9hdXRvYmFobi53cy91bnN1cHBvcnRlZGJyb3dzZXInO1xuICAgIH1cblxuICAgIGlmIChzb2NrKSB7XG4gICAgICAgIHNvY2sub25vcGVuID0gZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmKGxvZ2dlcil7XG4gICAgICAgICAgICAgICAgbG9nKCdDb25uZWN0ZWQgdG8gJyArIHdzdXJpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzb2NrLm9uY2xvc2UgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZihsb2dnZXIpe1xuICAgICAgICAgICAgICAgIGxvZygnQ29ubmVjdGlvbiBjbG9zZWQgKHdhc0NsZWFuID0gJyArIGUud2FzQ2xlYW4gKyAnLCBjb2RlID0gJyArIGUuY29kZSArICcsIHJlYXNvbiA9IFxcJycgKyBlLnJlYXNvbiArICdcXCcpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb2NrID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICBzb2NrLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmKGxvZ2dlcil7XG4gICAgICAgICAgICAgICAgbG9nKCdHb3QgbWVzc2FnZTogJyArIGUuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGROb3RlcyhKU09OLnBhcnNlKGUuZGF0YSkpO1xuICAgICAgICB9O1xuICAgIH1cbn07XG5cblxuLy8gSW5pdCBwYWdlIGFuZCBpbnRlcnZhbHNcbmFkZExpbmUoKTtcbnZhciBtb3ZlSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwocmVwbGFjZUNvbnRhaW5lcnMsIDEwMDAvbWFudWFsRnJhbWVyYXRlKTtcbnZhciB2ZXJ0aWNhbExpbmVzSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoYWRkTGluZSwgbGluZUludGVydmFsKTtcblxuLy8gTGl0dGxlIGludGV2YWwgdG8gc2hvdyB0aW1lXG52YXIgbmJTZWMgPSAwO1xudmFyIG15U3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdteXNwYW4nKTtcbmZ1bmN0aW9uIHVwZGF0ZVRpbWUoKXtcbiAgICBuYlNlYysrO1xuICAgIHZhciBob3VycyA9IHBhcnNlSW50KCBuYlNlYyAvIDM2MDAgKSAlIDI0O1xuICAgIHZhciBtaW51dGVzID0gcGFyc2VJbnQoIG5iU2VjIC8gNjAgKSAlIDYwO1xuICAgIHZhciBzZWNvbmRzID0gbmJTZWMgJSA2MDtcbiAgICB2YXIgdGltZVN0ciA9IChob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycykgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcyk7XG4gICAgbXlTcGFuLmlubmVySFRNTCA9IHRpbWVTdHI7XG59XG52YXIgc2Vjb25kSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodXBkYXRlVGltZSwgMTAwMCk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1vdmVJbnRlcnZhbDogbW92ZUludGVydmFsLFxuICAgIHZlcnRpY2FsTGluZXNJbnRlcnZhbDogdmVydGljYWxMaW5lc0ludGVydmFsLFxuICAgIHNlY29uZEludGVydmFsOiBzZWNvbmRJbnRlcnZhbFxufTtcbiIsIi8qKlxuKiBqcy9waWFub3JvbGwuanNcbipcbiogcGlhbm9yb2xsIGJhc2ljIGNvbXBvbmVudFxuKlxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUElYSSA9IHJlcXVpcmUoJ3BpeGknKTtcbnZhciByYW5kb21Db2xvciA9IHJlcXVpcmUoJ3JhbmRvbUNvbG9yJyk7XG5cbmZ1bmN0aW9uIFBpYW5vUm9sbChwYXJlbnRDb250YWluZXIsIHhJbml0LCB5SW5pdCwgaGVpZ2h0LCBsaW5lc0Rvd24sIHBpeGVsc1BlclNlY29uZCwgd2lkdGgsIG5vdGVDb2xvcnMsIGNvbG9yc1JlZywgbGluZUNvbG9yLCBsaW5lSW50ZXJ2YWwsIG9mZnNldE11c2ljLCBub3RlSGVpZ2h0KXtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFBJWEkuRGlzcGxheU9iamVjdENvbnRhaW5lcigpO1xuICAgIHRoaXMuY29udGFpbmVyLnBvc2l0aW9uLnggPSB4SW5pdDtcbiAgICB0aGlzLmNvbnRhaW5lci5wb3NpdGlvbi55ID0geUluaXQ7XG4gICAgcGFyZW50Q29udGFpbmVyLmFkZENoaWxkKHRoaXMuY29udGFpbmVyKTtcblxuICAgIHRoaXMubGluZXNEb3duID0gbGluZXNEb3duO1xuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIHRoaXMucGl4ZWxzUGVyU2Vjb25kID0gcGl4ZWxzUGVyU2Vjb25kO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLm5vdGVDb2xvcnMgPSBub3RlQ29sb3JzO1xuICAgIHRoaXMuY29sb3JzUmVnID0gY29sb3JzUmVnIHx8IHt9O1xuICAgIHRoaXMubGluZUNvbG9yID0gbGluZUNvbG9yO1xuICAgIHRoaXMubGluZUludGVydmFsID0gbGluZUludGVydmFsO1xuICAgIHRoaXMub2Zmc2V0TXVzaWMgPSBvZmZzZXRNdXNpYyB8fCAwO1xuICAgIHRoaXMubm90ZUhlaWdodCA9IG5vdGVIZWlnaHQ7XG5cbiAgICB0aGlzLmFkZE5vdGUgPSBmdW5jdGlvbihub3RlLCBzdGFydFRpbWUsIGR1cmF0aW9uLCB2ZWxvY2l0eSwgY2FuYWwpe1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiY291Y291IDFcIiwgbm90ZSwgdGltZUZyb21aZXJvLCB0cywgdmVsb2NpdHksIHBpeGVsc1BlclNlY29uZCwgY29udGFpbmVyLCBwckhlaWdodCk7XG4gICAgICAgIHZhciBiZWdpblggPSAodGhpcy5vZmZzZXRNdXNpYyArIHN0YXJ0VGltZSkgKiB0aGlzLnBpeGVsc1BlclNlY29uZCAvIDEwMDA7XG4gICAgICAgIHZhciB3aWR0aCA9IGR1cmF0aW9uICogdGhpcy5waXhlbHNQZXJTZWNvbmQgLyAxMDAwO1xuICAgICAgICBpZigoYmVnaW5YK3dpZHRoKSA8ICBNYXRoLmFicyh0aGlzLmNvbnRhaW5lci54KSAtIHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG5vdCB2aXNpYmxlLiBkbyBub3RoaW5nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZHJhdyB0aGUgcmVjdGFuZ2xlXG4gICAgICAgIHZhciBncmFwaGljcyA9IG5ldyBQSVhJLkdyYXBoaWNzKCk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJiZWdpblggPSBcIiwgYmVnaW5YLCBcImNhbmFsID0gXCIsIGNhbmFsLCBcImNvbG9yID0gXCIsIG5vdGVDb2xvcltjYW5hbF0sIFwid2lkdGggPSBcIiwgd2lkdGgsIFwibm90ZSA9IFwiLCBub3RlLCBcInZlbG9jaXR5ID0gXCIsIHZlbG9jaXR5KTtcbiAgICAgICAgdmFyIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdO1xuICAgICAgICBpZih0eXBlb2YoY29sb3IpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdmFyIGNvbG9yc1JlZ1NpemUgPSBPYmplY3Qua2V5cyh0aGlzLmNvbG9yc1JlZykubGVuZ3RoO1xuICAgICAgICAgICAgaWYoY29sb3JzUmVnU2l6ZSA8IHRoaXMubm90ZUNvbG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3JzUmVnW2NhbmFsXSA9IHRoaXMubm90ZUNvbG9yc1tjb2xvcnNSZWdTaXplXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvcnNSZWdbY2FuYWxdID0gcGFyc2VJbnQocmFuZG9tQ29sb3IoeyBsdW1pbm9zaXR5OiAnbGlnaHQnLCBodWU6ICdyYW5kb20nLCBmb3JtYXQ6J2hleCd9KS5yZXBsYWNlKC9eIy8sICcnKSwgMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdyYXBoaWNzLmJlZ2luRmlsbChjb2xvciwgKHZlbG9jaXR5IC8gMTI4KSk7XG4gICAgICAgIHZhciB5ID0gKDEyOC1ub3RlKSAqIHRoaXMuaGVpZ2h0IC8gMTI4OyAvLyAoMTI4LW5vdGUpIGJlY2F1c2UgeSA9IDAgaXMgZm9yIG5vdGUgPSAxMjggYW5kIHkgPSAxMjggZm9yIG5vdGUgPSAwXG4gICAgICAgIGdyYXBoaWNzLmRyYXdSZWN0KDAsIE1hdGguZmxvb3IoeSAtIChub3RlSGVpZ2h0LzIpICsgKCh0aGlzLmhlaWdodCAvIDEyOCkvMikpLCB3aWR0aCwgbm90ZUhlaWdodCk7XG4gICAgICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcbiAgICAgICAgZ3JhcGhpY3MueCA9IGJlZ2luWDtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgIH07XG5cbiAgICB0aGlzLmFkZExpbmUgPSBmdW5jdGlvbihsaW5lTmIpe1xuICAgICAgICB2YXIgZ3JhcGhpY3MgPSBuZXcgUElYSS5HcmFwaGljcygpO1xuICAgICAgICB2YXIgeCA9IC10aGlzLmNvbnRhaW5lci54O1xuICAgICAgICBncmFwaGljcy5iZWdpbkZpbGwoMHhGRkZGMDApO1xuICAgICAgICBncmFwaGljcy5saW5lU3R5bGUoMSwgdGhpcy5saW5lQ29sb3IpO1xuICAgICAgICB2YXIgeSA9IHRoaXMubGluZXNEb3duID8gdGhpcy5oZWlnaHQgLSAyMCA6IDA7XG4gICAgICAgIGdyYXBoaWNzLm1vdmVUbyh4LCB5KTtcbiAgICAgICAgZ3JhcGhpY3MubGluZVRvKHgsIHkgKyAyMCk7XG4gICAgICAgIGdyYXBoaWNzLmVuZEZpbGwoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuYWRkQ2hpbGQoZ3JhcGhpY3MpO1xuICAgICAgICAvLyBBZGQgdGV4dFxuICAgICAgICB2YXIgdG90YWxTZWMgPSBsaW5lTmIgKiB0aGlzLmxpbmVJbnRlcnZhbCAvIDEwMDA7XG4gICAgICAgIHZhciBob3VycyA9IHBhcnNlSW50KCB0b3RhbFNlYyAvIDM2MDAgKSAlIDI0O1xuICAgICAgICB2YXIgbWludXRlcyA9IHBhcnNlSW50KCB0b3RhbFNlYyAvIDYwICkgJSA2MDtcbiAgICAgICAgdmFyIHNlY29uZHMgPSB0b3RhbFNlYyAlIDYwO1xuICAgICAgICB2YXIgdGltZVN0ciA9IChob3VycyA8IDEwID8gJzAnICsgaG91cnMgOiBob3VycykgKyAnOicgKyAobWludXRlcyA8IDEwID8gJzAnICsgbWludXRlcyA6IG1pbnV0ZXMpICsgJzonICsgKHNlY29uZHMgIDwgMTAgPyAnMCcgKyBzZWNvbmRzIDogc2Vjb25kcyk7XG4gICAgICAgIHZhciBmb250T2JqID0geyBmb250OiAnMTBwdCBBcmlhbCcsIGZpbGw6ICcjNDQ0NDQ0JyB9O1xuICAgICAgICB2YXIgdCA9IG5ldyBQSVhJLlRleHQodGltZVN0ciwgZm9udE9iaik7XG4gICAgICAgIHQueCA9IHggKyAyO1xuICAgICAgICB0LnkgPSB0aGlzLmxpbmVzRG93biA/IHRoaXMuaGVpZ2h0IC0gMTUgOiAyO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5hZGRDaGlsZCh0KTtcbiAgICB9O1xuXG4gICAgdGhpcy5tb3ZlVG8gPSBmdW5jdGlvbihkaWZmVGltZSl7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnggPSBNYXRoLmZsb29yKGRpZmZUaW1lKnRoaXMucGl4ZWxzUGVyU2Vjb25kKTtcbiAgICB9O1xuXG4gICAgdGhpcy5yZW1vdmVQYXNzZWRPYmpldHMgPSBmdW5jdGlvbigpe1xuICAgICAgICB2YXIgbmJDaGlsZHMgPSBfdGhpcy5jb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICB2YXIgaSA9IDAsIGNoaWxkSXNOb3dEaXNwbGF5ZWQgPSBmYWxzZSwgY2hpbGRyZW5Ub1JlbW92ZSA9IFtdO1xuICAgICAgICB3aGlsZShpPG5iQ2hpbGRzICYmICFjaGlsZElzTm93RGlzcGxheWVkKXtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IF90aGlzLmNvbnRhaW5lci5jaGlsZHJlbltpKytdO1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlbW92ZSA/IFwiLCBjaGlsZC54LCBjaGlsZC53aWR0aCwgKChjaGlsZC54ICsgY2hpbGQud2lkdGgpIDwgKE1hdGguYWJzKF90aGlzLmNvbnRhaW5lci54KSAtIF90aGlzLndpZHRoKSkpO1xuICAgICAgICAgICAgaWYodHlwZW9mKGNoaWxkKSA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoKGNoaWxkLnggKyBjaGlsZC53aWR0aCkgPCAoTWF0aC5hYnMoX3RoaXMuY29udGFpbmVyLngpIC0gX3RoaXMud2lkdGgpKXtcbiAgICAgICAgICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIgICAgcmVtb3ZlICEhIVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNoaWxkSXNOb3dEaXNwbGF5ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCIgICAgY2hpbGRJc05vd0Rpc3BsYXllZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlblRvUmVtb3ZlLmZvckVhY2goZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgICAgIF90aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIDogXCIsIG5iQ2hpbGRzLCBcIiwgYWZ0ZXIgOiBcIiwgX3RoaXMuY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSBub3RlcyBlYWNoIHNjZW5lIHdpZHRoXG4gICAgLy92YXIgcmVtb3ZlSW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiBzY2VuZVdpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcbiAgICB3aW5kb3cuc2V0SW50ZXJ2YWwodGhpcy5yZW1vdmVQYXNzZWRPYmpldHMsIDEwMDAgKiB0aGlzLndpZHRoIC8gdGhpcy5waXhlbHNQZXJTZWNvbmQgKTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBpYW5vUm9sbDtcbiJdfQ==