'use strict';var GlkOteClass=function(){let is_inited=false;let game_interface=null;let dom_context=undefined;let dom_prefix='';let windowport_id='windowport';let gameport_id='gameport';let errorpane_id='errorpane';let errorcontent_id='errorcontent';let loadingpane_id='loadingpane';let max_buffer_length=800;let generation=0;let generation_sent=-1;let disabled=false;let loading_visible=null;let error_visible=false;let windowdic=null;let current_metrics=null;let current_devpixelratio=null;let last_known_focus=0;let last_known_paging=0;let windows_paging_count=0;const graphics_draw_queue=[];let request_timer=null;let request_timer_interval=null;let resize_timer=null;let retry_timer=null;const perform_paging=true;let detect_external_links=false;let regex_external_links=null;let debug_out_handler=null;let Dialog=null;let Blorb=null;const NBSP='\xa0';const approx_scroll_width=20;const moreprompt_margin=4;const key_codes={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45};const terminator_key_names={escape:key_codes.KEY_ESC,func1:112,func2:113,func3:114,func4:115,func5:116,func6:117,func7:118,func8:119,func9:120,func10:121,func11:122,func12:123};const terminator_key_values={};let recording=false;let recording_state=null;let recording_handler=null;let recording_handler_url=null;const recording_context={};const image_cache={};function glkote_init(iface){if(!iface&&window.Game)
iface=window.Game;if(!iface){glkote_error('No game interface object has been provided.');return;}
if(!iface.accept){glkote_error('The game interface object must have an accept() function.');return;}
game_interface=iface;if(!window.jQuery||!jQuery.fn.jquery){glkote_error('The jQuery library has not been loaded.');return;}
const version=jQuery.fn.jquery.split('.');if(version.length<2||version[0]<1||(version[0]==1&&version[1]<9)){glkote_error('This version of the jQuery library is too old. (Version '+jQuery.fn.jquery+' found; 1.9.0 required.)');return;}
for(const val in terminator_key_names){terminator_key_values[terminator_key_names[val]]=val;}
windowdic=new Map();if(iface.dom_prefix)
dom_prefix=iface.dom_prefix;if(iface.windowport)
windowport_id=iface.windowport;if(iface.gameport)
gameport_id=iface.gameport;if(iface.errorpane)
errorpane_id=iface.errorpane;if(iface.errorcontent)
errorcontent_id=iface.errorcontent;if(iface.loadingpane)
loadingpane_id=iface.loadingpane;const el=$('#'+windowport_id,dom_context);if(!el.length){glkote_error('Cannot find windowport element #'+windowport_id+' in this document.');return;}
el.empty();if(perform_paging)
$(document).on('keypress',evhan_doc_keypress);$(window).on('resize',evhan_doc_resize);current_devpixelratio=window.devicePixelRatio||1;if(window.matchMedia){window.matchMedia('screen and (min-resolution: 1.5dppx)').addListener(evhan_doc_pixelreschange);window.matchMedia('screen and (min-resolution: 2dppx)').addListener(evhan_doc_pixelreschange);window.matchMedia('screen and (min-resolution: 3dppx)').addListener(evhan_doc_pixelreschange);window.matchMedia('screen and (min-resolution: 4dppx)').addListener(evhan_doc_pixelreschange);}
const res=measure_window();if(jQuery.type(res)==='string'){glkote_error(res);return;}
current_metrics=res;create_resize_sensors();if(iface.max_buffer_length)
max_buffer_length=iface.max_buffer_length;detect_external_links=iface.detect_external_links;if(detect_external_links){regex_external_links=iface.regex_external_links;if(!regex_external_links){if(detect_external_links=='search'){regex_external_links=RegExp('\\b((?:https?://)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))','i');}
else{regex_external_links=RegExp('^https?:','i');}}}
if(iface.recording_url){recording=true;recording_handler=recording_standard_handler;recording_handler_url=iface.recording_url;}
if(iface.recording_handler){recording=true;recording_handler=iface.recording_handler;recording_handler_url='(custom handler)';}
if(recording){const qparams=get_query_params();const flag=qparams['feedback'];if(jQuery.type(flag)!='undefined'&&flag!='1'){recording=false;glkote_log('User has opted out of transcript recording.');}
else{recording_state={sessionId:(new Date().getTime())+''+(Math.ceil(Math.random()*10000)),input:null,output:null,timestamp:0,outtimestamp:0};if(iface.recording_label)
recording_state.label=iface.recording_label;if(iface.recording_format=='simple')
recording_state.format='simple';else
recording_state.format='glkote';glkote_log('Transcript recording active: session '+recording_state.sessionId+' "'+recording_state.label+'", destination '+recording_handler_url);}}
if(iface.debug_commands){let debugmod=window.GiDebug;if(iface.debug_commands!=true)
debugmod=iface.debug_commands;if(!debugmod){glkote_log('The debug_commands option is set, but there is no GiDebug module.');}
else{debugmod.init(evhan_debug_command);debug_out_handler=debugmod.output;if(iface.debug_console_open)
debugmod.open();}}
if(iface.Blorb){Blorb=iface.Blorb;}
if(iface.Dialog){Dialog=iface.Dialog;}
else if(window.DialogClass){Dialog=new window.DialogClass();}
if(Dialog&&!Dialog.inited()){const dialogiface={GlkOte:this};if(iface.dialog_dom_prefix){dialogiface.dom_prefix=iface.dialog_dom_prefix;}
if(Dialog.init_async){Dialog.init_async(dialogiface,function(){finish_init(iface);});return;}
else if(Dialog.init){Dialog.init(dialogiface);}}
finish_init(iface);}
function finish_init(iface){is_inited=true;if(!iface.font_load_delay){send_response('init',null,current_metrics);}
else{disabled=true;defer_func(function(){disabled=false;current_metrics=measure_window();send_response('init',null,current_metrics);});}}
function glkote_inited(){return is_inited;}
function measure_window(){const metrics={};const gameport=$('#'+gameport_id,dom_context);if(!gameport.length)
return'Cannot find gameport element #'+gameport_id+' in this document.';$('#'+dom_prefix+'layouttestpane',dom_context).remove();metrics.width=gameport.width();metrics.height=gameport.height();const layout_test_pane=$('
',{id:dom_prefix+'layout_test_pane'});layout_test_pane.text('This should not be visible');layout_test_pane.css({position:'absolute',visibility:'hidden',left:'-1000px'});const line=$('