Jump to content

ozdeadmeat

Member
  • Content Count

    118
  • Joined

  • Last visited

  • Medals

  • Medals

Posts posted by ozdeadmeat


  1. Hi,

     

    Thanks for taking the 3 minutes to talk to me today on Steam. 

     

    So here is my installation

     

    [Arma3 RooT Folder]

     

    tbbmalloc.dll

    [@extDB]

    [@extDB2_DEBUG]

     

    Arma 3 Initialization is

    arma3.exe" -window -exThreads=7 -cpuCount=6 -maxVRAM=8192 -skipintro -name=OzDeaDMeaT -showScriptErrors -maxMem=32768 -nosplash -enableHT "-mod=@extDB2_DEBUG"

     

    extdb-conf.ini (saved as UTF-8)

     

    ////START////

     

    [Main]
    Version = 5
     
    ;Threads = 0  
    ; Default Value is the number of CPU Cores Detected (max value is 6, min value is 2)
     
    Randomize Config File = false
    ;This is a legacy option to randomize config file for Arma2 Servers. Only for Windows Builds
     
     
    [Rcon]
    ;; This is functional, should be working fine. Just needs abit of testing on a $
    ;; Allow for changing Address for those running server in a VM environment.
    ;;IP = 127.0.0.1
    ;;Port = 2302
     
    ;; Rcon Password i.e Battleye/beserver.cfg
    ;;Password = password
     
    ;; Bad Player Name Checks
    ;; This will only work if your mission / mod has started extDB2 Rcon. i.e 9:START_RCON:RCON
    ;;Bad Playername Enable = false
    ;;Bad Playername Kick Message = Bad Player Name
     
    ;; By default : is a bad character (used as seperator for extDB2 Calls (this is hardcoded in)
    ;;Bad Playername Strings = ( :):{:}
    ;;Bad Playername Regex_1 = [:alnum:]
    ;;Bad Playername Regex_2 = [:alnum:]
    ;;Bad Playername Regex_3 = [:alnum:]
     
     
    ;; Whitelisting / Reserve Slots
    ;; This will only work if your mission / mod has started extDB2 Rcon. i.e 9:START_RCON:RCON
    Whitelist Enable = false
    Whitelist Kick Message = Only Reserved Slots Left
     
    Whitelist Public Slots = 999
     
    ;; Database settings to use (Optional)
    ;;Whitelist Database = MySQL_Example
    ;;Whitelist SQL Prepared Statement = SELECT CASE WHEN EXISTS(SELECT UID FROM PlayerInfo WHERE BattlEyeGUID=? AND Whitelisted=1) THEN 1 ELSE 0 END
    ;;Whitelist Kick on SQL Query Failed = false
     
    ;; Hardcoded BEGuids for whitelisted players
    ;Whitelist BEGuids = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx : yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
     
     
    [steam]
    ;; This is for VAC Protocol for VAC Bans + Steam Friends.
    API Key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
     
     
    [VAC]
    ;; This feature requires Steam + Rcon to be enabled.
    ;; Also this feature is called via SQF Code atm, i.e it doesn't auto detect players joining server yet....
    Auto Ban = true
     
    ;; For Player to get banned ( their total VAC Bans => NumberOfVACBans)  AND ( Days Since their Last Ban was <= DaysSinceLastBan)
    ;; This is also used extDB Protocol VAC:VACBanned returned results
     
    NumberOfVACBans = 1
    DaysSinceLastBan = 999999999
    BanDuration = 0
    ;; 0 = Forever, otherwise its x Minutes
    BanMessage = Steam VAC Banned
     
     
    [Log]
    ;; Flush Logs after each write, more work on Harddrive
    Flush = true
     
    [Arma3_TESTDB]
    Type = SQLite
    Name = g:\SQL-Lite\arma3_test.db
     
    minSessions = 1
    ; minSession Default Value = 1
     
    ;maxSessions = 4
    ; maxSession Default Value = number of Main->Threads
    ; You really should leave this value alone
    idleTime = 60
    ; idleTime no Default Value yet, needs to be defined.
    ; idleTime is the time before a database session is stopped if not used. 
    ; If Database Sessions are greater than minSessions

     

    ////END////

     

    Questions:

     

    1. Can I have both @extDB and @extDB_DEBUG running at the same time?

     

    2. As I am using SQL-Lite, do I need to have the Database file in the same location folder as the extDB dll's?

     

    3. Do I need to initialize the extension before calling it? 

    The following line is executed from my init.sqf (the only line in the init.sqf file.

    hint format ["%1", "extDB2" callExtension "9:VERSION"]

    This returns nothing and does not show a hint at all.

     

    I am sure it is something simple. I am just not sure what it is I am missing.

     

     

     

     

     

     

     

     


  2. Hey guys. I am trying to convert my RPG Persistent code from iniDBi to extDB. Is there a checklist or something i can go through as my connection to my sql-lite DB doesn't appear to be working. I am sure I am missing a config file or something. I have done the ini file with the correct data, I just need a bit of help with all the config points.

     

    Thanks in advance :)


  3. Hi,

     

    I am getting errors saying the Facebook, twitter, twitch urls are invalid, Is it possible to have a tick box next to the field that enables the field rather than having a bunch of urls that people don't necessarily have active for their group. Also, making the minimum character count for the Bio fields red until the count is met would make the form a little more obvious when registering.

     

     


  4. I am working on a persistence DB function for Campaign Mission Mechanics. (A mission framework I am working on). It is more centred around RPG with story based missions from week to week. My issue is atm I cant save a vehicles ammo condition due to some of these new scripting commands not working.

    Read Here for a work around thnx to AgentRev but its not a 100% solution.

    http://feedback.arma3.com/view.php?id=21718


  5. Hi everyone,

    I want to use the Splendid Camera as a Spectator Camera for some players who will be streaming game play from one of my Arma 3 Servers. Is there a way that I can lockdown the Debug menu for these user (Accessible by F1 in Stock Splendid Camera) as well as disable the Daytime, OverCast and AccTime bars at the bottom.

    I have attempted to grab the Current Splendid code and modify it, but unfortunately it does not work 100%. Any help would be greatly appreciated. Here is the code I have so far. Note this is almost a complete copy of the bis_fnc_camera from the game. I have only attempted to comment out the bits I don't want.

    OzDM_Camera = {/*
    Author: Karel Moricky
    
    Description:
    Splendid config viewer
    
    Parameter(s):
    _this select 0: STRING - Parent display (when you need to run the viewer from editor)
    
    Returns:
    NOTHING
    */
    
    #define DIK_ESCAPE          0x01
    #define DIK_1               0x02
    #define DIK_2               0x03
    #define DIK_3               0x04
    #define DIK_4               0x05
    #define DIK_5               0x06
    #define DIK_6               0x07
    #define DIK_7               0x08
    #define DIK_8               0x09
    #define DIK_9               0x0A
    #define DIK_0               0x0B
    #define DIK_MINUS           0x0C    /* - on main keyboard */
    #define DIK_EQUALS          0x0D
    #define DIK_BACK            0x0E    /* backspace */
    #define DIK_TAB             0x0F
    #define DIK_Q               0x10
    #define DIK_W               0x11
    #define DIK_E               0x12
    #define DIK_R               0x13
    #define DIK_T               0x14
    #define DIK_Y               0x15
    #define DIK_U               0x16
    #define DIK_I               0x17
    #define DIK_O               0x18
    #define DIK_P               0x19
    #define DIK_LBRACKET        0x1A
    #define DIK_RBRACKET        0x1B
    #define DIK_RETURN          0x1C    /* Enter on main keyboard */
    #define DIK_LCONTROL        0x1D
    #define DIK_A               0x1E
    #define DIK_S               0x1F
    #define DIK_D               0x20
    #define DIK_F               0x21
    #define DIK_G               0x22
    #define DIK_H               0x23
    #define DIK_J               0x24
    #define DIK_K               0x25
    #define DIK_L               0x26
    #define DIK_SEMICOLON       0x27
    #define DIK_APOSTROPHE      0x28
    #define DIK_GRAVE           0x29    /* accent grave */
    #define DIK_LSHIFT          0x2A
    #define DIK_BACKSLASH       0x2B
    #define DIK_Z               0x2C
    #define DIK_X               0x2D
    #define DIK_C               0x2E
    #define DIK_V               0x2F
    #define DIK_B               0x30
    #define DIK_N               0x31
    #define DIK_M               0x32
    #define DIK_COMMA           0x33
    #define DIK_PERIOD          0x34    /* . on main keyboard */
    #define DIK_SLASH           0x35    /* / on main keyboard */
    #define DIK_RSHIFT          0x36
    #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
    #define DIK_LMENU           0x38    /* left Alt */
    //#define DIK_SPACE           0x39
    #define DIK_CAPITAL         0x3A
    //#define DIK_F1              0x3B
    #define DIK_F2              0x3C
    #define DIK_F3              0x3D
    #define DIK_F4              0x3E
    #define DIK_F5              0x3F
    #define DIK_F6              0x40
    #define DIK_F7              0x41
    #define DIK_F8              0x42
    #define DIK_F9              0x43
    #define DIK_F10             0x44
    #define DIK_NUMLOCK         0x45
    #define DIK_SCROLL          0x46    /* Scroll Lock */
    #define DIK_NUMPAD7         0x47
    #define DIK_NUMPAD8         0x48
    #define DIK_NUMPAD9         0x49
    #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
    #define DIK_NUMPAD4         0x4B
    #define DIK_NUMPAD5         0x4C
    #define DIK_NUMPAD6         0x4D
    #define DIK_ADD             0x4E    /* + on numeric keypad */
    #define DIK_NUMPAD1         0x4F
    #define DIK_NUMPAD2         0x50
    #define DIK_NUMPAD3         0x51
    #define DIK_NUMPAD0         0x52
    #define DIK_DECIMAL         0x53    /* . on numeric keypad */
    #define DIK_OEM_102         0x56    /* < > | on UK/Germany keyboards */
    #define DIK_F11             0x57
    #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
    
    disableserialization;
    
    //--- Function called before display - create display and terminate
    if (count _this <= 1) exitwith {
    
    //_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    //if !(isnull _cam) exitwith {};
    
    if (count _this > 0 ||true) then {
    	_displayMission = [] call (uinamespace getvariable "bis_fnc_displayMission");
    	_parent = if (isnull _displayMission) then {
    		_displays = uinamespace getvariable ["GUI_displays",[]];
    		_classes = uinamespace getvariable ["GUI_classes",[]];
    
    		{
    			if (isnull _x) then {
    				_classes set [_foreachindex,-1];
    			};
    		} foreach _displays;
    		_displays = _displays - [displaynull];
    		_classes = _classes - [-1];
    
    		if (count _displays > 0 && count _displays == count _classes) then {
    			if ((_classes select (count _classes - 1)) == "RscDisplayDebug") then {
    				//--- Debug console is open - use the display below it (otherwise you couldn't access the console while in the viewer)
    				_displays select (count _displays - 2)
    			} else {
    				//--- Open the viewer from the last open display
    				_displays select (count _displays - 1)
    			};
    		} else {
    
    			//--- No displays are tracked - cannot open
    			displaynull
    		};
    	} else {
    
    		//--- Mission display is present - use it as parent
    		_displayMission
    	};
    	_parent createdisplay "RscDisplayCamera";
    } else {
    	createdialog "RscDisplayCamera"
    };
    };
    
    disableserialization;
    _mode = [_this,0,"Init",[displaynull,""]] call bis_fnc_param;
    _this = [_this,1,[]] call bis_fnc_param;
    
    switch _mode do {
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "Init": {
    	OzDM_Camera_draw3D = addmissioneventhandler ["draw3d","with (uinamespace) do {['Draw3D',_this] call OzDM_Camera;};"];
    
    	//--- Create camera
    	_camPos = [
    		(position cameraon select 0),
    		(position cameraon select 1),
    		(position cameraon select 2) + 2
    	];
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam","camera" camcreate _camPos];
    	_cam cameraeffect ["internal","back"];
    	//_cam campreparefov 0.7;
    	//_cam camcommitprepared 0;
    	showcinemaborder false;
    	cameraEffectEnableHUD true;
    	vehicle cameraon switchcamera cameraview;
    
    	//--- Declare variables
    	missionnamespace setvariable ["OzDM_Camera_cam",_cam];
    
    	OzDM_Camera_LMB = false;
    	OzDM_Camera_RMB = false;
    	OzDM_Camera_keys = [];
    	OzDM_Camera_LMBclick = [0,0];
    	OzDM_Camera_RMBclick = [0,0];
    	OzDM_Camera_pitchbank = [0,0];
    	OzDM_Camera_fov = 0.7;
    	OzDM_Camera_iconCamera = gettext (configfile >> "RscDisplayCamera" >> "iconCamera");
    	OzDM_Camera_vision = 0;
    	OzDM_Camera_visibleHUD = true;
    	OzDM_Camera_cameraView = cameraview;
    
    	cameraon switchcamera "internal";
    
    	_DIKcodes = true call bis_fnc_keyCode;
    	_DIKlast = _DIKcodes select (count _DIKcodes - 1);
    	for "_k" from 0 to (_DIKlast - 1) do {
    		OzDM_Camera_keys set [_k,false];
    	};
    
    	_display = _this select 0;
    	OzDM_Camera_display = _display;
    	_display displayaddeventhandler ["keydown","with (uinamespace) do {['KeyDown',_this] call OzDM_Camera;};"];
    	_display displayaddeventhandler ["keyup","with (uinamespace) do {['KeyUp',_this] call OzDM_Camera;};"];
    	_display displayaddeventhandler ["mousebuttondown","with (uinamespace) do {['MouseButtonDown',_this] call OzDM_Camera;};"];
    	_display displayaddeventhandler ["mousebuttonup","with (uinamespace) do {['MouseButtonUp',_this] call OzDM_Camera;};"];
    	_display displayaddeventhandler ["mousezchanged","with (uinamespace) do {['MouseZChanged',_this] call OzDM_Camera;};"];
    
    	_ctrlMouseArea = _display displayctrl 3140;
    	_ctrlMouseArea ctrladdeventhandler ["mousemoving","with (uinamespace) do {['Mouse',_this] call OzDM_Camera;};"];
    	_ctrlMouseArea ctrladdeventhandler ["mouseholding","with (uinamespace) do {['Mouse',_this] call OzDM_Camera;};"];
    	ctrlsetfocus _ctrlMouseArea;
    
    	_ctrlMap = _display displayctrl 3141;
    	_ctrlMap ctrlenable false;
    	_ctrlMap ctrladdeventhandler ["draw","with (uinamespace) do {['MapDraw',_this] call OzDM_Camera;};"];
    	_ctrlMap ctrladdeventhandler ["mousebuttonclick","with (uinamespace) do {['MapClick',_this] call OzDM_Camera;};"];
    
    	_ctrlOverlay = _display displayctrl 3142;
    	_ctrlOverlay ctrlenable false;
    
    	_positions = profilenamespace getvariable ["OzDM_Camera_positions",[]];
    	_positions resize 10;
    	profilenamespace setvariable ["OzDM_Camera_positions",_positions];
    	_ctrlPositions = _display displayctrl 31422;
    	_ctrlPositions ctrlsettext "1:\n2:\n3:\n4:\n5:\n6:\n7:\n8:\n9:\n0";
    
    	_ctrlSliderFocus = _display displayctrl 31430;
    	_ctrlSliderFocus ctrladdeventhandler ["sliderposchanged","with (uinamespace) do {['SliderFocus',_this] call OzDM_Camera;};"];
    	_ctrlSliderFocus slidersetposition 0;
    	["SliderFocus",[_ctrlSliderFocus,sliderposition _ctrlSliderFocus]] call OzDM_Camera;
    
    	_ctrlSliderAperture = _display displayctrl 31432;
    	_ctrlSliderAperture ctrladdeventhandler ["sliderposchanged","with (uinamespace) do {['SliderAperture',_this] call OzDM_Camera;};"];
    	_ctrlSliderAperture slidersetposition 0;
    	_ctrlSliderAperture ctrlsettooltip "Aperture changes takes some time and cannot be achieved when game is paused.";
    	["SliderAperture",[_ctrlSliderAperture,sliderposition _ctrlSliderAperture]] call OzDM_Camera;
    /*
    	_ctrlSliderDaytime = _display displayctrl 31434;
    	_ctrlSliderDaytime slidersetrange [0,24 * 60];
    	_ctrlSliderDaytime ctrladdeventhandler ["sliderposchanged","with (uinamespace) do {['SliderDaytime',_this] call OzDM_Camera;};"];
    	_ctrlSliderDaytime slidersetposition (daytime * 60);
    	["SliderDaytime",[_ctrlSliderDaytime,sliderposition _ctrlSliderDaytime]] call OzDM_Camera;
    
    	_ctrlSliderOvercast = _display displayctrl 31436;
    	_ctrlSliderOvercast slidersetrange [0,1];
    	_ctrlSliderOvercast ctrladdeventhandler ["sliderposchanged","with (uinamespace) do {['SliderOvercast',_this] call OzDM_Camera;};"];
    	_ctrlSliderOvercast slidersetposition overcast;
    	_ctrlSliderOvercast ctrlsettooltip "In order for changes to take effect, you have to modify daytime as well.";
    	["SliderOvercast",[_ctrlSliderOvercast,sliderposition _ctrlSliderOvercast]] call OzDM_Camera;
    
    	_ctrlSliderAcctime = _display displayctrl 31438;
    	_ctrlSliderAcctime slidersetrange [0,1];
    	_ctrlSliderAcctime ctrladdeventhandler ["sliderposchanged","with (uinamespace) do {['SliderAcctime',_this] call OzDM_Camera;};"];
    	_ctrlSliderAcctime slidersetposition 0;
    	["SliderAcctime",[_ctrlSliderOvercast,sliderposition _ctrlSliderAcctime]] call OzDM_Camera;
    */
    	OzDM_Camera_showPositions = {
    		disableserialization;
    		_display = _this;
    		_ctrlPositions = _display displayctrl 31422;
    		_text = "";
    		{
    			_text = _text + str _foreachindex + ": ";
    			if (isnil "_x") then {
    				_text = _text + format ["[ Ctrl + %1 ]",_foreachindex];
    			} else {
    				_params = _positions select _foreachindex;
    				_text = _text + format [
    					"%1",
    					mapgridposition (_params select 1)
    					//[(_params select 5),"HH:MM:SS"] call bis_fnc_timetostring
    				]
    			};
    			_text = _text + "\n";
    		} foreach _positions;
    		_ctrlPositions ctrlsettext _text;
    	};
    	_display call OzDM_Camera_showPositions;
    
    	//--- Disable menu chromatic aberration
    	[] call bis_fnc_guiEffectTiles;
    
    	//--- Remove mission overlay
    	_displayMission = [] call (uinamespace getvariable "bis_fnc_displayMission");
    	_control = _displayMission displayctrl 11400;
    	_control ctrlsetfade 1;
    	_control ctrlcommit 0;
    
    	//--- Remove overlays
    	cuttext ["","plain"];
    	titletext ["","plain"];
    	_layers = missionnamespace getvariable ["bis_fnc_rscLayer_list",[]];
    
    	for "_l" from 1 to (count _layers - 1) step 2 do {
    		(_layers select _l) cuttext ["","plain"];
    	};
    	clearradio;
    	enableradio false;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "Mouse": {
    	_display = ctrlparent (_this select 0);
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_pitchbank = OzDM_Camera_pitchbank;
    	_pitch = _pitchbank select 0;
    	_bank = _pitchbank select 1;
    
    	//--- Camera movement
    	if (OzDM_Camera_LMB || OzDM_Camera_RMB) then {
    		_mX = _this select 1;
    		_mY = _this select 2;
    
    		if (OzDM_Camera_LMB) then {
    
    			_defX = OzDM_Camera_LMBclick select 0;
    			_defY = OzDM_Camera_LMBclick select 1;
    
    			_camZ = (getposatl _cam select 2) max 1 min 256;
    			_dX = (_mX - _defX) * _camZ / 2;
    			_dY = -(_mY - _defY) * _camZ / 2;
    
    			_camPos = getposasl _cam;
    			_camPos = [_camPos,_dY,direction _cam] call bis_fnc_relpos;
    			_camPos = [_camPos,_dX,direction _cam + 90] call bis_fnc_relpos;
    			_cam setposasl _camPos;
    		//};
    		//if (OzDM_Camera_RMB) then  {
    		} else {
    
    			_defX = OzDM_Camera_RMBclick select 0;
    			_defY = OzDM_Camera_RMBclick select 1;
    
    			_dX = (_mX - _defX) * 180;
    			_dY = -(_mY - _defY) * 180;
    
    			if (OzDM_Camera_keys select DIK_LCONTROL) then {
    				_bank = (_bank + _dX * 0.1) max -180 min +180;
    				OzDM_Camera_pitchbank set [1,_bank];
    			} else {
    				_cam setdir (direction _cam + _dX);
    				_pitch = (_pitch + _dY) max -90 min +90;
    			};
    			[
    				_cam,
    				_pitch,
    				_bank
    			] call bis_fnc_setpitchbank;
    			OzDM_Camera_RMBclick = [_mX,_defY];
    		};
    
    	};		
    
    	//--- Cursortarget
    	_pos = screentoworld [0.5,0.5];
    	_intersectCam = getposasl _cam;
    	_intersectTarget = [_pos select 0,_pos select 1,getterrainheightasl _pos];
    	_objects = lineIntersectswith [
    		_intersectCam,
    		_intersectTarget,
    		objnull,
    		objnull,
    		true
    	];
    	_ctrlFrame = _display displayctrl 31421;
    	_object = objnull;
    	if (count _objects > 0) then {
    		_ctrlOverlay = _display displayctrl 3142;
    		_object = _objects select (count _objects - 1);
    		missionnamespace setvariable ["OzDM_Camera_target",_object];
    
    		_objectBbox = boundingbox _object;
    		_objectBboxZ = (abs((_objectBbox select 0) select 2) + abs((_objectBbox select 1) select 2)) / 2;
    		_objectPos = worldtoscreen [position _object select 0,position _object select 1,(getposatl _object select 2) + _objectBboxZ / 2];
    		if (count _objectPos > 0) then {
    			//_objectSize = sizeof typeof _object;
    			_objectSize =
    				abs((_objectBbox select 0) select 0) + abs((_objectBbox select 1) select 0)
    				max
    				abs((_objectBbox select 0) select 1) + abs((_objectBbox select 1) select 1)
    				max
    				abs((_objectBbox select 0) select 2) + abs((_objectBbox select 1) select 2);
    			_objectDis = _cam distance _object;
    
    			_ctrlFrameSize = (_objectSize / _objectDis / 2) max 0.1;
    			_ctrlFrame ctrlsetposition [
    				(_objectPos select 0) - safezoneX - ((_ctrlFrameSize / 2) * 3/4),
    				(_objectPos select 1) - safezoneY - (_ctrlFrameSize / 2),
    				_ctrlFrameSize * 3/4,
    				_ctrlFrameSize
    			];
    		} else {
    			missionnamespace setvariable ["OzDM_Camera_target",objnull];
    			_ctrlFrame ctrlsetposition [-10,-10,0,0];
    		};
    	} else {
    		missionnamespace setvariable ["OzDM_Camera_target",objnull];
    		_ctrlFrame ctrlsetposition [-10,-10,0,0];
    	};
    	_ctrlFrame ctrlcommit 0;
    
    	_camDir = direction _cam;
    	_cardinalDir = round (_camDir / 45);
    	_cardinalDirText = [
    		"str_move_n",
    		"str_move_ne",
    		"str_move_e",
    		"str_move_se",
    		"str_move_s",
    		"str_move_sw",
    		"str_move_w",
    		"str_move_nw"
    	] select _cardinalDir;
    	_cardinalDirText = localize _cardinalDirText;
    
    	//--- Debug text
    	_ctrlDebug = _display displayctrl 31420;
    	_ctrlDebug ctrlsettext (
    		"\n\n" +
    		"X = " + str(position _cam select 0) + "\n" +
    		"Y = " + str(position _cam select 1) + "\n" +
    		"Z = " + str(position _cam select 2) + "\n" +
    		"FOV = " + str(OzDM_Camera_fov) + "\n" +
    		"Dir = " + str(round _camDir) + "° (" + _cardinalDirText + ")\n" +
    		"Pitch = " + str(round (_pitch)) + "°\n" +
    		"Bank = " + str(round (_bank) % 360) + "°\n" +
    		"OzDM_Camera_target = " + str(_object) + "\n"
    	);
    
    	//--- Nelson's solution for key lag
    	_camMove = {
    		_dX = _this select 0;
    		_dY = _this select 1;
    		_dZ = _this select 2;
    		_pos = getposasl _cam;
    		_dir = (direction _cam) + _dX * 90;
    		_camPos = [
    			(_pos select 0) + ((sin _dir) * _coef * _dY),
    			(_pos select 1) + ((cos _dir) * _coef * _dY),
    			(_pos select 2) + _dZ * _coef
    		];
    		_camPos set [2,(_camPos select 2) max (getterrainheightasl _camPos)];
    		_cam setposasl _camPos;
    	};
    	_camRotate = {
    		_dX = _this select 0;
    		_dY = _this select 1;
    		_pitchbank = _cam call bis_fnc_getpitchbank;
    		_cam setdir (direction _cam + _dX);
    		[
    			_cam,
    			(_pitchbank select 0) + _dY,
    			0
    		] call bis_fnc_setpitchbank;
    	};
    
    	_coef = 0.1;
    	if (OzDM_Camera_keys select DIK_LMENU) then {_coef = _coef * 100;};
    	if (OzDM_Camera_keys select DIK_LSHIFT) then {_coef = _coef * 10;};
    	if (OzDM_Camera_keys select DIK_RSHIFT) then {_coef = _coef / 10;};
    
    	if (OzDM_Camera_keys select DIK_W) then {[0,1,0] call _camMove;};
    	if (OzDM_Camera_keys select DIK_S) then {[0,-1,0] call _camMove;};
    	if (OzDM_Camera_keys select DIK_A) then {[-1,1,0] call _camMove;};
    	if (OzDM_Camera_keys select DIK_D) then {[1,1,0] call _camMove;};
    
    	if (OzDM_Camera_keys select DIK_Q) then {[0,0,1] call _camMove;};
    	if (OzDM_Camera_keys select DIK_Z) then {[0,0,-1] call _camMove;};
    
    	if (OzDM_Camera_keys select DIK_NUMPAD1) then {[-1,-1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD1) then {[-1,-1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD2) then {[+0,-1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD3) then {[+1,-1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD4) then {[-1,+0] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD6) then {[+1,+0] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD7) then {[-1,+1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD8) then {[+0,+1] call _camRotate;};
    	if (OzDM_Camera_keys select DIK_NUMPAD9) then {[+1,+1] call _camRotate;};
    
    	if (OzDM_Camera_keys select DIK_ADD) then {
    		OzDM_Camera_fov = (OzDM_Camera_fov - 0.01) max 0.01;
    		_cam campreparefov OzDM_Camera_fov;
    		_cam camcommitprepared 0;
    	};
    	if (OzDM_Camera_keys select DIK_SUBTRACT) then {
    		OzDM_Camera_fov = (OzDM_Camera_fov + 0.01) min 1;
    		_cam campreparefov OzDM_Camera_fov;
    		_cam camcommitprepared 0;
    	};
    };
    
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "MouseButtonDown": {
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_button = _this select 1;
    	_mX = _this select 2;
    	_mY = _this select 3;
    	_shift = _this select 4;
    	_ctrl = _this select 5;
    	_alt = _this select 6;
    
    	if (_button > 0) then {
    		OzDM_Camera_RMB = true;
    		OzDM_Camera_RMBclick = [_mX,_mY];
    	} else {
    		OzDM_Camera_LMB = true;
    		OzDM_Camera_LMBclick = [_mX,_mY];
    	};
    	OzDM_Camera_pitchbank = _cam call bis_fnc_getpitchbank;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "MouseButtonUp": {
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_button = _this select 1;
    	if (_button > 0) then {
    		OzDM_Camera_RMB = false;
    		OzDM_Camera_RMBclick = [0,0];
    	} else {
    		OzDM_Camera_LMB = false;
    		OzDM_Camera_LMBclick = [0,0];
    	};
    
    	OzDM_Camera_pitchbank = _cam call bis_fnc_getpitchbank;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "MouseZChanged": {
    	_display = _this select 0;
    	_ctrlMap = _display displayctrl 3141;
    	if !(ctrlenabled _ctrlMap) then {
    
    		_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    		_camVector = vectordir _cam;
    
    		_dZ = (_this select 1) * 10;
    		_vX = (_camVector select 0) * _dZ;
    		_vY = (_camVector select 1) * _dZ;
    		_vZ = (_camVector select 2) * _dZ;
    
    		_camPos = getposasl _cam;
    		_camPos = [
    			(_camPos select 0) + _vX,
    			(_camPos select 1) + _vY,
    			(_camPos select 2) + _vZ
    		];
    		_camPos set [2,(_camPos select 2) max (getterrainheightasl _camPos)];
    		_cam setposasl _camPos;
    	};
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "KeyDown": {
    	//_this call bis_fnc_log;
    	_display = _this select 0;
    	_key = _this select 1;
    	_shift = _this select 2;
    	_ctrl = _this select 3;
    	_alt = _this select 4;
    	_return = false;
    
    	OzDM_Camera_keys set [_key,true];
    
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_camSave = {
    		_positions = profilenamespace getvariable ["OzDM_Camera_positions",[]];
    		if (_ctrl) then {
    			_positions set [
    				_this,
    				_camParams
    			];
    			profilenamespace setvariable ["OzDM_Camera_positions",_positions];
    			saveprofilenamespace;	
    
    			_display call OzDM_Camera_showPositions;
    		} else {
    			_params = _positions select _this;
    			if !(isnil "_params") then {
    				["Paste",_params] call OzDM_Camera;
    			};
    		};
    		_return = true;
    	};
    	_camParams = [
    		worldname,
    		position _cam,
    		direction _cam,
    		OzDM_Camera_fov,
    		OzDM_Camera_pitchbank,
    		sliderposition (_display displayctrl 31430),
    		sliderposition (_display displayctrl 31432)
    		//sliderposition (_display displayctrl 31434),
    		//sliderposition (_display displayctrl 31436),
    		//sliderposition (_display displayctrl 31438)
    	];
    
    	switch (_key) do {
    
    		case (DIK_1): {1 call _camSave;};
    		case (DIK_2): {2 call _camSave;};
    		case (DIK_3): {3 call _camSave;};
    		case (DIK_4): {4 call _camSave;};
    		case (DIK_5): {5 call _camSave;};
    		case (DIK_6): {6 call _camSave;};
    		case (DIK_7): {7 call _camSave;};
    		case (DIK_8): {8 call _camSave;};
    		case (DIK_9): {9 call _camSave;};
    		case (DIK_0): {0 call _camSave;};
    /*
    		case (DIK_F1): {
    			_display createdisplay "RscDisplayDebugPublic";
    			_result = true;
    		};
    
    		case (DIK_F2);
    		case (DIK_F3);
    		case (DIK_F4);
    		case (DIK_F5);
    		case (DIK_F6);
    		case (DIK_F7);
    		case (DIK_F8);
    		case (DIK_F9);
    		case (DIK_F10);
    		case (DIK_F11);
    		case (DIK_F12): {_return = true;};
    */
    
    		case (DIK_NUMPAD5): {
    			OzDM_Camera_pitchbank = [0,0];
    			[0,0] call _camRotate;
    			OzDM_Camera_fov = 0.7;
    			_camPos = position _cam;
    			_camDir = direction _cam;
    			_cam cameraeffect ["terminate","back"];
    			camdestroy _cam;
    			_cam = "camera" camcreate _camPos;
    			_cam cameraeffect ["internal","back"];
    			_cam setdir _camDir;
    			missionnamespace setvariable ["OzDM_Camera_cam",_cam];
    		};
    
    		case (DIK_M): {
    			_ctrlMouseArea = _display displayctrl 3140;
    			_ctrlMap = _display displayctrl 3141;
    			if (ctrlenabled _ctrlMap) then {
    				_ctrlMouseArea ctrlenable true;
    				_ctrlMap ctrlenable false;
    				ctrlsetfocus _ctrlMap;
    				_ctrlMap ctrlsetposition [-10,-10,0.8 * safezoneW,0.8 * safezoneH];
    				_ctrlMap ctrlcommit 0;
    			} else {
    				_ctrlMouseArea ctrlenable false;
    				_ctrlMap ctrlenable true;
    				ctrlsetfocus _ctrlMap;
    				_ctrlMapPos = [
    					safezoneX + 0.1 * safezoneW,
    					safezoneY + 0.1 * safezoneH,
    					0.8 * safezoneW,
    					0.8 * safezoneH
    				];
    				_ctrlMap ctrlsetposition _ctrlMapPos;
    				_ctrlMap ctrlcommit 0;
    				_ctrlMap ctrlmapanimadd [0,0.1,position _cam];
    				ctrlmapanimcommit _ctrlMap;
    				{player reveal [_x,4]} foreach allunits;
    			};
    		};
    
    		case (DIK_H);
    		case (DIK_L): {
    			_ctrlOverlays = [_display displayctrl 3142,_display displayctrl 3143];
    			if (OzDM_Camera_visibleHUD) then {
    				{_x ctrlsetfade 1;} foreach _ctrlOverlays;
    				(_display displayctrl 3142) ctrlenable false;
    				cameraEffectEnableHUD false;
    			} else {
    				{_x ctrlsetfade 0;} foreach _ctrlOverlays;
    				(_display displayctrl 3142) ctrlenable true;
    				cameraEffectEnableHUD true;
    			};
    			OzDM_Camera_visibleHUD = !OzDM_Camera_visibleHUD;
    			{_x ctrlcommit 0.1} foreach _ctrlOverlays;
    		};
    
    		case (DIK_X): {
    			if (_ctrl) then {
    				[
    					"Paste",
    					_camParams
    				] spawn {
    					copytoclipboard format ["%1 call OzDM_Camera;",_this];
    				};
    			};
    		};
    		case (DIK_C): {
    			if (_ctrl) then {
    				_camParams spawn {
    					copytoclipboard format ["%1",_this];
    				};
    			};
    		};
    		case (DIK_V): {
    			if (_ctrl) then {
    				_clipboard = call compile copyfromclipboard;
    				if (typename _clipboard == typename []) then {
    					_clipboard = [[_clipboard],0,[],[[]],[10]] call bis_fnc_paramIn;
    					if (count _clipboard == 10) then {
    						["Paste",_clipboard] call OzDM_Camera;
    					} else {
    						["Wrong format of camera params (""%1"")",copyfromclipboard] call bis_fnc_error;
    					};
    				};
    			};
    		};
    
    		case (DIK_N): {
    			OzDM_Camera_vision = OzDM_Camera_vision + 1;
    			_vision = OzDM_Camera_vision % 4;
    			switch (_vision) do {
    				case 0: {
    					camusenvg false;
    					false SetCamUseTi 0;
    				};
    				case 1: {
    					camusenvg true;
    					false SetCamUseTi 0;
    				};
    				case 2: {
    					camusenvg false;
    					true SetCamUseTi 0;
    				};
    				case 3: {
    					camusenvg false;
    					true SetCamUseTi 1;
    				};
    			};
    		};
    
    		case (DIK_P): {
    			if (_ctrl) then {
    				if (cheatsenabled) then {
    					_filename = format (["SplendidCamera\%1_['%2',%3,%4,%5,%6,%7,%8,%9,%10,%11].png",profilename] + _camParams);
    					_filename call compile "diag_screenshot _this;";
    				};
    			};
    		};
    /*
    		case (DIK_SPACE): {
    			_vehicle = vehicle player;
    			_worldPos = screentoworld [0.5,0.5];
    			_vehicle setposatl [_worldPos select 0,_worldPos select 1,getposatl _vehicle select 2];
    			_vehicle setvelocity [0,0,0];
    		};
    */
    		case (DIK_ESCAPE): {
    			_return = true;
    			_this spawn {
    				disableserialization;
    				_display = _this select 0;
    				_message = [
    					"Do you really want to quit?",
    					"SPLENDID CAMERA",
    					nil,
    					true,
    					_display
    				] call bis_fnc_guimessage;
    				if (_message) then {
    					_display closedisplay 2;
    				};
    			};
    		};
    		default {};
    	};
    	_return
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "KeyUp": {
    	OzDM_Camera_keys set [_this select 1,false];
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "Draw3D": {
    	if (OzDM_Camera_visibleHUD) then {
    		_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    		_locations = nearestlocations [position _cam,["nameVillage","nameCity","nameCityCapital"],2000];
    		{
    			_pos = locationposition _x;
    			_pos set [2,0];
    			drawicon3d [
    				"#(argb,8,8,3)color(0,0,0,0)",
    				[1,1,1,1],
    				_pos,
    				0,
    				0,
    				0,
    				text _x,
    				1
    			];
    		} foreach _locations;
    	};
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "MapDraw": {
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_ctrlMap = _this select 0;
    	_ctrlMap drawIcon [
    		OzDM_Camera_iconCamera,
    		[0,1,1,1],
    		position _cam,
    		32,
    		32,
    		direction _cam,
    		"",
    		1
    	];
    	//[texture, color, position, width, height, angle, text, shadow]
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "MapClick": {
    	_ctrlMap = _this select 0;
    	_button = _this select 1;
    	_posX = _this select 2;
    	_posY = _this select 3;
    	if (_button == 0) then {
    		_worldPos = _ctrlMap ctrlmapscreentoworld [_posX,_posY];
    		_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    		_cam setpos [
    			_worldPos select 0,
    			_worldPos select 1,
    			getposatl _cam select 2
    		];
    	};
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "SliderFocus": {
    	private ["_display"];
    	_display = ctrlparent (_this select 0);
    	_value = _this select 1;
    	_value = _value^2;
    	_focus = 1;
    	_text = str (round (_value * 1000) / 1000) + " m";
    	if (_value == 0) then {_value = -1; _text = "AUTO";};
    	if (_value == 100) then {_value = -1; _focus = -1; _text = "DISABLED";};
    
    	_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    	_cam campreparefocus [_value,_focus];
    	_cam camcommitprepared 0;
    
    	_ctrlValue = _display displayctrl 31431;
    	_ctrlValue ctrlsettext _text;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "SliderAperture": {
    	private ["_display"];
    	_display = ctrlparent (_this select 0);
    	_value = _this select 1;
    	_value = _value^2;
    	_text = str (round (_value * 100) / 100);
    	if (_value == 0) then {_value = -1; _text = "AUTO";};
    
    	setaperture _value;
    
    	_ctrlValue = _display displayctrl 31433;
    	_ctrlValue ctrlsettext _text;
    };
    /*
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "SliderDaytime": {
    	private ["_display"];
    	_display = ctrlparent (_this select 0);
    	_value = _this select 1;
    	_text = [_value / 60,"HH:MM:SS"] call bis_fnc_timetostring;
    
    	0 setovercast (sliderposition (_display displayctrl 31436));
    
    	_date = date;
    	_date set [3,0];
    	_date set [4,_value];
    	setdate _date;
    
    	_ctrlValue = _display displayctrl 31435;
    	_ctrlValue ctrlsettext _text;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "SliderOvercast": {
    	private ["_display"];
    	_display = ctrlparent (_this select 0);
    	_value = _this select 1;
    	_text = str (round (_value * 100) / 100);
    
    	0 setovercast _value;
    	forceweatherchange;
    
    	_ctrlValue = _display displayctrl 31437;
    	_ctrlValue ctrlsettext _text;
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "SliderAcctime": {
    	private ["_display"];
    	_display = ctrlparent (_this select 0);
    	_value = _this select 1;
    	_text = str (round (_value * 100) / 100);
    
    	setacctime _value;
    
    	_ctrlValue = _display displayctrl 31439;
    	_ctrlValue ctrlsettext _text;
    };
    */
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "Paste": {
    	_this spawn {
    		disableserialization;
    		[] call OzDM_Camera;
    		waituntil {!isnil {uinamespace getvariable "OzDM_Camera_display"}};
    		with uinamespace do {
    			_worldname =	[_this,0,"",[""]] call bis_fnc_paramIn;
    			if (_worldname != worldname) exitwith {["Camera params are for world ""%1"", you're currently on ""%2""",_worldname,worldname] call bis_fnc_error;};
    			_pos =		[_this,1,position player,[[]],[3]] call bis_fnc_paramIn;
    			_dir =		[_this,2,direction player,[0]] call bis_fnc_paramIn;
    			_fov =		[_this,3,OzDM_Camera_fov,[0]] call bis_fnc_paramIn;
    			_pitchbank =	[_this,4,[0,0],[[]],[2]] call bis_fnc_paramIn;
    			_focus =	[_this,5,0,[0]] call bis_fnc_paramIn;
    			_aperture =	[_this,6,0,[0]] call bis_fnc_paramIn;
    			_daytime =	[_this,7,daytime,[0]] call bis_fnc_paramIn;
    			_overcast =	[_this,8,overcast,[0]] call bis_fnc_paramIn;
    			_acctime =	[_this,9,0,[0]] call bis_fnc_paramIn;
    
    			_pitch =	[_pitchbank,0,0,[0]] call bis_fnc_paramIn;
    			_bank =		[_pitchbank,1,0,[0]] call bis_fnc_paramIn;
    
    			_display = uinamespace getvariable ["OzDM_Camera_display",displaynull];
    			_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    			_cam setpos _pos;
    			_cam setdir _dir;
    			OzDM_Camera_fov = _fov;
    			[
    				_cam,
    				_pitch,
    				_bank
    			] call bis_fnc_setpitchbank;
    
    			_cam campreparefov OzDM_Camera_fov;
    			_cam camcommitprepared 0;
    			OzDM_Camera_pitchbank = _pitchbank;
    			(_display displayctrl 31430) slidersetposition _focus;
    			(_display displayctrl 31432) slidersetposition _aperture;
    			//(_display displayctrl 31434) slidersetposition _daytime ;
    			//(_display displayctrl 31436) slidersetposition _overcast;
    			//(_display displayctrl 31438) slidersetposition _acctime;
    			["SliderFocus",		[(_display displayctrl 31430),_focus]] call OzDM_Camera;
    			["SliderAperture",	[(_display displayctrl 31432),_aperture]] call OzDM_Camera;
    			//["SliderDaytime",	[(_display displayctrl 31434),_daytime]] call OzDM_Camera;
    			//["SliderOvercast",	[(_display displayctrl 31436),_overcast]] call OzDM_Camera;
    			//["SliderAcctime",	[(_display displayctrl 31438),_acctime]] call OzDM_Camera;
    		};
    	};
    };
    
    ///////////////////////////////////////////////////////////////////////////////////////////
    case "Exit": {
    	with missionnamespace do {
    		_cam = missionnamespace getvariable ["OzDM_Camera_cam",objnull];
    		_cam cameraeffect ["terminate","back"];
    		camdestroy _cam;
    
    		OzDM_Camera_cam = nil;
    		OzDM_Camera_target = nil;
    	};
    
    	cameraon switchcamera OzDM_Camera_cameraView;
    
    	OzDM_Camera_display = nil;
    	OzDM_Camera_LMB = nil;
    	OzDM_Camera_RMB = nil;
    	OzDM_Camera_keys = nil;
    	OzDM_Camera_LMBclick = nil;
    	OzDM_Camera_RMBclick = nil;
    	OzDM_Camera_pitchbank = nil;
    	OzDM_Camera_fov = nil;
    	OzDM_Camera_iconCamera = nil;
    	OzDM_Camera_vision = nil;
    	OzDM_Camera_visibleHUD = nil;
    	OzDM_Camera_cameraView = nil;
    
    	removemissioneventhandler ["draw3d",OzDM_Camera_draw3D];
    	OzDM_Camera_draw3D = nil;
    
    	camusenvg false;
    	false SetCamUseTi 0;
    
    	setacctime 1;
    	setaperture -1;
    	enableradio true;
    
    	if ((productVersion select 4) == "Development") then {
    		_displayMission = [] call (uinamespace getvariable "bis_fnc_displayMission");
    		_control = _displayMission displayctrl 11400;
    		_control ctrlsetfade 0;
    		_control ctrlcommit 0;
    	};
    };
    };
    
    };
    
    // To execute add this line below into unit init
    //		this addAction ["Start Camera","[] call OzDM_Camera;",[],2,false,true,"","driver _target == _this"];


  6. Thanks galzohar, already aware of those commands.

    Not really what I am looking for however.

    For example: If I have a date Lets say [2016,2,21,6,45] as a start date (note, has nothing to do with the current mission time, date) and I have another date, [2028,3,6,18,45] and I want to calculate the amount of days between these two dates. Both those commands will not help with this calculation.

    Here is what I have so far in the function I am writing.

    CountTime = {
    //Usage [[date1],[date2],"RETURNTYPE"] call CountTime
    _originalDate = _this select 0;
    _CurrentDate = _this select 1;
    _return = _this select 2; //"Seconds", "Minutes", "Days", "Weeks", "Months", "Years"
    
    _LeapMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31];
    _monthDays = [31,28,31,30,31,30,31,31,30,31,30,31];
    
    _Oyear = _originalDate select 0;
    _Omonth = _originalDate select 1;
    _Oday = _originalDate select 2;
    _Ohour = _originalDate select 3;
    _Ominute = _originalDate select 4;
    
    _Cyear = _CurrentDate select 0;
    _Cmonth = _CurrentDate select 1;
    _Cday = _CurrentDate select 2;
    _Chour = _CurrentDate select 3;
    _Cminute = _CurrentDate select 4;
    
    //This is all the years between _Oyear and _Cyear
    _Difference = _Cyear - _Oyear;
    
    _yearArray = [];
    _LyearArray = [];
    for "_i" from (0 to _Difference) do {
    _newYear = _Oyear + _i;
    _yearArray set [_i,_newYear];
    _IsLeap = (_newYear / 4) - (floor(_newYear / 4));
    if(_IsLeap == 0) then {_LyearArray set [_i,1]} Else {_LyearArray set [_i,0]};
    };


  7. Hi guys,

    I am looking for some help with regards a Time Duration Function that returns either days, weeks, months, seconds etc from 2 arrays given in the date format

    So for example:

    Feb 21th 2016 --> March 6th is 14 days.

    I remember seeing a function similar to this years ago but for the life of me I cant find it.

    Any help would be greatly appreciated. If I happen to get my crappy attempt working or find the script I will post it here.

×