Best Python code snippet using slash
Traktor-Kontrol-F1-scripts.js
Source:Traktor-Kontrol-F1-scripts.js  
1//2// Native Instruments Traktor Kontrol F1 HID controller script v0.93// Copyright (C) 2012, Ilkka Tuohela4// For Mixxx version 1.11.x5//6// Native Instruments Traktor Kontrol F1 HID interface specification7function KontrolF1Controller() {8    this.controller = new HIDController();9    // Initialized to firmware version by version response packet10    this.version_major = undefined;11    this.version_minor = undefined;12    this.controller.activeDeck = 1;13    // F1 PAD LEDs are special, it has full RGB control with three bytes,14    // we can't use normal LEDColors directly. Define here some basic15    // colors, allow using full RGB values with script16    this.buttonNames = [17        "sync", "quant", "capture", "shift",18        "reverse", "type", "size", "browse",19        "play_1_1", "play_1_2", "play_2_1", "play_2_2",20        "play_3_1", "play_3_2", "play_4_1", "play_4_2"21    ];22    this.registerInputPackets = function() {23        var packet = undefined;24        packet = new HIDPacket("control", [0x1],22);25        packet.addControl("hid", "grid_8", 1,"I", 0x1);26        packet.addControl("hid", "grid_7", 1,"I", 0x2);27        packet.addControl("hid", "grid_6", 1,"I", 0x4);28        packet.addControl("hid", "grid_5", 1,"I", 0x8);29        packet.addControl("hid", "grid_4", 1,"I", 0x10);30        packet.addControl("hid", "grid_3", 1,"I", 0x20);31        packet.addControl("hid", "grid_2", 1,"I", 0x40);32        packet.addControl("hid", "grid_1", 1,"I", 0x80);33        packet.addControl("hid", "grid_16", 1,"I", 0x100);34        packet.addControl("hid", "grid_15", 1,"I", 0x200);35        packet.addControl("hid", "grid_14", 1,"I", 0x400);36        packet.addControl("hid", "grid_13", 1,"I", 0x800);37        packet.addControl("hid", "grid_12", 1,"I", 0x1000);38        packet.addControl("hid", "grid_11", 1,"I", 0x2000);39        packet.addControl("hid", "grid_10", 1,"I", 0x4000);40        packet.addControl("hid", "grid_9", 1,"I", 0x8000);41        packet.addControl("hid", "shift", 1,"I", 0x800000);42        packet.addControl("hid", "reverse", 1,"I", 0x400000);43        packet.addControl("hid", "size", 1,"I", 0x100000);44        packet.addControl("hid", "type", 1,"I", 0x200000);45        packet.addControl("hid", "select_push", 1,"I", 0x40000);46        packet.addControl("hid", "browse", 1,"I", 0x80000);47        packet.addControl("hid", "play_1", 1,"I", 0x80000000);48        packet.addControl("hid", "play_2", 1,"I", 0x40000000);49        packet.addControl("hid", "play_3", 1,"I", 0x20000000);50        packet.addControl("hid", "play_4", 1,"I", 0x10000000);51        packet.addControl("hid", "sync", 1,"I", 0x8000000);52        packet.addControl("hid", "quant", 1,"I", 0x4000000);53        packet.addControl("hid", "capture", 1,"I", 0x2000000);54        packet.addControl("hid", "select_encoder", 5,"B", undefined,true);55        // Knobs have value range 0-4092, so while some controls are56        // -1..0..1 range, hidparser will return same data as with h57        // packing (16 bit range while we only use 12 bits)58        packet.addControl("hid", "knob_1", 6,"H");59        packet.addControl("hid", "knob_2", 8,"H");60        packet.addControl("hid", "knob_3", 10,"H");61        packet.addControl("hid", "knob_4", 12,"H");62        packet.addControl("hid", "fader_1", 14,"H");63        packet.addControl("hid", "fader_2", 16,"H");64        packet.addControl("hid", "fader_3", 18,"H");65        packet.addControl("hid", "fader_4", 20,"H");66        this.controller.registerInputPacket(packet);67    }68    this.registerOutputPackets = function() {69        var packet = undefined;70        packet = new HIDPacket("lights", [0x80],81);71        // Right 7-segment element - 0x0 off, 0x40 on72        packet.addControl("hid", "right_segment_dp", 1,"B");73        packet.addControl("hid", "right_segment_1", 2,"B");74        packet.addControl("hid", "right_segment_2", 3,"B");75        packet.addControl("hid", "right_segment_3", 4,"B");76        packet.addControl("hid", "right_segment_4", 5,"B");77        packet.addControl("hid", "right_segment_5", 6,"B");78        packet.addControl("hid", "right_segment_6", 7,"B");79        packet.addControl("hid", "right_segment_7", 8,"B");80        // Left 7-segment element - 0x0 off, 0x40 on81        packet.addControl("hid", "left_segment_dp", 9,"B");82        packet.addControl("hid", "left_segment_1", 10,"B");83        packet.addControl("hid", "left_segment_2", 11,"B");84        packet.addControl("hid", "left_segment_3", 12,"B");85        packet.addControl("hid", "left_segment_4", 13,"B");86        packet.addControl("hid", "left_segment_5", 14,"B");87        packet.addControl("hid", "left_segment_6", 15,"B");88        packet.addControl("hid", "left_segment_7", 16,"B");89        // Button led brightness, 0-0xff90        packet.addControl("hid", "browse_brightness", 17,"B");91        packet.addControl("hid", "size_brightness", 18,"B");92        packet.addControl("hid", "type_brightness", 19,"B");93        packet.addControl("hid", "reverse_brightness", 20,"B");94        packet.addControl("hid", "shift_brightness", 21,"B");95        packet.addControl("hid", "capture_brightness", 22,"B");96        packet.addControl("hid", "quant_brightness", 23,"B");97        packet.addControl("hid", "sync_brightness", 24,"B");98        // Pad RGB color button controls, 3 bytes per pad99        packet.addControl("hid", "grid_1_blue", 25,"B")100        packet.addControl("hid", "grid_1_red", 26,"B")101        packet.addControl("hid", "grid_1_green", 27,"B")102        packet.addControl("hid", "grid_2_blue", 28,"B")103        packet.addControl("hid", "grid_2_red", 29,"B")104        packet.addControl("hid", "grid_2_green", 30,"B")105        packet.addControl("hid", "grid_3_blue", 31,"B")106        packet.addControl("hid", "grid_3_red", 32,"B")107        packet.addControl("hid", "grid_3_green", 33,"B")108        packet.addControl("hid", "grid_4_blue", 34,"B")109        packet.addControl("hid", "grid_4_red", 35,"B")110        packet.addControl("hid", "grid_4_green", 36,"B")111        packet.addControl("hid", "grid_5_blue", 37,"B")112        packet.addControl("hid", "grid_5_red", 38,"B")113        packet.addControl("hid", "grid_5_green", 39,"B")114        packet.addControl("hid", "grid_6_blue", 40,"B")115        packet.addControl("hid", "grid_6_red", 41,"B")116        packet.addControl("hid", "grid_6_green", 42,"B")117        packet.addControl("hid", "grid_7_blue", 43,"B")118        packet.addControl("hid", "grid_7_red", 44,"B")119        packet.addControl("hid", "grid_7_green", 45,"B")120        packet.addControl("hid", "grid_8_blue", 46,"B")121        packet.addControl("hid", "grid_8_red", 47,"B")122        packet.addControl("hid", "grid_8_green", 48,"B")123        packet.addControl("hid", "grid_9_blue", 49,"B")124        packet.addControl("hid", "grid_9_red", 50,"B")125        packet.addControl("hid", "grid_9_green", 51,"B")126        packet.addControl("hid", "grid_10_blue", 52,"B")127        packet.addControl("hid", "grid_10_red", 53,"B")128        packet.addControl("hid", "grid_10_green", 54,"B")129        packet.addControl("hid", "grid_11_blue", 55,"B")130        packet.addControl("hid", "grid_11_red", 56,"B")131        packet.addControl("hid", "grid_11_green", 57,"B")132        packet.addControl("hid", "grid_12_blue", 58,"B")133        packet.addControl("hid", "grid_12_red", 59,"B")134        packet.addControl("hid", "grid_12_green", 60,"B")135        packet.addControl("hid", "grid_13_blue", 61,"B")136        packet.addControl("hid", "grid_13_red", 62,"B")137        packet.addControl("hid", "grid_13_green", 63,"B")138        packet.addControl("hid", "grid_14_blue", 64,"B")139        packet.addControl("hid", "grid_14_red", 65,"B")140        packet.addControl("hid", "grid_14_green", 66,"B")141        packet.addControl("hid", "grid_15_blue", 67,"B")142        packet.addControl("hid", "grid_15_red", 68,"B")143        packet.addControl("hid", "grid_15_green", 69,"B")144        packet.addControl("hid", "grid_16_blue", 70,"B")145        packet.addControl("hid", "grid_16_red", 71,"B")146        packet.addControl("hid", "grid_16_green", 72,"B")147        // Play key brightness control, 0-0xff148        packet.addControl("hid", "play_4_1_brightness", 73,"B");149        packet.addControl("hid", "play_4_2_brightness", 74,"B");150        packet.addControl("hid", "play_3_1_brightness", 75,"B");151        packet.addControl("hid", "play_3_2_brightness", 76,"B");152        packet.addControl("hid", "play_2_1_brightness", 77,"B");153        packet.addControl("hid", "play_2_2_brightness", 78,"B");154        packet.addControl("hid", "play_1_1_brightness", 79,"B");155        packet.addControl("hid", "play_1_2_brightness", 80,"B");156        this.controller.registerOutputPacket(packet);157    }158    this.initializeHIDController = function() {159        this.scalers = new Object();160        this.scalers["volume"] = function(value) {161            return script.absoluteLin(value, 0, 1, 0, 4096);162        }163        this.scalers["pregain"] = function(value) {164            return script.absoluteNonLin(value,0,1,5,0,4096);165        }166        this.scalers["rate"] = function(value) {167            return script.absoluteLin(value,-1,1,0,4096);168        }169        this.scalers["ratereversed"] = function(value) {170            return -script.absoluteLin(value,-1,1,0,4096);171        }172        this.scalers["plusminus"] = function(value) {173            return script.absoluteLin(value,-1,1,0,4096);174        }175        this.scalers["eq"] = function(value) {176            return script.absoluteNonLin(value, 0, 1, 4, 0, 4096);177        }178        this.registerInputPackets();179        this.registerOutputPackets();180    }181    // Set brightness for single color buttons with brigthness adjustment182    // Valid adjustment range is 0-0x7f183    this.setButtonBrightness = function(name, value) {184        var controller = this.controller;185        var packet = controller.getOutputPacket("lights");186        if (name.match(/grid_/)) {187            HIDDebug("ERROR: set PAD colors with setPADColor");188            return;189        }190        if (!name.match(/.*_brightness$/))191            name = name + "_brightness";192        var field = packet.getField("hid", name);193        if (field==undefined) {194            HIDDebug("button field not found: " + name);195            return;196        }197        if (value<0)198            value = 0;199        if (value>0x7f)200            value = 0x7f;201        field.value = value;202    }203    this.segments = function(number) {204    }205    this.set7SegmentNumber = function(number) {206        var controller = this.controller;207        var packet = controller.getOutputPacket("lights");208        if (number != undefined) {209            left = KontrolF1.segments[Math.floor(number/10)];210            right = KontrolF1.segments[number % 10];211        } else {212            left = KontrolF1.segments['empty'];213            right = KontrolF1.segments['empty'];214        }215        for (var i=0;i<7;i++) {216            field = packet.getField("hid", "left_segment_"+(i+1));217            field.value = left[i];218            field = packet.getField("hid", "right_segment_"+(i+1));219            field.value = right[i];220        }221        HIDDebug("segments left " + left + " right "  + right);222    }223    // Set the 8 bytes in left or right 7-segment display. DP is the dot.224    this.set7SegmentValue = function(name, dp, v1, v2, v3, v4, v5, v6, v7) {225        var controller = this.controller;226        var packet = controller.getOutputPacket("lights");227        var field = undefined;228        field = packet.getField("hid", name+"_segment_dp");229        field.value = dp;230        field = packet.getField("hid", name+"_segment_1");231        field.value = v1;232        field = packet.getField("hid", name+"_segment_2");233        field.value = v2;234        field = packet.getField("hid", name+"_segment_3");235        field.value = v3;236        field = packet.getField("hid", name+"_segment_4");237        field.value = v4;238        field = packet.getField("hid", name+"_segment_5");239        field.value = v5;240        field = packet.getField("hid", name+"_segment_6");241        field.value = v6;242        field = packet.getField("hid", name+"_segment_7");243        field.value = v7;244    }245    // Set RGB color for one of the 16 pads.246    // Index is pad number index as 1-16.247    // Valid range for each color is 0-0x7f.248    this.setPADColor = function(index,red,green,blue) {249        var controller = this.controller;250        var packet = controller.getOutputPacket("lights");251        var field = undefined;252        if (index<=0 || index>16) {253            HIDDebug("Invalid grid index" + index);254            return;255        }256        if (red==undefined)257            red=0;258        if (red>0x7f)259            red=0x7f;260        field = packet.getField("hid", "grid_"+index+"_red");261        field.value = red;262        if (green==undefined)263            green=0;264        if (green>0x7f)265            green=0x7f;266        field = packet.getField("hid", "grid_"+index+"_green");267        field.value = green;268        if (blue==undefined)269            blue=0;270        if (blue>0x7f)271            blue=0x7f;272        field = packet.getField("hid", "grid_"+index+"_blue");273        field.value = blue;274    }275    // reset all lights to off state276    this.resetLEDs = function() {277        var controller = this.controller;278        var packet = controller.getOutputPacket("lights");279        for (var group_name in packet.groups) {280            var group = packet.groups[group_name];281            for (var field_name in group) {282                var field = group[field_name];283                field.value = 0;284            }285        }286        packet.send();287    }288    // Send update for LED packets after LED state modifications289    this.updateLEDs = function() {290        var packet = this.controller.getOutputPacket("lights");291        packet.send();292    }293}294KontrolF1 = new KontrolF1Controller();295KontrolF1.init = function (id) {296    KontrolF1.id = id;297    KontrolF1.controlModeButtons = { "decks": "capture",  "samplers": "quant" };298    KontrolF1.defaultControlMode = "decks";299    KontrolF1.initializeHIDController();300    var controller = KontrolF1.controller;301    KontrolF1.knobs = new Object();302    KontrolF1.faders = new Object();303    KontrolF1.grids = new Object();304    KontrolF1.playbuttons = new Object();305    KontrolF1.segments = new Object();306    controller.postProcessDelta = KontrolF1.ButtonLEDPressUpdate;307    KontrolF1.registerCallbacks();308    KontrolF1.resetLEDs();309    KontrolF1.setControlMode(KontrolF1.defaultControlMode);310    // Timers can't be defined in prototype with this.311    if (KontrolF1.LEDUpdateInterval!=undefined) {312        KontrolF1.LEDTimer = engine.beginTimer(313            KontrolF1.LEDUpdateInterval,314            "KontrolF1.controller.updateLEDs(true)"315        );316    }317    KontrolF1.segments['empty'] = [0,0,0,0,0,0,0];318    KontrolF1.segments[0] = [0x0,0x40,0x40,0x40,0x40,0x40,0x40];319    KontrolF1.segments[1] = [0x0,0x40,0x40,0x0,0x0,0x0,0x0];320    KontrolF1.segments[2] = [0x40,0x0,0x40,0x40,0,0x40,0x40];321    KontrolF1.segments[3] = [0x40,0x40,0x40,0x40,0,0x0,0x40];322    KontrolF1.segments[4] = [0x40,0x40,0x40,0x0,0x40,0x0,0x0];323    KontrolF1.segments[5] = [0x40,0x40,0x0,0x40,0x40,0x0,0x40];324    KontrolF1.segments[6] = [0x40,0x40,0x0,0x40,0x40,0x40,0x40];325    KontrolF1.segments[7] = [0x0,0x40,0x40,0x40,0x0,0x0,0x0];326    KontrolF1.segments[8] = [0x40,0x40,0x40,0x40,0x40,0x40,0x40];327    KontrolF1.segments[9] = [0x40,0x40,0x40,0x40,0x40,0x0,0x40];328    KontrolF1.testUpdateInterval = 5;329    KontrolF1.testSegment = 0;330    KontrolF1.testTimer = engine.beginTimer(331        KontrolF1.testUpdateInterval,332        "KontrolF1.testSegments()"333    );334    KontrolF1.updateLEDs();335    HIDDebug("NI Traktor F1 "+KontrolF1.id+" initialized");336}337KontrolF1.testSegments = function() {338    if (KontrolF1.testSegment < 100) {339        KontrolF1.set7SegmentNumber(KontrolF1.testSegment);340        KontrolF1.testSegment += 1;341    } else {342        engine.stopTimer(KontrolF1.testTimer);343        KontrolF1.set7SegmentNumber(undefined);344    }345    KontrolF1.updateLEDs();346}347// Device cleanup function348KontrolF1.shutdown = function() {349    if (KontrolF1.LEDTimer!=undefined) {350        engine.stopTimer(KontrolF1.LEDTimer);351        KontrolF1.LEDTimer = undefined;352    }353    KontrolF1.shutdownHardware(2);354    HIDDebug("NI Traktor F1 "+KontrolF1.id+" shut down");355}356// Mandatory default handler for incoming packets357KontrolF1.incomingData = function(data,length) {358    KontrolF1.controller.parsePacket(data,length);359}360// Mandatory LED update callback handler361KontrolF1.activeLEDUpdateWrapper = function() {362    KontrolF1.controller.updateActiveDeckLEDs();363}364// Handle button LED updates after packet receive if required:365// F1 will reset LEDs to a default state without this366// Registered as packet post processing callback in init.367KontrolF1.ButtonLEDPressUpdate = function(packet,changed_data) {368    var send_led_update = false;369    for (var field in changed_data) {370        var delta = changed_data[field];371        var name = field.split(".")[1]372        // Select encoder also resets LEDs for some reason373        if (field=="select_encoder") {374            send_led_update = true;375            break;376        }377        // Check if this is one of permanently lit LEDs378        var controlmode = false;379        for (mode in KontrolF1.controlModeButtons) {380            if (KontrolF1.controlModeButtons[mode]==name) {381                controlmode = true;382                break;383            }384        }385        if (controlmode) {386            send_led_update = true;387            break;388        }389        // Update leds if any of these buttons were modified in packet390        if (KontrolF1.buttonNames.indexOf(name)!=-1) {391            if (delta.value==1)392                KontrolF1.setButtonBrightness(name,0x7f);393            if (delta.value==0)394                KontrolF1.setButtonBrightness(name,0);395            send_led_update = true;396            break;397        }398        // Update leds if any of pads was pressed399        if (/grid_[0-9]/.test(name)) {400            send_led_update = true;401            break;402        }403    }404    if (send_led_update)405        KontrolF1.updateLEDs();406}407KontrolF1.disconnectModeLEDs = function(mode) {408    var grid = KontrolF1.grids[mode];409    var buttons = KontrolF1.playbuttons[mode];410    for (var name in grid) {411        var button = grid[name];412        if (button.ledname==undefined)413            continue414        engine.connectControl(button.group, button.ledname,415            KontrolF1.setLED, false416        );417    }418    for (var name in buttons) {419        var button = buttons[name];420        var button_index = parseInt(name.split("_")[1]);421        if (button.ledname==undefined)422            continue;423        engine.connectControl(button.group, button.ledname,424            KontrolF1.setLED, false425        );426    }427}428KontrolF1.connectModeLEDs = function(mode) {429    var grid = KontrolF1.grids[mode];430    var buttons = KontrolF1.playbuttons[mode];431    var color;432    for (var name in grid) {433        var button = grid[name];434        var button_index = parseInt(name.split("_")[1]);435        if (button.ledname==undefined)436            continue;437        engine.connectControl(button.group, button.ledname,438            KontrolF1.setLED439        );440        if (engine.getValue(button.group, button.ledname))441            value = button.ledcolor;442        else443            value = 0,0,0;444        KontrolF1.setPADColor(button_index,value[0],value[1],value[2]);445    }446    for (var name in buttons) {447        var button = buttons[name];448        var button_index = parseInt(name.split("_")[1]);449        if (button.ledname==undefined)450            continue;451        engine.connectControl(button.group, button.ledname,452            KontrolF1.setLED453        );454        value = (engine.getValue(button.group,button.name)==1) ? 0x7f :0;455        KontrolF1.setButtonBrightness("play_"+button_index+"_1", value);456        KontrolF1.setButtonBrightness("play_"+button_index+"_2", value);457    }458    KontrolF1.updateLEDs();459}460KontrolF1.setLED = function(value,group,key) {461    var grid = KontrolF1.grids[KontrolF1.controlMode];462    var buttons = KontrolF1.playbuttons[KontrolF1.controlMode];463    var matched = false;464    for (var name in grid) {465        var button = grid[name];466        var button_index = parseInt(name.split("_")[1]);467        if (button.group!=group || button.ledname!=key)468            continue;469        if (value)470            value = button.ledcolor;471        else472            value = 0,0,0;473        KontrolF1.setPADColor(button_index,value[0],value[1],value[2]);474        matched = true;475        break;476    }477    for (var name in buttons) {478        var button = buttons[name];479        var button_index = parseInt(name.split("_")[1]);480        if (button.group!=group || button.name!=key)481            continue;482        value = (value==1) ? 0x7f : 0;483        KontrolF1.setButtonBrightness("play_"+button_index+"_1", value);484        KontrolF1.setButtonBrightness("play_"+button_index+"_2", value);485        matched = true;486        break;487    }488    KontrolF1.updateLEDs();489}490KontrolF1.linkKnob = function(mode,knob,group,name,scaler) {491    if (!(mode in KontrolF1.knobs))492        KontrolF1.knobs[mode] = new Object();493    var mapping = new Object();494    mapping.mode = mode;495    mapping.knob = knob;496    mapping.group = group;497    mapping.name = name;498    mapping.scaler = scaler;499    KontrolF1.knobs[mode][knob] = mapping;500}501KontrolF1.knob = function(field) {502    var controller = KontrolF1.controller;503    var mode = KontrolF1.knobs[KontrolF1.controlMode];504    if (mode==undefined) {505        HIDDebug("Knob group not mapped in mode " + KontrolF1.controlMode);506        return;507    }508    var knob = mode[field.name];509    if (knob==undefined) {510        HIDDebug("Fader "+field.name+ " not mapped in " + KontrolF1.controlMode);511        return;512    }513    return KontrolF1.control(knob,field);514}515KontrolF1.linkFader = function(mode,fader,group,name,scaler,callback) {516    if (!(mode in KontrolF1.faders))517        KontrolF1.faders[mode] = new Object();518    var mapping = new Object();519    mapping.mode = mode;520    mapping.fader = fader;521    mapping.group = group;522    mapping.name = name;523    mapping.scaler = scaler;524    mapping.callback = callback;525    KontrolF1.faders[mode][fader] = mapping;526}527KontrolF1.fader = function(field) {528    var controller = KontrolF1.controller;529    var mode = KontrolF1.faders[KontrolF1.controlMode];530    if (mode==undefined) {531        HIDDebug("Fader group not mapped in mode " + KontrolF1.controlMode);532        return;533    }534    var fader = mode[field.name];535    if (fader==undefined) {536        HIDDebug("Fader "+field.name+ " not mapped in " + KontrolF1.controlMode);537        return;538    }539    return KontrolF1.control(fader,field);540}541KontrolF1.linkGrid = function(mode,button,group,name,toggle,callback,ledcolor,ledname) {542    if (!(mode in KontrolF1.grids))543        KontrolF1.grids[mode] = new Object();544    if (ledname==undefined) {545        if (name.match(/hotcue_[0-9]/))546            ledname = name + '_enabled';547        else548            ledname = name;549    }550    if (ledcolor==undefined) {551        ledcolor = [0x7f,0x7f,0x7f];552    }553    var mapping = new Object();554    mapping.mode = mode;555    mapping.button = button;556    mapping.group = group;557    mapping.name = name;558    mapping.toggle = toggle;559    mapping.ledname = ledname;560    mapping.ledcolor = ledcolor;561    mapping.callback = callback;562    KontrolF1.grids[mode][button] = mapping;563}564KontrolF1.grid = function(field) {565    var mode = KontrolF1.grids[KontrolF1.controlMode];566    if (mode==undefined) {567        HIDDebug("Grid button group not mapped in " + KontrolF1.controlMode);568        return;569    }570    var button = mode[field.name];571    if (button==undefined) {572        HIDDebug("Grid "+field.name+ " not mapped in " + KontrolF1.controlMode);573        return;574    }575    return KontrolF1.button(button,field);576}577KontrolF1.linkPlay = function(mode,button,group,name,toggle,callback,ledname) {578    if (!(mode in KontrolF1.playbuttons))579        KontrolF1.playbuttons[mode] = new Object();580    if (ledname==undefined) {581        if (name.match(/hotcue_[0-9]/))582            ledname = name + '_enabled';583        else584            ledname = name;585    }586    var mapping = new Object();587    mapping.mode = mode;588    mapping.button = button;589    mapping.group = group;590    mapping.name = name;591    mapping.toggle = toggle;592    mapping.ledname = ledname;593    mapping.callback = callback;594    KontrolF1.playbuttons[mode][button] = mapping;595}596KontrolF1.play = function(field) {597    var mode = KontrolF1.playbuttons[KontrolF1.controlMode];598    if (mode==undefined) {599        HIDDebug("Play button group not mapped in " + KontrolF1.controlMode);600        return;601    }602    var button = mode[field.name];603    if (button==undefined) {604        HIDDebug("Play button "+field.name+ " not mapped in " + KontrolF1.controlMode);605        return;606    }607    return KontrolF1.button(button,field);608}609KontrolF1.control = function(control,field) {610    if (control.callback!=undefined) {611        control.callback(control,field);612        return;613    }614    var scaler = KontrolF1.scalers[control.scaler];615    engine.setValue(control.group,control.name,scaler(field.value));616}617KontrolF1.button = function(button,field) {618    var controller = KontrolF1.controller;619    if (button.callback!=undefined) {620        button.callback(button,field);621        return;622    }623    if (button.toggle) {624        if (button.name=='play')625            controller.togglePlay(button.group,field);626        else627            controller.toggle(button.group,button.name,field.value);628    } else {629        var value = (field.value==1) ? true : false;630        engine.setValue(button.group,button.name,value);631    }632}633KontrolF1.switchControlMode = function(field) {634    if (field.name=='quant') {635        KontrolF1.setControlMode("samplers");636    } else if (field.name=='capture') {637        KontrolF1.setControlMode("decks");638    } else {639        HIDDebug("Unconfigured mode selector button: " + field.name);640        return;641    }642}643KontrolF1.setControlMode = function(mode) {644    if (mode==KontrolF1.controlMode)645        return;646    if (!(mode in KontrolF1.controlModeButtons)) {647        HIDDebug("Unconfigured control mode: " + mode);648        return;649    }650    if (KontrolF1.controlMode!=undefined) {651        KontrolF1.disconnectModeLEDs(KontrolF1.controlMode);652        KontrolF1.setButtonBrightness(653            KontrolF1.controlModeButtons[KontrolF1.controlMode],0654        );655    }656    KontrolF1.controlMode = mode;657    led = KontrolF1.controlModeButtons[mode];658    KontrolF1.connectModeLEDs(KontrolF1.controlMode);659    KontrolF1.setButtonBrightness(660        KontrolF1.controlModeButtons[KontrolF1.controlMode],0x7f661    );662    KontrolF1.updateLEDs();663}664KontrolF1.registerCallbacks = function() {665    var controller = KontrolF1.controller;666    HIDDebug("Registering HID callbacks");667    controller.linkControl("hid", "select_encoder", "[Playlist]", "SelectTrackKnob");668    controller.linkControl("hid", "select_push", "[Playlist]", "LoadSelectedIntoFirstStopped");669    controller.linkModifier("hid", "shift", "shift");670    controller.setCallback("control", "hid", "capture", KontrolF1.switchControlMode);671    controller.setCallback("control", "hid", "quant", KontrolF1.switchControlMode);672    controller.setCallback("control", "hid", "knob_1", KontrolF1.knob);673    controller.setCallback("control", "hid", "knob_2", KontrolF1.knob);674    controller.setCallback("control", "hid", "knob_3", KontrolF1.knob);675    controller.setCallback("control", "hid", "knob_4", KontrolF1.knob);676    controller.setCallback("control", "hid", "fader_1", KontrolF1.fader);677    controller.setCallback("control", "hid", "fader_2", KontrolF1.fader);678    controller.setCallback("control", "hid", "fader_3", KontrolF1.fader);679    controller.setCallback("control", "hid", "fader_4", KontrolF1.fader);680    controller.setCallback("control", "hid", "grid_1", KontrolF1.grid);681    controller.setCallback("control", "hid", "grid_2", KontrolF1.grid);682    controller.setCallback("control", "hid", "grid_3", KontrolF1.grid);683    controller.setCallback("control", "hid", "grid_4", KontrolF1.grid);684    controller.setCallback("control", "hid", "grid_5", KontrolF1.grid);685    controller.setCallback("control", "hid", "grid_6", KontrolF1.grid);686    controller.setCallback("control", "hid", "grid_7", KontrolF1.grid);687    controller.setCallback("control", "hid", "grid_8", KontrolF1.grid);688    controller.setCallback("control", "hid", "grid_9", KontrolF1.grid);689    controller.setCallback("control", "hid", "grid_10", KontrolF1.grid);690    controller.setCallback("control", "hid", "grid_11", KontrolF1.grid);691    controller.setCallback("control", "hid", "grid_12", KontrolF1.grid);692    controller.setCallback("control", "hid", "grid_13", KontrolF1.grid);693    controller.setCallback("control", "hid", "grid_14", KontrolF1.grid);694    controller.setCallback("control", "hid", "grid_15", KontrolF1.grid);695    controller.setCallback("control", "hid", "grid_16", KontrolF1.grid);696    controller.setCallback("control", "hid", "play_1", KontrolF1.play);697    controller.setCallback("control", "hid", "play_2", KontrolF1.play);698    controller.setCallback("control", "hid", "play_3", KontrolF1.play);699    controller.setCallback("control", "hid", "play_4", KontrolF1.play);700    KontrolF1.linkKnob("decks", "knob_1", "[Master]", "headVolume", "pregain");701    KontrolF1.linkKnob("decks", "knob_2", "[Master]", "headMix", "plusminus");702    KontrolF1.linkKnob("decks", "knob_3", "[Master]", "balance", "plusminus");703    KontrolF1.linkKnob("decks", "knob_4", "[Master]", "volume", "pregain");704    KontrolF1.linkFader("decks", "fader_1", "[Channel1]", "rate", "rate");705    KontrolF1.linkFader("decks", "fader_2", "[Channel1]", "volume", "volume");706    KontrolF1.linkFader("decks", "fader_3", "[Channel2]", "volume", "volume");707    KontrolF1.linkFader("decks", "fader_4", "[Channel2]", "rate", "rate");708    KontrolF1.linkGrid("decks", "grid_1", "[Channel1]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x7f,0x0]);709    KontrolF1.linkGrid("decks", "grid_2", "[Channel1]", "hotcue_2", false,KontrolF1.hotcue,[0x7f,0x0,0x7f]);710    KontrolF1.linkGrid("decks", "grid_3", "[Channel2]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x7f,0x0]);711    KontrolF1.linkGrid("decks", "grid_4", "[Channel2]", "hotcue_2", false,KontrolF1.hotcue,[0x7f,0x0,0x7f]);712    KontrolF1.linkGrid("decks", "grid_5", "[Channel1]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x40,0x7f]);713    KontrolF1.linkGrid("decks", "grid_6", "[Channel1]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);714    KontrolF1.linkGrid("decks", "grid_7", "[Channel2]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x40,0x7f]);715    KontrolF1.linkGrid("decks", "grid_8", "[Channel2]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);716    KontrolF1.linkGrid("decks", "grid_9", "[Channel1]", "loop_in", false,undefined,[0x0,0x7f,0x0]);717    KontrolF1.linkGrid("decks", "grid_10", "[Channel1]", "loop_out", false,undefined,[0x0,0x7f,0x0]);718    KontrolF1.linkGrid("decks", "grid_11", "[Channel2]", "loop_in", false,undefined,[0x0,0x7f,0x0]);719    KontrolF1.linkGrid("decks", "grid_12", "[Channel2]", "loop_out", false,undefined,[0x0,0x7f,0x0]);720    KontrolF1.linkGrid("decks", "grid_13", "[Channel1]", "quantize", true,undefined,[0x10,0x10,0x40]);721    KontrolF1.linkGrid("decks", "grid_14", "[Channel1]", "reloop_exit", false,undefined,[0x7f,0x0,0x0]);722    KontrolF1.linkGrid("decks", "grid_15", "[Channel2]", "quantize", true,undefined,[0x10,0x10,0x40]);723    KontrolF1.linkGrid("decks", "grid_16", "[Channel2]", "reloop_exit");724    KontrolF1.linkPlay("decks", "play_1", "[Channel1]", "play", true);725    KontrolF1.linkPlay("decks", "play_2", "[Channel1]", "cue_default");726    KontrolF1.linkPlay("decks", "play_3", "[Channel2]", "play", true);727    KontrolF1.linkPlay("decks", "play_4", "[Channel2]", "cue_default");728    KontrolF1.linkKnob("samplers", "knob_1", "[Sampler1]", "rate", "ratereversed");729    KontrolF1.linkKnob("samplers", "knob_2", "[Sampler2]", "rate", "ratereversed");730    KontrolF1.linkKnob("samplers", "knob_3", "[Sampler3]", "rate", "ratereversed");731    KontrolF1.linkKnob("samplers", "knob_4", "[Sampler4]", "rate", "ratereversed");732    KontrolF1.linkFader("samplers", "fader_1", "[Sampler1]", "pregain", "pregain");733    KontrolF1.linkFader("samplers", "fader_2", "[Sampler2]", "pregain", "pregain");734    KontrolF1.linkFader("samplers", "fader_3", "[Sampler3]", "pregain", "pregain");735    KontrolF1.linkFader("samplers", "fader_4", "[Sampler4]", "pregain", "pregain");736    KontrolF1.linkGrid("samplers", "grid_1", "[Sampler1]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x0,0x0]);737    KontrolF1.linkGrid("samplers", "grid_2", "[Sampler2]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x0,0x0]);738    KontrolF1.linkGrid("samplers", "grid_3", "[Sampler3]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x0,0x0]);739    KontrolF1.linkGrid("samplers", "grid_4", "[Sampler4]", "hotcue_1", false,KontrolF1.hotcue,[0x7f,0x0,0x0]);740    KontrolF1.linkGrid("samplers", "grid_5", "[Sampler1]", "hotcue_2", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);741    KontrolF1.linkGrid("samplers", "grid_6", "[Sampler2]", "hotcue_2", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);742    KontrolF1.linkGrid("samplers", "grid_7", "[Sampler3]", "hotcue_2", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);743    KontrolF1.linkGrid("samplers", "grid_8", "[Sampler4]", "hotcue_2", false,KontrolF1.hotcue,[0x0,0x7f,0x0]);744    KontrolF1.linkGrid("samplers", "grid_9", "[Sampler1]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x0,0x7f]);745    KontrolF1.linkGrid("samplers", "grid_10", "[Sampler2]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x0,0x7f]);746    KontrolF1.linkGrid("samplers", "grid_11", "[Sampler3]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x0,0x7f]);747    KontrolF1.linkGrid("samplers", "grid_12", "[Sampler4]", "hotcue_3", false,KontrolF1.hotcue,[0x0,0x0,0x7f]);748    KontrolF1.linkGrid("samplers", "grid_13", "[Sampler1]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x7f]);749    KontrolF1.linkGrid("samplers", "grid_14", "[Sampler2]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x7f]);750    KontrolF1.linkGrid("samplers", "grid_15", "[Sampler3]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x7f]);751    KontrolF1.linkGrid("samplers", "grid_16", "[Sampler4]", "hotcue_4", false,KontrolF1.hotcue,[0x0,0x7f,0x7f]);752    KontrolF1.linkPlay("samplers", "play_1", "[Sampler1]", "play", true);753    KontrolF1.linkPlay("samplers", "play_2", "[Sampler2]", "play", true);754    KontrolF1.linkPlay("samplers", "play_3", "[Sampler3]", "play", true);755    KontrolF1.linkPlay("samplers", "play_4", "[Sampler4]", "play", true);756}757KontrolF1.hotcue = function(button,field) {758    var controller = KontrolF1.controller;759    var name;760    if (field.value == controller.buttonStates.released)761        return;762    if (controller.modifiers.get("shift"))763        name = button.name + '_clear';764    else765        name = button.name + '_activate';766    engine.setValue(button.group,name,true);...Calls.py
Source:Calls.py  
...7        global f,f1,g,h8        # define functions9        def f():10            pass11        def f1(x):12            pass13        def g(a,b,c):14            return a,b,c15        def h(a,b,c,d=1,e=2,f=3):16            return d,e,f17        # do calls18        for i in range(self.rounds):19            f()20            f1(i)21            f1(i)22            f1(i)23            f1(i)24            g(i,i,i)25            g(i,i,i)26            g(i,i,i)27            g(i,i,i)28            h(i,i,3,i,i)29            h(i,i,i,2,i,3)30            f()31            f1(i)32            f1(i)33            f1(i)34            f1(i)35            g(i,i,i)36            g(i,i,i)37            g(i,i,i)38            g(i,i,i)39            h(i,i,3,i,i)40            h(i,i,i,2,i,3)41            f()42            f1(i)43            f1(i)44            f1(i)45            f1(i)46            g(i,i,i)47            g(i,i,i)48            g(i,i,i)49            g(i,i,i)50            h(i,i,3,i,i)51            h(i,i,i,2,i,3)52            f()53            f1(i)54            f1(i)55            f1(i)56            f1(i)57            g(i,i,i)58            g(i,i,i)59            g(i,i,i)60            g(i,i,i)61            h(i,i,3,i,i)62            h(i,i,i,2,i,3)63            f()64            f1(i)65            f1(i)66            f1(i)67            f1(i)68            g(i,i,i)69            g(i,i,i)70            g(i,i,i)71            g(i,i,i)72            h(i,i,3,i,i)73            h(i,i,i,2,i,3)74    def calibrate(self):75        global f,f1,g,h76        # define functions77        def f():78            pass79        def f1(x):80            pass81        def g(a,b,c):82            return a,b,c83        def h(a,b,c,d=1,e=2,f=3):84            return d,e,f85        # do calls86        for i in range(self.rounds):87            pass88###89class ComplexPythonFunctionCalls(Test):90    version = 2.091    operations = 4*592    rounds = 10000093    def test(self):94        # define functions95        def f(a,b,c,d=1,e=2,f=3):96            return f97        args = 1,298        kwargs = dict(c=3,d=4,e=5)99        # do calls100        for i in range(self.rounds):101            f(a=i,b=i,c=i)102            f(f=i,e=i,d=i,c=2,b=i,a=3)103            f(1,b=i,**kwargs)104            f(*args,**kwargs)105            f(a=i,b=i,c=i)106            f(f=i,e=i,d=i,c=2,b=i,a=3)107            f(1,b=i,**kwargs)108            f(*args,**kwargs)109            f(a=i,b=i,c=i)110            f(f=i,e=i,d=i,c=2,b=i,a=3)111            f(1,b=i,**kwargs)112            f(*args,**kwargs)113            f(a=i,b=i,c=i)114            f(f=i,e=i,d=i,c=2,b=i,a=3)115            f(1,b=i,**kwargs)116            f(*args,**kwargs)117            f(a=i,b=i,c=i)118            f(f=i,e=i,d=i,c=2,b=i,a=3)119            f(1,b=i,**kwargs)120            f(*args,**kwargs)121    def calibrate(self):122        # define functions123        def f(a,b,c,d=1,e=2,f=3):124            return f125        args = 1,2126        kwargs = dict(c=3,d=4,e=5)127        # do calls128        for i in range(self.rounds):129            pass130###131class BuiltinFunctionCalls(Test):132    version = 2.0133    operations = 5*(2+5+5+5)134    rounds = 60000135    def test(self):136        # localize functions137        f0 = globals138        f1 = hash139        f2 = divmod140        f3 = max141        # do calls142        for i in range(self.rounds):143            f0()144            f0()145            f1(i)146            f1(i)147            f1(i)148            f1(i)149            f1(i)150            f2(1,2)151            f2(1,2)152            f2(1,2)153            f2(1,2)154            f2(1,2)155            f3(1,3,2)156            f3(1,3,2)157            f3(1,3,2)158            f3(1,3,2)159            f3(1,3,2)160            f0()161            f0()162            f1(i)163            f1(i)164            f1(i)165            f1(i)166            f1(i)167            f2(1,2)168            f2(1,2)169            f2(1,2)170            f2(1,2)171            f2(1,2)172            f3(1,3,2)173            f3(1,3,2)174            f3(1,3,2)175            f3(1,3,2)176            f3(1,3,2)177            f0()178            f0()179            f1(i)180            f1(i)181            f1(i)182            f1(i)183            f1(i)184            f2(1,2)185            f2(1,2)186            f2(1,2)187            f2(1,2)188            f2(1,2)189            f3(1,3,2)190            f3(1,3,2)191            f3(1,3,2)192            f3(1,3,2)193            f3(1,3,2)194            f0()195            f0()196            f1(i)197            f1(i)198            f1(i)199            f1(i)200            f1(i)201            f2(1,2)202            f2(1,2)203            f2(1,2)204            f2(1,2)205            f2(1,2)206            f3(1,3,2)207            f3(1,3,2)208            f3(1,3,2)209            f3(1,3,2)210            f3(1,3,2)211            f0()212            f0()213            f1(i)214            f1(i)215            f1(i)216            f1(i)217            f1(i)218            f2(1,2)219            f2(1,2)220            f2(1,2)221            f2(1,2)222            f2(1,2)223            f3(1,3,2)224            f3(1,3,2)225            f3(1,3,2)226            f3(1,3,2)227            f3(1,3,2)228    def calibrate(self):229        # localize functions230        f0 = dir231        f1 = hash232        f2 = divmod233        f3 = max234        # do calls235        for i in range(self.rounds):236            pass237###238class PythonMethodCalls(Test):239    version = 2.0240    operations = 5*(6 + 5 + 4)241    rounds = 30000242    def test(self):243        class c:244            x = 2245            s = 'string'246            def f(self):247                return self.x248            def j(self,a,b):249                self.y = a250                self.t = b251                return self.y252            def k(self,a,b,c=3):253                self.y = a254                self.s = b255                self.t = c256        o = c()257        for i in range(self.rounds):258            o.f()259            o.f()260            o.f()261            o.f()262            o.f()263            o.f()264            o.j(i,i)265            o.j(i,i)266            o.j(i,2)267            o.j(i,2)268            o.j(2,2)269            o.k(i,i)270            o.k(i,2)271            o.k(i,2,3)272            o.k(i,i,c=4)273            o.f()274            o.f()275            o.f()276            o.f()277            o.f()278            o.f()279            o.j(i,i)280            o.j(i,i)281            o.j(i,2)282            o.j(i,2)283            o.j(2,2)284            o.k(i,i)285            o.k(i,2)286            o.k(i,2,3)287            o.k(i,i,c=4)288            o.f()289            o.f()290            o.f()291            o.f()292            o.f()293            o.f()294            o.j(i,i)295            o.j(i,i)296            o.j(i,2)297            o.j(i,2)298            o.j(2,2)299            o.k(i,i)300            o.k(i,2)301            o.k(i,2,3)302            o.k(i,i,c=4)303            o.f()304            o.f()305            o.f()306            o.f()307            o.f()308            o.f()309            o.j(i,i)310            o.j(i,i)311            o.j(i,2)312            o.j(i,2)313            o.j(2,2)314            o.k(i,i)315            o.k(i,2)316            o.k(i,2,3)317            o.k(i,i,c=4)318            o.f()319            o.f()320            o.f()321            o.f()322            o.f()323            o.f()324            o.j(i,i)325            o.j(i,i)326            o.j(i,2)327            o.j(i,2)328            o.j(2,2)329            o.k(i,i)330            o.k(i,2)331            o.k(i,2,3)332            o.k(i,i,c=4)333    def calibrate(self):334        class c:335            x = 2336            s = 'string'337            def f(self):338                return self.x339            def j(self,a,b):340                self.y = a341                self.t = b342            def k(self,a,b,c=3):343                self.y = a344                self.s = b345                self.t = c346        o = c347        for i in range(self.rounds):348            pass349###350class Recursion(Test):351    version = 2.0352    operations = 5353    rounds = 100000354    def test(self):355        global f356        def f(x):357            if x > 1:358                return f(x-1)359            return 1360        for i in range(self.rounds):361            f(10)362            f(10)363            f(10)364            f(10)365            f(10)366    def calibrate(self):367        global f368        def f(x):369            if x > 0:370                return f(x-1)371            return 1372        for i in range(self.rounds):373            pass374### Test to make Fredrik happy...375if __name__ == '__main__':376    import timeit377    if 0:378        timeit.TestClass = PythonFunctionCalls379        timeit.main(['-s', 'test = TestClass(); test.rounds = 1000',380                     'test.test()'])381    else:382        setup = """\383global f,f1,g,h384# define functions385def f():386    pass387def f1(x):388    pass389def g(a,b,c):390    return a,b,c391def h(a,b,c,d=1,e=2,f=3):392    return d,e,f393i = 1394"""395        test = """\396f()397f1(i)398f1(i)399f1(i)400f1(i)401g(i,i,i)402g(i,i,i)403g(i,i,i)404g(i,i,i)405h(i,i,3,i,i)406h(i,i,i,2,i,3)407f()408f1(i)409f1(i)410f1(i)411f1(i)412g(i,i,i)413g(i,i,i)414g(i,i,i)415g(i,i,i)416h(i,i,3,i,i)417h(i,i,i,2,i,3)418f()419f1(i)420f1(i)421f1(i)422f1(i)423g(i,i,i)424g(i,i,i)425g(i,i,i)426g(i,i,i)427h(i,i,3,i,i)428h(i,i,i,2,i,3)429f()430f1(i)431f1(i)432f1(i)433f1(i)434g(i,i,i)435g(i,i,i)436g(i,i,i)437g(i,i,i)438h(i,i,3,i,i)439h(i,i,i,2,i,3)440f()441f1(i)442f1(i)443f1(i)444f1(i)445g(i,i,i)446g(i,i,i)447g(i,i,i)448g(i,i,i)449h(i,i,3,i,i)450h(i,i,i,2,i,3)451"""452        timeit.main(['-s', setup,...exception-propagate-from-dfg-to-llint.js
Source:exception-propagate-from-dfg-to-llint.js  
...81function g() {82    with({})83        h(o);84}85function f1() {86    try {87        g();88    } catch (e) {89        testFailed("Caught exception in wrong codeblock");90    }91}92function f2() {93    try {94        g();95    } catch (e) {96        testPassed("Caught exception in correct codeblock");97    }98}99f1();100f1();101f1();102f1();103f1();104f1();105f1();106f1();107f1();108f1();109f1();110f1();111f1();112f1();113f1();114f1();115f1();116f1();117f1();118f1();119f1();120f1();121f1();122f1();123f1();124f1();125f1();126f1();127f1();128f1();129f1();130f1();131f1();132f1();133f1();134f1();135f1();136f1();137f1();138f1();139f1();140f1();141f1();142f1();143f1();144f1();145f1();146f1();147f1();148f1();149f1();150f1();151f1();152f1();153f1();154f1();155f1();156f1();157f1();158f1();159f1();160f1();161f1();162f1();163f1();164f1();165f1();166f1();167f1();168f1();169f1();170f1();171f1();172f1();173f1();174f1();175f1();176f1();177f1();178shouldThrow = true;179f2();...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
