UNPKG

@dushixiang/guacamole-common-js

Version:
1 lines 121 kB
var Guacamole=Guacamole||{};Guacamole.ArrayBufferReader=function(stream){var guac_reader=this;stream.onblob=function(data){var binary=window.atob(data);var arrayBuffer=new ArrayBuffer(binary.length);var bufferView=new Uint8Array(arrayBuffer);for(var i=0;i<binary.length;i++)bufferView[i]=binary.charCodeAt(i);if(guac_reader.ondata)guac_reader.ondata(arrayBuffer)};stream.onend=function(){if(guac_reader.onend)guac_reader.onend()};this.ondata=null;this.onend=null};var Guacamole=Guacamole||{};Guacamole.ArrayBufferWriter=function(stream){var guac_writer=this;stream.onack=function(status){if(guac_writer.onack)guac_writer.onack(status)};function __send_blob(bytes){var binary="";for(var i=0;i<bytes.byteLength;i++)binary+=String.fromCharCode(bytes[i]);stream.sendBlob(window.btoa(binary))}this.blobLength=Guacamole.ArrayBufferWriter.DEFAULT_BLOB_LENGTH;this.sendData=function(data){var bytes=new Uint8Array(data);if(bytes.length<=guac_writer.blobLength)__send_blob(bytes);else{for(var offset=0;offset<bytes.length;offset+=guac_writer.blobLength)__send_blob(bytes.subarray(offset,offset+guac_writer.blobLength))}};this.sendEnd=function(){stream.sendEnd()};this.onack=null};Guacamole.ArrayBufferWriter.DEFAULT_BLOB_LENGTH=6048;var Guacamole=Guacamole||{};Guacamole.AudioContextFactory={singleton:null,getAudioContext:function getAudioContext(){var AudioContext=window.AudioContext||window.webkitAudioContext;if(AudioContext){try{if(!Guacamole.AudioContextFactory.singleton)Guacamole.AudioContextFactory.singleton=new AudioContext;return Guacamole.AudioContextFactory.singleton}catch(e){}}return null}};var Guacamole=Guacamole||{};Guacamole.AudioPlayer=function AudioPlayer(){this.sync=function sync(){}};Guacamole.AudioPlayer.isSupportedType=function isSupportedType(mimetype){return Guacamole.RawAudioPlayer.isSupportedType(mimetype)};Guacamole.AudioPlayer.getSupportedTypes=function getSupportedTypes(){return Guacamole.RawAudioPlayer.getSupportedTypes()};Guacamole.AudioPlayer.getInstance=function getInstance(stream,mimetype){if(Guacamole.RawAudioPlayer.isSupportedType(mimetype))return new Guacamole.RawAudioPlayer(stream,mimetype);return null};Guacamole.RawAudioPlayer=function RawAudioPlayer(stream,mimetype){var format=Guacamole.RawAudioFormat.parse(mimetype);var context=Guacamole.AudioContextFactory.getAudioContext();var nextPacketTime=context.currentTime;var reader=new Guacamole.ArrayBufferReader(stream);var MIN_SPLIT_SIZE=.02;var maxLatency=.3;var SampleArray=format.bytesPerSample===1?window.Int8Array:window.Int16Array;var maxSampleValue=format.bytesPerSample===1?128:32768;var packetQueue=[];var joinAudioPackets=function joinAudioPackets(packets){if(packets.length<=1)return packets[0];var totalLength=0;packets.forEach((function addPacketLengths(packet){totalLength+=packet.length}));var offset=0;var joined=new SampleArray(totalLength);packets.forEach((function appendPacket(packet){joined.set(packet,offset);offset+=packet.length}));return joined};var splitAudioPacket=function splitAudioPacket(data){var minValue=Number.MAX_VALUE;var optimalSplitLength=data.length;var samples=Math.floor(data.length/format.channels);var minSplitSamples=Math.floor(format.rate*MIN_SPLIT_SIZE);var start=Math.max(format.channels*minSplitSamples,format.channels*(samples-minSplitSamples));for(var offset=start;offset<data.length;offset+=format.channels){var totalValue=0;for(var channel=0;channel<format.channels;channel++){totalValue+=Math.abs(data[offset+channel])}if(totalValue<=minValue){optimalSplitLength=offset+format.channels;minValue=totalValue}}if(optimalSplitLength===data.length)return[data];return[new SampleArray(data.buffer.slice(0,optimalSplitLength*format.bytesPerSample)),new SampleArray(data.buffer.slice(optimalSplitLength*format.bytesPerSample))]};var pushAudioPacket=function pushAudioPacket(data){packetQueue.push(new SampleArray(data))};var shiftAudioPacket=function shiftAudioPacket(){var data=joinAudioPackets(packetQueue);if(!data)return null;packetQueue=splitAudioPacket(data);data=packetQueue.shift();return data};var toAudioBuffer=function toAudioBuffer(data){var samples=data.length/format.channels;var packetTime=context.currentTime;if(nextPacketTime<packetTime)nextPacketTime=packetTime;var audioBuffer=context.createBuffer(format.channels,samples,format.rate);for(var channel=0;channel<format.channels;channel++){var audioData=audioBuffer.getChannelData(channel);var offset=channel;for(var i=0;i<samples;i++){audioData[i]=data[offset]/maxSampleValue;offset+=format.channels}}return audioBuffer};reader.ondata=function playReceivedAudio(data){pushAudioPacket(new SampleArray(data));var packet=shiftAudioPacket();if(!packet)return;var packetTime=context.currentTime;if(nextPacketTime<packetTime)nextPacketTime=packetTime;var source=context.createBufferSource();source.connect(context.destination);if(!source.start)source.start=source.noteOn;source.buffer=toAudioBuffer(packet);source.start(nextPacketTime);nextPacketTime+=packet.length/format.channels/format.rate};this.sync=function sync(){var now=context.currentTime;nextPacketTime=Math.min(nextPacketTime,now+maxLatency)}};Guacamole.RawAudioPlayer.prototype=new Guacamole.AudioPlayer;Guacamole.RawAudioPlayer.isSupportedType=function isSupportedType(mimetype){if(!Guacamole.AudioContextFactory.getAudioContext())return false;return Guacamole.RawAudioFormat.parse(mimetype)!==null};Guacamole.RawAudioPlayer.getSupportedTypes=function getSupportedTypes(){if(!Guacamole.AudioContextFactory.getAudioContext())return[];return["audio/L8","audio/L16"]};var Guacamole=Guacamole||{};Guacamole.AudioRecorder=function AudioRecorder(){this.onclose=null;this.onerror=null};Guacamole.AudioRecorder.isSupportedType=function isSupportedType(mimetype){return Guacamole.RawAudioRecorder.isSupportedType(mimetype)};Guacamole.AudioRecorder.getSupportedTypes=function getSupportedTypes(){return Guacamole.RawAudioRecorder.getSupportedTypes()};Guacamole.AudioRecorder.getInstance=function getInstance(stream,mimetype){if(Guacamole.RawAudioRecorder.isSupportedType(mimetype))return new Guacamole.RawAudioRecorder(stream,mimetype);return null};Guacamole.RawAudioRecorder=function RawAudioRecorder(stream,mimetype){var recorder=this;var BUFFER_SIZE=2048;var LANCZOS_WINDOW_SIZE=3;var format=Guacamole.RawAudioFormat.parse(mimetype);var context=Guacamole.AudioContextFactory.getAudioContext();if(!navigator.mediaDevices)navigator.mediaDevices={};if(!navigator.mediaDevices.getUserMedia)navigator.mediaDevices.getUserMedia=(navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia).bind(navigator);var writer=new Guacamole.ArrayBufferWriter(stream);var SampleArray=format.bytesPerSample===1?window.Int8Array:window.Int16Array;var maxSampleValue=format.bytesPerSample===1?128:32768;var readSamples=0;var writtenSamples=0;var mediaStream=null;var source=null;var processor=null;var sinc=function sinc(x){if(x===0)return 1;var piX=Math.PI*x;return Math.sin(piX)/piX};var lanczos=function lanczos(x,a){if(-a<x&&x<a)return sinc(x)*sinc(x/a);return 0};var interpolateSample=function getValueAt(audioData,t){var index=(audioData.length-1)*t;var start=Math.floor(index)-LANCZOS_WINDOW_SIZE+1;var end=Math.floor(index)+LANCZOS_WINDOW_SIZE;var sum=0;for(var i=start;i<=end;i++){sum+=(audioData[i]||0)*lanczos(index-i,LANCZOS_WINDOW_SIZE)}return sum};var toSampleArray=function toSampleArray(audioBuffer){var inSamples=audioBuffer.length;readSamples+=inSamples;var expectedWrittenSamples=Math.round(readSamples*format.rate/audioBuffer.sampleRate);var outSamples=expectedWrittenSamples-writtenSamples;writtenSamples+=outSamples;var data=new SampleArray(outSamples*format.channels);for(var channel=0;channel<format.channels;channel++){var audioData=audioBuffer.getChannelData(channel);var offset=channel;for(var i=0;i<outSamples;i++){data[offset]=interpolateSample(audioData,i/(outSamples-1))*maxSampleValue;offset+=format.channels}}return data};var streamReceived=function streamReceived(stream){processor=context.createScriptProcessor(BUFFER_SIZE,format.channels,format.channels);processor.connect(context.destination);processor.onaudioprocess=function processAudio(e){writer.sendData(toSampleArray(e.inputBuffer).buffer)};source=context.createMediaStreamSource(stream);source.connect(processor);if(context.state==="suspended")context.resume();mediaStream=stream};var streamDenied=function streamDenied(){writer.sendEnd();if(recorder.onerror)recorder.onerror()};var beginAudioCapture=function beginAudioCapture(){var promise=navigator.mediaDevices.getUserMedia({audio:true},streamReceived,streamDenied);if(promise&&promise.then)promise.then(streamReceived,streamDenied)};var stopAudioCapture=function stopAudioCapture(){if(source)source.disconnect();if(processor)processor.disconnect();if(mediaStream){var tracks=mediaStream.getTracks();for(var i=0;i<tracks.length;i++)tracks[i].stop()}processor=null;source=null;mediaStream=null;writer.sendEnd()};writer.onack=function audioStreamAcknowledged(status){if(status.code===Guacamole.Status.Code.SUCCESS&&!mediaStream)beginAudioCapture();else{stopAudioCapture();writer.onack=null;if(status.code===Guacamole.Status.Code.RESOURCE_CLOSED){if(recorder.onclose)recorder.onclose()}else{if(recorder.onerror)recorder.onerror()}}}};Guacamole.RawAudioRecorder.prototype=new Guacamole.AudioRecorder;Guacamole.RawAudioRecorder.isSupportedType=function isSupportedType(mimetype){if(!Guacamole.AudioContextFactory.getAudioContext())return false;return Guacamole.RawAudioFormat.parse(mimetype)!==null};Guacamole.RawAudioRecorder.getSupportedTypes=function getSupportedTypes(){if(!Guacamole.AudioContextFactory.getAudioContext())return[];return["audio/L8","audio/L16"]};var Guacamole=Guacamole||{};Guacamole.BlobReader=function(stream,mimetype){var guac_reader=this;var length=0;var blob_builder;if(window.BlobBuilder)blob_builder=new BlobBuilder;else if(window.WebKitBlobBuilder)blob_builder=new WebKitBlobBuilder;else if(window.MozBlobBuilder)blob_builder=new MozBlobBuilder;else blob_builder=new function(){var blobs=[];this.append=function(data){blobs.push(new Blob([data],{type:mimetype}))};this.getBlob=function(){return new Blob(blobs,{type:mimetype})}};stream.onblob=function(data){var binary=window.atob(data);var arrayBuffer=new ArrayBuffer(binary.length);var bufferView=new Uint8Array(arrayBuffer);for(var i=0;i<binary.length;i++)bufferView[i]=binary.charCodeAt(i);blob_builder.append(arrayBuffer);length+=arrayBuffer.byteLength;if(guac_reader.onprogress)guac_reader.onprogress(arrayBuffer.byteLength);stream.sendAck("OK",0)};stream.onend=function(){if(guac_reader.onend)guac_reader.onend()};this.getLength=function(){return length};this.getBlob=function(){return blob_builder.getBlob()};this.onprogress=null;this.onend=null};var Guacamole=Guacamole||{};Guacamole.BlobWriter=function BlobWriter(stream){var guacWriter=this;var arrayBufferWriter=new Guacamole.ArrayBufferWriter(stream);arrayBufferWriter.onack=function(status){if(guacWriter.onack)guacWriter.onack(status)};var slice=function slice(blob,start,end){var sliceImplementation=(blob.slice||blob.webkitSlice||blob.mozSlice).bind(blob);var length=end-start;if(length!==end){var sliceResult=sliceImplementation(start,length);if(sliceResult.size===length)return sliceResult}return sliceImplementation(start,end)};this.sendBlob=function sendBlob(blob){var offset=0;var reader=new FileReader;var readNextChunk=function readNextChunk(){if(offset>=blob.size){if(guacWriter.oncomplete)guacWriter.oncomplete(blob);return}var chunk=slice(blob,offset,offset+arrayBufferWriter.blobLength);offset+=arrayBufferWriter.blobLength;reader.readAsArrayBuffer(chunk)};reader.onload=function chunkLoadComplete(){arrayBufferWriter.sendData(reader.result);arrayBufferWriter.onack=function sendMoreChunks(status){if(guacWriter.onack)guacWriter.onack(status);if(status.isError())return;if(guacWriter.onprogress)guacWriter.onprogress(blob,offset-arrayBufferWriter.blobLength);readNextChunk()}};reader.onerror=function chunkLoadFailed(){if(guacWriter.onerror)guacWriter.onerror(blob,offset,reader.error)};readNextChunk()};this.sendEnd=function sendEnd(){arrayBufferWriter.sendEnd()};this.onack=null;this.onerror=null;this.onprogress=null;this.oncomplete=null};var Guacamole=Guacamole||{};Guacamole.Client=function(tunnel){var guac_client=this;var STATE_IDLE=0;var STATE_CONNECTING=1;var STATE_WAITING=2;var STATE_CONNECTED=3;var STATE_DISCONNECTING=4;var STATE_DISCONNECTED=5;var currentState=STATE_IDLE;var currentTimestamp=0;var KEEP_ALIVE_FREQUENCY=5e3;var keepAliveTimeout=null;var lastSentKeepAlive=0;var lineCap={0:"butt",1:"round",2:"square"};var lineJoin={0:"bevel",1:"miter",2:"round"};var display=new Guacamole.Display;var layers={};var audioPlayers={};var videoPlayers={};var parsers=[];var streams=[];var objects=[];var stream_indices=new Guacamole.IntegerPool;var output_streams=[];function setState(state){if(state!=currentState){currentState=state;if(guac_client.onstatechange)guac_client.onstatechange(currentState)}}function isConnected(){return currentState==STATE_CONNECTED||currentState==STATE_WAITING}this.exportState=function exportState(callback){var state={currentState:currentState,currentTimestamp:currentTimestamp,layers:{}};var layersSnapshot={};for(var key in layers){layersSnapshot[key]=layers[key]}display.flush((function populateLayers(){for(var key in layersSnapshot){var index=parseInt(key);var layer=layersSnapshot[key];var canvas=layer.toCanvas();var exportLayer={width:layer.width,height:layer.height};if(layer.width&&layer.height)exportLayer.url=canvas.toDataURL("image/png");if(index>0){exportLayer.x=layer.x;exportLayer.y=layer.y;exportLayer.z=layer.z;exportLayer.alpha=layer.alpha;exportLayer.matrix=layer.matrix;exportLayer.parent=getLayerIndex(layer.parent)}state.layers[key]=exportLayer}callback(state)}))};this.importState=function importState(state,callback){var key;var index;currentState=state.currentState;currentTimestamp=state.currentTimestamp;display.cancel();for(key in layers){index=parseInt(key);if(index>0)layers[key].dispose()}layers={};for(key in state.layers){index=parseInt(key);var importLayer=state.layers[key];var layer=getLayer(index);display.resize(layer,importLayer.width,importLayer.height);if(importLayer.url){display.setChannelMask(layer,Guacamole.Layer.SRC);display.draw(layer,0,0,importLayer.url)}if(index>0&&importLayer.parent>=0){var parent=getLayer(importLayer.parent);display.move(layer,parent,importLayer.x,importLayer.y,importLayer.z);display.shade(layer,importLayer.alpha);var matrix=importLayer.matrix;display.distort(layer,matrix[0],matrix[1],matrix[2],matrix[3],matrix[4],matrix[5])}}display.flush(callback)};this.getDisplay=function(){return display};this.sendSize=function(width,height){if(!isConnected())return;tunnel.sendMessage("size",width,height)};this.sendKeyEvent=function(pressed,keysym){if(!isConnected())return;tunnel.sendMessage("key",keysym,pressed)};this.sendMouseState=function sendMouseState(mouseState,applyDisplayScale){if(!isConnected())return;var x=mouseState.x;var y=mouseState.y;if(applyDisplayScale){x/=display.getScale();y/=display.getScale()}display.moveCursor(Math.floor(x),Math.floor(y));var buttonMask=0;if(mouseState.left)buttonMask|=1;if(mouseState.middle)buttonMask|=2;if(mouseState.right)buttonMask|=4;if(mouseState.up)buttonMask|=8;if(mouseState.down)buttonMask|=16;tunnel.sendMessage("mouse",Math.floor(x),Math.floor(y),buttonMask)};this.sendTouchState=function sendTouchState(touchState,applyDisplayScale){if(!isConnected())return;var x=touchState.x;var y=touchState.y;if(applyDisplayScale){x/=display.getScale();y/=display.getScale()}tunnel.sendMessage("touch",touchState.id,Math.floor(x),Math.floor(y),Math.floor(touchState.radiusX),Math.floor(touchState.radiusY),touchState.angle,touchState.force)};this.createOutputStream=function createOutputStream(){var index=stream_indices.next();var stream=output_streams[index]=new Guacamole.OutputStream(guac_client,index);return stream};this.createAudioStream=function(mimetype){var stream=guac_client.createOutputStream();tunnel.sendMessage("audio",stream.index,mimetype);return stream};this.createFileStream=function(mimetype,filename){var stream=guac_client.createOutputStream();tunnel.sendMessage("file",stream.index,mimetype,filename);return stream};this.createPipeStream=function(mimetype,name){var stream=guac_client.createOutputStream();tunnel.sendMessage("pipe",stream.index,mimetype,name);return stream};this.createClipboardStream=function(mimetype){var stream=guac_client.createOutputStream();tunnel.sendMessage("clipboard",stream.index,mimetype);return stream};this.createArgumentValueStream=function createArgumentValueStream(mimetype,name){var stream=guac_client.createOutputStream();tunnel.sendMessage("argv",stream.index,mimetype,name);return stream};this.createObjectOutputStream=function createObjectOutputStream(index,mimetype,name){var stream=guac_client.createOutputStream();tunnel.sendMessage("put",index,stream.index,mimetype,name);return stream};this.requestObjectInputStream=function requestObjectInputStream(index,name){if(!isConnected())return;tunnel.sendMessage("get",index,name)};this.sendAck=function(index,message,code){if(!isConnected())return;tunnel.sendMessage("ack",index,message,code)};this.sendBlob=function(index,data){if(!isConnected())return;tunnel.sendMessage("blob",index,data)};this.endStream=function(index){if(!isConnected())return;tunnel.sendMessage("end",index);if(output_streams[index]){stream_indices.free(index);delete output_streams[index]}};this.onstatechange=null;this.onname=null;this.onerror=null;this.onmsg=null;this.onjoin=null;this.onleave=null;this.onaudio=null;this.onvideo=null;this.onmultitouch=null;this.onargv=null;this.onclipboard=null;this.onfile=null;this.onfilesystem=null;this.onpipe=null;this.onrequired=null;this.onsync=null;var getLayer=function getLayer(index){var layer=layers[index];if(!layer){if(index===0)layer=display.getDefaultLayer();else if(index>0)layer=display.createLayer();else layer=display.createBuffer();layers[index]=layer}return layer};var getLayerIndex=function getLayerIndex(layer){if(!layer)return null;for(var key in layers){if(layer===layers[key])return parseInt(key)}return null};function getParser(index){var parser=parsers[index];if(parser==null){parser=parsers[index]=new Guacamole.Parser;parser.oninstruction=tunnel.oninstruction}return parser}var layerPropertyHandlers={"miter-limit":function(layer,value){display.setMiterLimit(layer,parseFloat(value))},"multi-touch":function layerSupportsMultiTouch(layer,value){if(guac_client.onmultitouch&&layer instanceof Guacamole.Display.VisibleLayer)guac_client.onmultitouch(layer,parseInt(value))}};var instructionHandlers={ack:function(parameters){var stream_index=parseInt(parameters[0]);var reason=parameters[1];var code=parseInt(parameters[2]);var stream=output_streams[stream_index];if(stream){if(stream.onack)stream.onack(new Guacamole.Status(code,reason));if(code>=256&&output_streams[stream_index]===stream){stream_indices.free(stream_index);delete output_streams[stream_index]}}},arc:function(parameters){var layer=getLayer(parseInt(parameters[0]));var x=parseInt(parameters[1]);var y=parseInt(parameters[2]);var radius=parseInt(parameters[3]);var startAngle=parseFloat(parameters[4]);var endAngle=parseFloat(parameters[5]);var negative=parseInt(parameters[6]);display.arc(layer,x,y,radius,startAngle,endAngle,negative!=0)},argv:function(parameters){var stream_index=parseInt(parameters[0]);var mimetype=parameters[1];var name=parameters[2];if(guac_client.onargv){var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);guac_client.onargv(stream,mimetype,name)}else guac_client.sendAck(stream_index,"Receiving argument values unsupported",256)},audio:function(parameters){var stream_index=parseInt(parameters[0]);var mimetype=parameters[1];var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);var audioPlayer=null;if(guac_client.onaudio)audioPlayer=guac_client.onaudio(stream,mimetype);if(!audioPlayer)audioPlayer=Guacamole.AudioPlayer.getInstance(stream,mimetype);if(audioPlayer){audioPlayers[stream_index]=audioPlayer;guac_client.sendAck(stream_index,"OK",0)}else guac_client.sendAck(stream_index,"BAD TYPE",783)},blob:function(parameters){var stream_index=parseInt(parameters[0]);var data=parameters[1];var stream=streams[stream_index];if(stream&&stream.onblob)stream.onblob(data)},body:function handleBody(parameters){var objectIndex=parseInt(parameters[0]);var object=objects[objectIndex];var streamIndex=parseInt(parameters[1]);var mimetype=parameters[2];var name=parameters[3];if(object&&object.onbody){var stream=streams[streamIndex]=new Guacamole.InputStream(guac_client,streamIndex);object.onbody(stream,mimetype,name)}else guac_client.sendAck(streamIndex,"Receipt of body unsupported",256)},cfill:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var r=parseInt(parameters[2]);var g=parseInt(parameters[3]);var b=parseInt(parameters[4]);var a=parseInt(parameters[5]);display.setChannelMask(layer,channelMask);display.fillColor(layer,r,g,b,a)},clip:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.clip(layer)},clipboard:function(parameters){var stream_index=parseInt(parameters[0]);var mimetype=parameters[1];if(guac_client.onclipboard){var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);guac_client.onclipboard(stream,mimetype)}else guac_client.sendAck(stream_index,"Clipboard unsupported",256)},close:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.close(layer)},copy:function(parameters){var srcL=getLayer(parseInt(parameters[0]));var srcX=parseInt(parameters[1]);var srcY=parseInt(parameters[2]);var srcWidth=parseInt(parameters[3]);var srcHeight=parseInt(parameters[4]);var channelMask=parseInt(parameters[5]);var dstL=getLayer(parseInt(parameters[6]));var dstX=parseInt(parameters[7]);var dstY=parseInt(parameters[8]);display.setChannelMask(dstL,channelMask);display.copy(srcL,srcX,srcY,srcWidth,srcHeight,dstL,dstX,dstY)},cstroke:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var cap=lineCap[parseInt(parameters[2])];var join=lineJoin[parseInt(parameters[3])];var thickness=parseInt(parameters[4]);var r=parseInt(parameters[5]);var g=parseInt(parameters[6]);var b=parseInt(parameters[7]);var a=parseInt(parameters[8]);display.setChannelMask(layer,channelMask);display.strokeColor(layer,cap,join,thickness,r,g,b,a)},cursor:function(parameters){var cursorHotspotX=parseInt(parameters[0]);var cursorHotspotY=parseInt(parameters[1]);var srcL=getLayer(parseInt(parameters[2]));var srcX=parseInt(parameters[3]);var srcY=parseInt(parameters[4]);var srcWidth=parseInt(parameters[5]);var srcHeight=parseInt(parameters[6]);display.setCursor(cursorHotspotX,cursorHotspotY,srcL,srcX,srcY,srcWidth,srcHeight)},curve:function(parameters){var layer=getLayer(parseInt(parameters[0]));var cp1x=parseInt(parameters[1]);var cp1y=parseInt(parameters[2]);var cp2x=parseInt(parameters[3]);var cp2y=parseInt(parameters[4]);var x=parseInt(parameters[5]);var y=parseInt(parameters[6]);display.curveTo(layer,cp1x,cp1y,cp2x,cp2y,x,y)},disconnect:function handleDisconnect(parameters){guac_client.disconnect()},dispose:function(parameters){var layer_index=parseInt(parameters[0]);if(layer_index>0){var layer=getLayer(layer_index);display.dispose(layer);delete layers[layer_index]}else if(layer_index<0)delete layers[layer_index]},distort:function(parameters){var layer_index=parseInt(parameters[0]);var a=parseFloat(parameters[1]);var b=parseFloat(parameters[2]);var c=parseFloat(parameters[3]);var d=parseFloat(parameters[4]);var e=parseFloat(parameters[5]);var f=parseFloat(parameters[6]);if(layer_index>=0){var layer=getLayer(layer_index);display.distort(layer,a,b,c,d,e,f)}},error:function(parameters){var reason=parameters[0];var code=parseInt(parameters[1]);if(guac_client.onerror)guac_client.onerror(new Guacamole.Status(code,reason));guac_client.disconnect()},end:function(parameters){var stream_index=parseInt(parameters[0]);var stream=streams[stream_index];if(stream){if(stream.onend)stream.onend();delete streams[stream_index]}},file:function(parameters){var stream_index=parseInt(parameters[0]);var mimetype=parameters[1];var filename=parameters[2];if(guac_client.onfile){var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);guac_client.onfile(stream,mimetype,filename)}else guac_client.sendAck(stream_index,"File transfer unsupported",256)},filesystem:function handleFilesystem(parameters){var objectIndex=parseInt(parameters[0]);var name=parameters[1];if(guac_client.onfilesystem){var object=objects[objectIndex]=new Guacamole.Object(guac_client,objectIndex);guac_client.onfilesystem(object,name)}},identity:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.setTransform(layer,1,0,0,1,0,0)},img:function(parameters){var stream_index=parseInt(parameters[0]);var channelMask=parseInt(parameters[1]);var layer=getLayer(parseInt(parameters[2]));var mimetype=parameters[3];var x=parseInt(parameters[4]);var y=parseInt(parameters[5]);var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);display.setChannelMask(layer,channelMask);display.drawStream(layer,x,y,stream,mimetype)},jpeg:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var x=parseInt(parameters[2]);var y=parseInt(parameters[3]);var data=parameters[4];display.setChannelMask(layer,channelMask);display.draw(layer,x,y,"data:image/jpeg;base64,"+data)},lfill:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var srcLayer=getLayer(parseInt(parameters[2]));display.setChannelMask(layer,channelMask);display.fillLayer(layer,srcLayer)},line:function(parameters){var layer=getLayer(parseInt(parameters[0]));var x=parseInt(parameters[1]);var y=parseInt(parameters[2]);display.lineTo(layer,x,y)},lstroke:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var srcLayer=getLayer(parseInt(parameters[2]));display.setChannelMask(layer,channelMask);display.strokeLayer(layer,srcLayer)},mouse:function handleMouse(parameters){var x=parseInt(parameters[0]);var y=parseInt(parameters[1]);display.showCursor(true);display.moveCursor(x,y)},move:function(parameters){var layer_index=parseInt(parameters[0]);var parent_index=parseInt(parameters[1]);var x=parseInt(parameters[2]);var y=parseInt(parameters[3]);var z=parseInt(parameters[4]);if(layer_index>0&&parent_index>=0){var layer=getLayer(layer_index);var parent=getLayer(parent_index);display.move(layer,parent,x,y,z)}},msg:function(parameters){var userID;var username;var allowDefault=true;var msgid=parseInt(parameters[0]);if(guac_client.onmsg){allowDefault=guac_client.onmsg(msgid,parameters.slice(1));if(allowDefault===undefined)allowDefault=true}if(allowDefault){switch(msgid){case Guacamole.Client.Message.USER_JOINED:userID=parameters[1];username=parameters[2];if(guac_client.onjoin)guac_client.onjoin(userID,username);break;case Guacamole.Client.Message.USER_LEFT:userID=parameters[1];username=parameters[2];if(guac_client.onleave)guac_client.onleave(userID,username);break}}},name:function(parameters){if(guac_client.onname)guac_client.onname(parameters[0])},nest:function(parameters){var parser=getParser(parseInt(parameters[0]));parser.receive(parameters[1])},pipe:function(parameters){var stream_index=parseInt(parameters[0]);var mimetype=parameters[1];var name=parameters[2];if(guac_client.onpipe){var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);guac_client.onpipe(stream,mimetype,name)}else guac_client.sendAck(stream_index,"Named pipes unsupported",256)},png:function(parameters){var channelMask=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var x=parseInt(parameters[2]);var y=parseInt(parameters[3]);var data=parameters[4];display.setChannelMask(layer,channelMask);display.draw(layer,x,y,"data:image/png;base64,"+data)},pop:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.pop(layer)},push:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.push(layer)},rect:function(parameters){var layer=getLayer(parseInt(parameters[0]));var x=parseInt(parameters[1]);var y=parseInt(parameters[2]);var w=parseInt(parameters[3]);var h=parseInt(parameters[4]);display.rect(layer,x,y,w,h)},required:function required(parameters){if(guac_client.onrequired)guac_client.onrequired(parameters)},reset:function(parameters){var layer=getLayer(parseInt(parameters[0]));display.reset(layer)},set:function(parameters){var layer=getLayer(parseInt(parameters[0]));var name=parameters[1];var value=parameters[2];var handler=layerPropertyHandlers[name];if(handler)handler(layer,value)},shade:function(parameters){var layer_index=parseInt(parameters[0]);var a=parseInt(parameters[1]);if(layer_index>=0){var layer=getLayer(layer_index);display.shade(layer,a)}},size:function(parameters){var layer_index=parseInt(parameters[0]);var layer=getLayer(layer_index);var width=parseInt(parameters[1]);var height=parseInt(parameters[2]);display.resize(layer,width,height)},start:function(parameters){var layer=getLayer(parseInt(parameters[0]));var x=parseInt(parameters[1]);var y=parseInt(parameters[2]);display.moveTo(layer,x,y)},sync:function(parameters){var timestamp=parseInt(parameters[0]);display.flush((function displaySyncComplete(){for(var index in audioPlayers){var audioPlayer=audioPlayers[index];if(audioPlayer)audioPlayer.sync()}if(timestamp!==currentTimestamp){tunnel.sendMessage("sync",timestamp);currentTimestamp=timestamp}}));if(currentState===STATE_WAITING)setState(STATE_CONNECTED);if(guac_client.onsync)guac_client.onsync(timestamp)},transfer:function(parameters){var srcL=getLayer(parseInt(parameters[0]));var srcX=parseInt(parameters[1]);var srcY=parseInt(parameters[2]);var srcWidth=parseInt(parameters[3]);var srcHeight=parseInt(parameters[4]);var function_index=parseInt(parameters[5]);var dstL=getLayer(parseInt(parameters[6]));var dstX=parseInt(parameters[7]);var dstY=parseInt(parameters[8]);if(function_index===3)display.put(srcL,srcX,srcY,srcWidth,srcHeight,dstL,dstX,dstY);else if(function_index!==5)display.transfer(srcL,srcX,srcY,srcWidth,srcHeight,dstL,dstX,dstY,Guacamole.Client.DefaultTransferFunction[function_index])},transform:function(parameters){var layer=getLayer(parseInt(parameters[0]));var a=parseFloat(parameters[1]);var b=parseFloat(parameters[2]);var c=parseFloat(parameters[3]);var d=parseFloat(parameters[4]);var e=parseFloat(parameters[5]);var f=parseFloat(parameters[6]);display.transform(layer,a,b,c,d,e,f)},undefine:function handleUndefine(parameters){var objectIndex=parseInt(parameters[0]);var object=objects[objectIndex];if(object&&object.onundefine)object.onundefine()},video:function(parameters){var stream_index=parseInt(parameters[0]);var layer=getLayer(parseInt(parameters[1]));var mimetype=parameters[2];var stream=streams[stream_index]=new Guacamole.InputStream(guac_client,stream_index);var videoPlayer=null;if(guac_client.onvideo)videoPlayer=guac_client.onvideo(stream,layer,mimetype);if(!videoPlayer)videoPlayer=Guacamole.VideoPlayer.getInstance(stream,layer,mimetype);if(videoPlayer){videoPlayers[stream_index]=videoPlayer;guac_client.sendAck(stream_index,"OK",0)}else guac_client.sendAck(stream_index,"BAD TYPE",783)}};var sendKeepAlive=function sendKeepAlive(){tunnel.sendMessage("nop");lastSentKeepAlive=(new Date).getTime()};var scheduleKeepAlive=function scheduleKeepAlive(){window.clearTimeout(keepAliveTimeout);var currentTime=(new Date).getTime();var keepAliveDelay=Math.max(lastSentKeepAlive+KEEP_ALIVE_FREQUENCY-currentTime,0);if(keepAliveDelay>0)keepAliveTimeout=window.setTimeout(sendKeepAlive,keepAliveDelay);else sendKeepAlive()};var stopKeepAlive=function stopKeepAlive(){window.clearTimeout(keepAliveTimeout)};tunnel.oninstruction=function(opcode,parameters){var handler=instructionHandlers[opcode];if(handler)handler(parameters);scheduleKeepAlive()};this.disconnect=function(){if(currentState!=STATE_DISCONNECTED&&currentState!=STATE_DISCONNECTING){setState(STATE_DISCONNECTING);stopKeepAlive();tunnel.sendMessage("disconnect");tunnel.disconnect();setState(STATE_DISCONNECTED)}};this.connect=function(data){setState(STATE_CONNECTING);try{tunnel.connect(data)}catch(status){setState(STATE_IDLE);throw status}scheduleKeepAlive();setState(STATE_WAITING)}};Guacamole.Client.DefaultTransferFunction={0:function(src,dst){dst.red=dst.green=dst.blue=0},15:function(src,dst){dst.red=dst.green=dst.blue=255},3:function(src,dst){dst.red=src.red;dst.green=src.green;dst.blue=src.blue;dst.alpha=src.alpha},5:function(src,dst){},12:function(src,dst){dst.red=255&~src.red;dst.green=255&~src.green;dst.blue=255&~src.blue;dst.alpha=src.alpha},10:function(src,dst){dst.red=255&~dst.red;dst.green=255&~dst.green;dst.blue=255&~dst.blue},1:function(src,dst){dst.red=src.red&dst.red;dst.green=src.green&dst.green;dst.blue=src.blue&dst.blue},14:function(src,dst){dst.red=255&~(src.red&dst.red);dst.green=255&~(src.green&dst.green);dst.blue=255&~(src.blue&dst.blue)},7:function(src,dst){dst.red=src.red|dst.red;dst.green=src.green|dst.green;dst.blue=src.blue|dst.blue},8:function(src,dst){dst.red=255&~(src.red|dst.red);dst.green=255&~(src.green|dst.green);dst.blue=255&~(src.blue|dst.blue)},6:function(src,dst){dst.red=src.red^dst.red;dst.green=src.green^dst.green;dst.blue=src.blue^dst.blue},9:function(src,dst){dst.red=255&~(src.red^dst.red);dst.green=255&~(src.green^dst.green);dst.blue=255&~(src.blue^dst.blue)},4:function(src,dst){dst.red=255&(~src.red&dst.red);dst.green=255&(~src.green&dst.green);dst.blue=255&(~src.blue&dst.blue)},13:function(src,dst){dst.red=255&(~src.red|dst.red);dst.green=255&(~src.green|dst.green);dst.blue=255&(~src.blue|dst.blue)},2:function(src,dst){dst.red=255&(src.red&~dst.red);dst.green=255&(src.green&~dst.green);dst.blue=255&(src.blue&~dst.blue)},11:function(src,dst){dst.red=255&(src.red|~dst.red);dst.green=255&(src.green|~dst.green);dst.blue=255&(src.blue|~dst.blue)}};Guacamole.Client.Message={USER_JOINED:1,USER_LEFT:2};var Guacamole=Guacamole||{};Guacamole.DataURIReader=function(stream,mimetype){var guac_reader=this;var uri="data:"+mimetype+";base64,";stream.onblob=function dataURIReaderBlob(data){uri+=data};stream.onend=function dataURIReaderEnd(){if(guac_reader.onend)guac_reader.onend()};this.getURI=function getURI(){return uri};this.onend=null};var Guacamole=Guacamole||{};Guacamole.Display=function(){var guac_display=this;var displayWidth=0;var displayHeight=0;var displayScale=1;var display=document.createElement("div");display.style.position="relative";display.style.width=displayWidth+"px";display.style.height=displayHeight+"px";display.style.transformOrigin=display.style.webkitTransformOrigin=display.style.MozTransformOrigin=display.style.OTransformOrigin=display.style.msTransformOrigin="0 0";var default_layer=new Guacamole.Display.VisibleLayer(displayWidth,displayHeight);var cursor=new Guacamole.Display.VisibleLayer(0,0);cursor.setChannelMask(Guacamole.Layer.SRC);display.appendChild(default_layer.getElement());display.appendChild(cursor.getElement());var bounds=document.createElement("div");bounds.style.position="relative";bounds.style.width=displayWidth*displayScale+"px";bounds.style.height=displayHeight*displayScale+"px";bounds.appendChild(display);this.cursorHotspotX=0;this.cursorHotspotY=0;this.cursorX=0;this.cursorY=0;this.onresize=null;this.oncursor=null;var tasks=[];var frames=[];function __flush_frames(){var rendered_frames=0;while(rendered_frames<frames.length){var frame=frames[rendered_frames];if(!frame.isReady())break;frame.flush();rendered_frames++}frames.splice(0,rendered_frames)}function Frame(callback,tasks){this.cancel=function cancel(){callback=null;tasks.forEach((function cancelTask(task){task.cancel()}));tasks=[]};this.isReady=function(){for(var i=0;i<tasks.length;i++){if(tasks[i].blocked)return false}return true};this.flush=function(){for(var i=0;i<tasks.length;i++)tasks[i].execute();if(callback)callback()}}function Task(taskHandler,blocked){var task=this;this.blocked=blocked;this.cancel=function cancel(){task.blocked=false;taskHandler=null};this.unblock=function(){if(task.blocked){task.blocked=false;__flush_frames()}};this.execute=function(){if(taskHandler)taskHandler()}}function scheduleTask(handler,blocked){var task=new Task(handler,blocked);tasks.push(task);return task}this.getElement=function(){return bounds};this.getWidth=function(){return displayWidth};this.getHeight=function(){return displayHeight};this.getDefaultLayer=function(){return default_layer};this.getCursorLayer=function(){return cursor};this.createLayer=function(){var layer=new Guacamole.Display.VisibleLayer(displayWidth,displayHeight);layer.move(default_layer,0,0,0);return layer};this.createBuffer=function(){var buffer=new Guacamole.Layer(0,0);buffer.autosize=1;return buffer};this.flush=function(callback){frames.push(new Frame(callback,tasks));tasks=[];__flush_frames()};this.cancel=function cancel(){frames.forEach((function cancelFrame(frame){frame.cancel()}));frames=[];tasks.forEach((function cancelTask(task){task.cancel()}));tasks=[]};this.setCursor=function(hotspotX,hotspotY,layer,srcx,srcy,srcw,srch){scheduleTask((function __display_set_cursor(){guac_display.cursorHotspotX=hotspotX;guac_display.cursorHotspotY=hotspotY;cursor.resize(srcw,srch);cursor.copy(layer,srcx,srcy,srcw,srch,0,0);guac_display.moveCursor(guac_display.cursorX,guac_display.cursorY);if(guac_display.oncursor)guac_display.oncursor(cursor.toCanvas(),hotspotX,hotspotY)}))};this.showCursor=function(shown){var element=cursor.getElement();var parent=element.parentNode;if(shown===false){if(parent)parent.removeChild(element)}else if(parent!==display)display.appendChild(element)};this.moveCursor=function(x,y){cursor.translate(x-guac_display.cursorHotspotX,y-guac_display.cursorHotspotY);guac_display.cursorX=x;guac_display.cursorY=y};this.resize=function(layer,width,height){scheduleTask((function __display_resize(){layer.resize(width,height);if(layer===default_layer){displayWidth=width;displayHeight=height;display.style.width=displayWidth+"px";display.style.height=displayHeight+"px";bounds.style.width=displayWidth*displayScale+"px";bounds.style.height=displayHeight*displayScale+"px";if(guac_display.onresize)guac_display.onresize(width,height)}}))};this.drawImage=function(layer,x,y,image){scheduleTask((function __display_drawImage(){layer.drawImage(x,y,image)}))};this.drawBlob=function(layer,x,y,blob){var task;if(window.createImageBitmap){var bitmap;task=scheduleTask((function drawImageBitmap(){layer.drawImage(x,y,bitmap)}),true);window.createImageBitmap(blob).then((function bitmapLoaded(decoded){bitmap=decoded;task.unblock()}))}else{var url=URL.createObjectURL(blob);task=scheduleTask((function __display_drawBlob(){if(image.width&&image.height)layer.drawImage(x,y,image);URL.revokeObjectURL(url)}),true);var image=new Image;image.onload=task.unblock;image.onerror=task.unblock;image.src=url}};this.drawStream=function drawStream(layer,x,y,stream,mimetype){if(window.createImageBitmap){var reader=new Guacamole.BlobReader(stream,mimetype);reader.onend=function drawImageBlob(){guac_display.drawBlob(layer,x,y,reader.getBlob())}}else{var reader=new Guacamole.DataURIReader(stream,mimetype);reader.onend=function drawImageDataURI(){guac_display.draw(layer,x,y,reader.getURI())}}};this.draw=function(layer,x,y,url){var task=scheduleTask((function __display_draw(){if(image.width&&image.height)layer.drawImage(x,y,image)}),true);var image=new Image;image.onload=task.unblock;image.onerror=task.unblock;image.src=url};this.play=function(layer,mimetype,duration,url){var video=document.createElement("video");video.type=mimetype;video.src=url;video.addEventListener("play",(function(){function render_callback(){layer.drawImage(0,0,video);if(!video.ended)window.setTimeout(render_callback,20)}render_callback()}),false);scheduleTask(video.play)};this.transfer=function(srcLayer,srcx,srcy,srcw,srch,dstLayer,x,y,transferFunction){scheduleTask((function __display_transfer(){dstLayer.transfer(srcLayer,srcx,srcy,srcw,srch,x,y,transferFunction)}))};this.put=function(srcLayer,srcx,srcy,srcw,srch,dstLayer,x,y){scheduleTask((function __display_put(){dstLayer.put(srcLayer,srcx,srcy,srcw,srch,x,y)}))};this.copy=function(srcLayer,srcx,srcy,srcw,srch,dstLayer,x,y){scheduleTask((function __display_copy(){dstLayer.copy(srcLayer,srcx,srcy,srcw,srch,x,y)}))};this.moveTo=function(layer,x,y){scheduleTask((function __display_moveTo(){layer.moveTo(x,y)}))};this.lineTo=function(layer,x,y){scheduleTask((function __display_lineTo(){layer.lineTo(x,y)}))};this.arc=function(layer,x,y,radius,startAngle,endAngle,negative){scheduleTask((function __display_arc(){layer.arc(x,y,radius,startAngle,endAngle,negative)}))};this.curveTo=function(layer,cp1x,cp1y,cp2x,cp2y,x,y){scheduleTask((function __display_curveTo(){layer.curveTo(cp1x,cp1y,cp2x,cp2y,x,y)}))};this.close=function(layer){scheduleTask((function __display_close(){layer.close()}))};this.rect=function(layer,x,y,w,h){scheduleTask((function __display_rect(){layer.rect(x,y,w,h)}))};this.clip=function(layer){scheduleTask((function __display_clip(){layer.clip()}))};this.strokeColor=function(layer,cap,join,thickness,r,g,b,a){scheduleTask((function __display_strokeColor(){layer.strokeColor(cap,join,thickness,r,g,b,a)}))};this.fillColor=function(layer,r,g,b,a){scheduleTask((function __display_fillColor(){layer.fillColor(r,g,b,a)}))};this.strokeLayer=function(layer,cap,join,thickness,srcLayer){scheduleTask((function __display_strokeLayer(){layer.strokeLayer(cap,join,thickness,srcLayer)}))};this.fillLayer=function(layer,srcLayer){scheduleTask((function __display_fillLayer(){layer.fillLayer(srcLayer)}))};this.push=function(layer){scheduleTask((function __display_push(){layer.push()}))};this.pop=function(layer){scheduleTask((function __display_pop(){layer.pop()}))};this.reset=function(layer){scheduleTask((function __display_reset(){layer.reset()}))};this.setTransform=function(layer,a,b,c,d,e,f){scheduleTask((function __display_setTransform(){layer.setTransform(a,b,c,d,e,f)}))};this.transform=function(layer,a,b,c,d,e,f){scheduleTask((function __display_transform(){layer.transform(a,b,c,d,e,f)}))};this.setChannelMask=function(layer,mask){scheduleTask((function __display_setChannelMask(){layer.setChannelMask(mask)}))};this.setMiterLimit=function(layer,limit){scheduleTask((function __display_setMiterLimit(){layer.setMiterLimit(limit)}))};this.dispose=function dispose(layer){scheduleTask((function disposeLayer(){layer.dispose()}))};this.distort=function distort(layer,a,b,c,d,e,f){scheduleTask((function distortLayer(){layer.distort(a,b,c,d,e,f)}))};this.move=function move(layer,parent,x,y,z){scheduleTask((function moveLayer(){layer.move(parent,x,y,z)}))};this.shade=function shade(layer,alpha){scheduleTask((function shadeLayer(){layer.shade(alpha)}))};this.scale=function(scale){display.style.transform=display.style.WebkitTransform=display.style.MozTransform=display.style.OTransform=display.style.msTransform="scale("+scale+","+scale+")";displayScale=scale;bounds.style.width=displayWidth*displayScale+"px";bounds.style.height=displayHeight*displayScale+"px"};this.getScale=function(){return displayScale};this.flatten=function(){var canvas=document.createElement("canvas");canvas.width=default_layer.width;canvas.height=default_layer.height;var context=canvas.getContext("2d");function get_children(layer){var children=[];for(var index in layer.children)children.push(layer.children[index]);children.sort((function children_comparator(a,b){var diff=a.z-b.z;if(diff!==0)return diff;var a_element=a.getElement();var b_element=b.getElement();var position=b_element.compareDocumentPosition(a_element);if(position&Node.DOCUMENT_POSITION_PRECEDING)return-1;if(position&Node.DOCUMENT_POSITION_FOLLOWING)return 1;return 0}));return children}function draw_layer(layer,x,y){if(layer.width>0&&layer.height>0){var initial_alpha=context.globalAlpha;context.globalAlpha*=layer.alpha/255;context.drawImage(layer.getCanvas(),x,y);var children=get_children(layer);for(var i=0;i<children.length;i++){var child=children[i];draw_layer(child,x+child.x,y+child.y)}context.globalAlpha=initial_alpha}}draw_layer(default_layer,0,0);return canvas}};Guacamole.Display.VisibleLayer=function(width,height){Guacamole.Layer.apply(this,[width,height]);var layer=this;this.__unique_id=Guacamole.Display.VisibleLayer.__next_id++;this.alpha=255;this.x=0;this.y=0;this.z=0;this.matrix=[1,0,0,1,0,0];this.parent=null;this.children={};var canvas=layer.getCanvas();canvas.style.position="absolute";canvas.style.left="0px";canvas.style.top="0px";var div=document.createElement("div");div.appendChild(canvas);div.style.width=width+"px";div.style.height=height+"px";div.style.position="absolute";div.style.left="0px";div.style.top="0px";div.style.overflow="hidden";var __super_resize=this.resize;this.resize=function(width,height){div.style.width=width+"px";div.style.height=height+"px";__super_resize(width,height)};this.getElement=function(){return div};var translate="translate(0px, 0px)";var matrix="matrix(1, 0, 0, 1, 0, 0)";this.translate=function(x,y){layer.x=x;layer.y=y;translate="translate("+x+"px,"+y+"px)";div.style.transform=div.style.WebkitTransform=div.style.MozTransform=div.style.OTransform=div.style.msTransform=translate+" "+matrix};this.move=function(parent,x,y,z){if(layer.parent!==parent){if(layer.parent)delete layer.parent.children[layer.__unique_id];layer.parent=parent;parent.children[layer.__unique_id]=layer;var parent_element=parent.getElement();parent_element.appendChild(div)}layer.translate(x,y);layer.z=z;div.style.zIndex=z};this.shade=function(a){layer.alpha=a;div.style.opacity=a/255};this.dispose=function(){if(layer.parent){delete layer.parent.children[layer.__unique_id];layer.parent=null}if(div.parentNode)div.parentNode.removeChild(div)};this.distort=function(a,b,c,d,e,f){layer.matrix=[a,b,c,d,e,f];matrix="matrix("+a+","+b+","+c+","+d+","+e+","+f+")";div.style.transform=div.style.WebkitTransform=div.style.MozTransform=div.style.OTransform=div.style.msTransform=translate+" "+matrix}};Guacamole.Display.VisibleLayer.__next_id=0;var Guacamole=Guacamole||{};Guacamole.Event=function Event(type){this.type=type;this.timestamp=(new Date).getTime();this.getAge=function getAge(){return(new Date).getTime()-this.timestamp};this.invokeLegacyHandler=function invokeLegacyHandler(eventTarget){}};Guacamole.Event.DOMEvent=function DOMEvent(type,events){Guacamole.Event.call(this,type);events=events||[];if(!Array.isArray(events))events=[events];this.preventDefault=function preventDefault(){events.forEach((function applyPreventDefault(event){if(event.preventDefault)event.preventDefault();event.returnValue=false}))};this.stopPropagation=function stopPropagation(){events.forEach((function applyStopPropagation(event){event.stopPropagation()}))}};Guacamole.Event.DOMEvent.cancelEvent=function cancelEvent(event){event.stopPropagation();if(event.preventDefault)event.preventDefault();event.returnValue=false};Guacamole.Event.Target=function Target(){var listeners={};this.on=function on(type,listener){var relevantListeners=listeners[type];if(!relevantListeners)listeners[type]=relevantListeners=[];relevantListeners.push(listener)};this.onEach=function onEach(types,listener){types.forEach((function addListener(type){this.on(type,listener)}),this)};this.dispatch=function dispatch(event){event.invokeLegacyHandler(this);var relevantListeners=listeners[event.type];if(relevantListeners){for(var i=0;i<relevantListeners.length;i++){relevantListeners[i](event,this)}}};this.off=function off(type,listener){var relevantListeners=listeners[type];if(!relevantListeners)return false;for(var i=0;i<relevantListeners.length;i++){if(relevantListeners[i]===listener){relevantListeners.splice(i,1);return true}}return false};this.offEach=function offEach(types,listener){var changed=false;types.forEach((function removeListener(type){changed|=this.off(type,listener)}),this);return changed}};var Guacamole=Guacamole||{};Guacamole.InputSink=function InputSink(){var sink=this;var field=document.createElement("textarea");field.style.position="fixed";field.style.outline="none";field.style.border="none";field.style.margin="0";field.style.padding="0";field.style.height="0";field.style.width="0";field.style.left="0";field.style.bottom="0";field.style.resize="none";field.style.background="transparent";field.style.color="transparent";field.addEventListener("keypress",(function clearKeypress(e){field.value=""}),false);field.addEventListener("compositionend",(function clearCompletedComposition(e){if(e.data)field.value=""}),false);field.addEventListener("input",(function clearCompletedInput(e){if(e.data&&!e.isComposing)field.value=""}),false);field.addEventListener("focus",(function focusReceived(){window.setTimeout((function deferRefocus(){field.click();field.select()}),0)}),true);this.focus=function focus(){window.setTimeout((function deferRefocus(){field.focus()}),0)};this.getElement=function getElement(){return field};document.addEventListener("keydown",(function refocusSink(e){var focused=document.activeElement;if(focused&&focused!==document.body){var rect=focused.getBoundingClientRect();if(rect.left+rect.width>0&&rect.top+rect.height>0)return}sink.focus()}),true)};var Guacamole=Guacamole||{};Guacamole.InputStream=function(client,index){var guac_stream=this;this.index=index;this.onblob=null;this.onend=null;this.sendAck=function(message,code){client.sendAck(guac_stream.index,message,code)}};var Guacamole=Guacamole||{};Guacamole.IntegerPool=function(){var guac_pool=this;var pool=[];this.next_int=0;this.next=function(){if(pool.length>0)return pool.shift();return guac_pool.next_int++};this.free=function(integer){pool.pu