Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
motocat

Дбаг монитор

Помогите найти гайд, создать такой ДбагМонитор как на этом скрине: *Тык*

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts




  • 0

Что то там не написано как подключать.

Не подскажешь?

А что его подключать то? 

 

1. Открываете description.ext

 

2. Находите строку:

diagHit = 1;

Ниже пропускаете строчку (чтобы не было путаницы) и вписываете:

#include "ВАШ ПУТЬ\Player_Hud\commonhud.hpp"
#include "ВАШ ПУТЬ\Player_Hud\hw.hpp"

3. Открываете init.sqf и находите:

if (!isDedicated) then {

в этом блоке, в самом низу , добавляете:

execVM "ВАШ ПУТЬ\Player_Hud\playerHud.sqf"

перед 

 

};
 

Должно получиться так:

if (!isDedicated) then {
БЛА БЛА БЛА
execVM "ВАШ ПУТЬ\Player_Hud\playerHud.sqf"
};

4. Поставить + в репу, чтобы всё работало  :smile:

 

P.S. не забудьте заменить "ВАШ ПУТЬ" при подключении файлов.

Share this post


Link to post
Share on other sites
  • 0

А что его подключать то? 

 

1. Открываете description.ext

 

2. Находите строку:

diagHit = 1;

Ниже пропускаете строчку (чтобы не было путаницы) и вписываете:

#include "ВАШ ПУТЬ\Player_Hud\commonhud.hpp"
#include "ВАШ ПУТЬ\Player_Hud\hw.hpp"

3. Открываете init.sqf и находите:

if (!isDedicated) then {

в этом блоке, в самом низу , добавляете:

execVM "ВАШ ПУТЬ\Player_Hud\playerHud.sqf"

перед 

 

};
 

Должно получиться так:

if (!isDedicated) then {
БЛА БЛА БЛА
execVM "ВАШ ПУТЬ\Player_Hud\playerHud.sqf"
};

4. Поставить + в репу, чтобы всё работало  :smile:

 

P.S. не забудьте заменить "ВАШ ПУТЬ" при подключении файлов.

Делал все как надо, и тут бац. *Тык*

Share this post


Link to post
Share on other sites
  • 0

Делал все как надо, и тут бац. *Тык*

Класс не описан, в скайпе скинул файлик

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By ZizionarD
      Тема взята с сайта: EpochMod.com
       

       
      1. Скачиваем архив и распаковываем его
      2. Открываем кастомный файл compiles.sqf и находим строку:
      DZ_KeyDown_EH = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\keyboard.sqf"; И меняем ее на:
      DZ_KeyDown_EH = compile preprocessFileLineNumbers "PATHTOYOUR\keyboard.sqf"; 3. Открываем файл init.sqf и находим строку:
      waitUntil {scriptDone progress_monitor}; И под ней вставляем
      if (isNil 'debugMonitor') then {debugMonitor = true; _nill = execvm "dayz_code\compile\player_debug.sqf"; }; *Файл init.sqf который находится в архиве ни в коем случае не заменяйте его! В этом файле прописано то, что выше написано.
       
      На это все, всем спасибо за внимание!
       
      Keyboard.sqf
      // (c) facoptere@gmail.com, licensed to DayZMod for the community #include "\ca\editor\Data\Scripts\dikCodes.h" _dikCode = _this select 1; _shiftState = _this select 2; _ctrlState = _this select 3; _altState = _this select 4; _handled = false; if (isNil "keyboard_keys") then { _cancelBuild = { DZE_cancelBuilding = true; call dayz_EjectPlayer; _handled = false; if (r_player_dead) then {_handled = true;}; // Disable ESC after death }; _dze_f = { if (!_ctrlState && !_altState) then {DZE_F = true;}; }; _dze_q = { if (!_ctrlState && !_altState) then {DZE_Q = true;}; if (!_ctrlState && _altState) then {DZE_Q_alt = true;}; if (_ctrlState && !_altState) then {DZE_Q_ctrl = true;}; }; _dze_z = { if (!_ctrlState && !_altState) then {DZE_Z = true;}; if (!_ctrlState && _altState) then {DZE_Z_alt = true;}; if (_ctrlState && !_altState) then {DZE_Z_ctrl = true;}; }; _autoRun = { if (!dayz_autoRun) then { dayz_autoRun = true; dayz_autoRunThread = [] spawn { _weapon = currentWeapon player; while {dayz_autoRun} do { // SurfaceIsWater does not work for ponds // Check weapon to detect Arma action (dayz action is handled in dz_fn_switchWeapon) if (player != vehicle player or (surfaceIsWater getPosASL player) or ((call fn_nearWaterHole) select 0) or (currentWeapon player != _weapon) or r_fracture_legs) exitWith { call dayz_autoRunOff; }; player playAction "FastF"; uiSleep 0.5; }; }; } else { call dayz_autoRunOff; }; _handled = true; }; _filterCheat = { //Overriding default engine handling does not stop cheat input, need manual disableUserInput too _handled = [displayNull,_dikCode,_shiftState] call dze_filterCheats; }; _openGroups = { if (dayz_requireRadio && !("ItemRadio" in items player)) then { localize "STR_EPOCH_NEED_RADIO" call dayz_rollingMessages; } else { if (isNull findDisplay 80000) then { if (!isNil "dayz_groupInit") then {[] spawn dayz_openGroupDialog;}; } else { findDisplay 80000 closeDisplay 2; }; }; _handled = true; }; _muteSound = { call player_toggleSoundMute; _handled = true; }; _rifle = { 2 call dz_fn_switchWeapon; _handled = true; }; _pistol = { 3 call dz_fn_switchWeapon; _handled = true; }; _melee = { // Also works for rifle on back if DZE_TwoPrimaries = 2; 4 call dz_fn_switchWeapon; _handled = true; }; _throwable = { // select next non empty throwable weapon if (vehicle player == player) then { _ammo_throwable = []; _muzzles_throwable = []; _weapon_throwable = []; { _weapon = _x; _muzzles = getArray(configFile >> "cfgWeapons" >> _weapon >> "muzzles"); if (count _muzzles == 0) then { _muzzles = [_weapon ]; }; { _muzz = _x; { if (_x in magazines player) then { _ammo_throwable set [ count _ammo_throwable, getText(configFile >> "cfgMagazines" >> _x >> "ammo") ]; _muzzles_throwable set [ count _muzzles_throwable, _muzz ]; _weapon_throwable set [ count _weapon_throwable, _weapon ]; }; } forEach getArray(configFile >> "cfgWeapons" >> _weapon >> _muzz >> "magazines"); } forEach _muzzles; } forEach ["Throw"]; _magCount = count _ammo_throwable; if (_magCount > 0) then { if (isNil "KB_CurrentThrowable") then { KB_CurrentThrowable = -1; }; _currentAmmo = (weaponState player) select 3; _idx = _ammo_throwable find _currentAmmo; if (_idx >= 0) then { KB_CurrentThrowable = _idx; }; KB_CurrentThrowable = (KB_CurrentThrowable + 1) mod _magCount; player selectWeapon (_muzzles_throwable select KB_CurrentThrowable); _handled = true; }; }; }; _surrender = { call player_surrender; _handled = true; }; _gear = { if ((vehicle player != player) and !_shiftState and !_ctrlState and !_altState && !dialog) then { createGearDialog [player, "RscDisplayGear"]; _handled = true; } else { if ((vehicle player == player) and (speed vehicle player > 0)) then { //[objNull, player, rSwitchMove,""] call RE; _handled = true; };}; }; _forcesave = { dayz_lastCheckBit = diag_ticktime; call player_forceSave; call dayz_EjectPlayer; }; _forcesave2 = { if ((!isNull (findDisplay 106)) OR dialog) then { call player_forceSave; }; }; _drop = { if (r_drag_sqf) then { _doors = nearestObjects [player, DayZ_DropDrageeObjects, 3]; //Prevent dropping dragged player through objects if (count _doors > 0) then {_handled = true;}; force_dropBody = true; } else { _doors = nearestObjects [player, DZE_DoorsLocked, 3]; if (count _doors > 0 && {speed player > 0}) then {_handled = true;}; //Prevent sprint and prone through doors glitch }; }; _interrupt = { if (vehicle player == player) then { //allow med actions in moving vehicles r_interrupt = true; }; if (DZE_Surrender) then {call dze_surrender_off}; if (dayz_autoRun) then {call dayz_autoRunOff;}; }; // TODO: left/right, when gear open: onKeyDown = "[_this,'onKeyDown',0,107,0,107] execVM '\z\addons\dayz_code\system\handleGear.sqf'"; _noise = { //Overriding default engine handling does not stop combination binds, need manual disableUserInput too _handled = [displayNull,_dikCode,_shiftState] call dze_filterCheats; if (diag_ticktime - dayz_lastCheckBit > 10 && !(_dikCode in channel_keys)) then { dayz_lastCheckBit = diag_ticktime; [player,20,true,(getPosATL player)] call player_alertZombies; }; }; _journal = { if (!dayz_isSwimming and !dialog) then { [player,4,true,(getPosATL player)] call player_alertZombies; createDialog 'horde_journal_front_cover'; }; _handled = true; }; _build_left = { DZE_4 = true; // fence construction if (0 != count Dayz_constructionContext) then { _angleRef = Dayz_constructionContext select 1; _dir = _angleRef - (getDir player) -5; if (_dir > 180) then {_dir = _dir - 360}; if (_dir < -180) then {_dir = _dir + 360}; if ( _dir > -75) then { _new = floor((_angleRef - 5)/5)*5; Dayz_constructionContext set [ 1, _new]; // favorite angle r_interrupt = true; }; _handled = true; }; // tents and stash construction _object = player getVariable ["constructionObject", objNull]; if (!isNull _object) then { _dir = getDir _object - 3; _object setDir _dir; _handled = true; }; dayz_dodge = true; }; _build_right = { DZE_6 = true; if (0 != count Dayz_constructionContext) then { _angleRef = Dayz_constructionContext select 1; _dir = _angleRef - (getDir player) +5; if (_dir > 180) then { _dir = _dir - 360; }; if (_dir < -180) then { _dir = _dir + 360; }; if (_dir < 75) then { _new = ceil((_angleRef + 5)/5)*5; Dayz_constructionContext set [ 1, _new]; // favorite angle r_interrupt = true; }; _handled = true; }; // tents and stash construction _object = player getVariable ["constructionObject", objNull]; if (!isNull _object) then { _dir = getDir _object + 3; _object setDir _dir; _handled = true; }; dayz_dodge = true; }; _build_camOnOff = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_buildCamera.sqf"; _build_str8OnOff = { if (0 != count Dayz_constructionContext) then { Dayz_constructionContext set [ 5, !(Dayz_constructionContext select 5) ]; _handled = true; r_interrupt = true; }; if (animationState player in ["bunnyhopunarmed","bunnyhoprifle"]) then { //Fixes invisible weapon switch glitch if double tapping vault with no weapon in hands _handled = true; }; if (player isKindOf "PZombie_VB") then { _handled = true; // do not allow player zombies to vault or jump } else { _nearbyObjects = nearestObjects[getPosATL player, dayz_disallowedVault, 8]; if (count _nearbyObjects > 0) then { if ((diag_tickTime - dayz_lastCheckBit > 4)) then { [objNull, player, rSwitchMove,"GetOver"] call RE; player playActionNow "GetOver"; dayz_lastCheckBit = diag_tickTime; } else { _handled = true; }; }; }; }; _block = { _handled = true; }; _addArray = { { keyboard_keys set [_x, _this select 1]; } forEach (_this select 0); }; keyboard_keys = []; channel_keys = []; voice_keys = []; {voice_keys = voice_keys + (actionKeys _x)} count voice_actions; {channel_keys = channel_keys + (actionKeys _x)} count ["NextChannel","PrevChannel"]; keyboard_keys resize 256; [[DIK_ESCAPE], _cancelBuild] call _addArray; [[DIK_INSERT], {DZE_Q_alt = true;}] call _addArray; [[DIK_A,DIK_D,DIK_LEFT,DIK_RIGHT], _interrupt] call _addArray; [[DIK_F], _dze_f] call _addArray; [[DIK_PRIOR], _dze_q] call _addArray; [[DIK_NEXT], _dze_z] call _addArray; [[DIK_Q], {DZE_4 = true;}] call _addArray; [[DIK_E], {DZE_6 = true;}] call _addArray; [[DIK_0], _autoRun] call _addArray; [[DIK_NUMPADMINUS,DIK_LSHIFT], _filterCheat] call _addArray; [[DIK_SPACE], {DZE_5 = true;}] call _addArray; [actionKeys "User6", {DZE_F = true;}] call _addArray; [actionKeys "User7", {DZE_Q_ctrl = true;}] call _addArray; [actionKeys "User8", {DZE_Z_ctrl = true;}] call _addArray; [actionKeys "User13", {DZE_Q_alt = true;}] call _addArray; [actionKeys "User14", {DZE_Z_alt = true;}] call _addArray; [actionKeys "User15", {DZE_Q = true;}] call _addArray; [actionKeys "User16", {DZE_Z = true;}] call _addArray; [actionKeys "User17", {DZE_4 = true;}] call _addArray; [actionKeys "User18", {DZE_6 = true;}] call _addArray; [actionKeys "User19", {DZE_5 = true;}] call _addArray; [actionKeys "Surrender", _surrender] call _addArray; [[DIK_1], _rifle] call _addArray; [[DIK_2], _pistol] call _addArray; [[DIK_3], _melee] call _addArray; //[[DIK_4], _throwable] call _addArray; [actionKeys "Gear", _gear] call _addArray; [actionKeys "Prone", _drop] call _addArray; [actionKeys "Crouch", _drop] call _addArray; [actionKeys "MoveLeft", _interrupt] call _addArray; [actionKeys "MoveRight", _interrupt] call _addArray; [actionKeys "MoveForward", _interrupt] call _addArray; [actionKeys "MoveBack", _interrupt] call _addArray; [actionKeys "TurnLeft", _interrupt] call _addArray; [actionKeys "TurnRight", _interrupt] call _addArray; [actionKeys "PushToTalk", _noise] call _addArray; [actionKeys "PushToTalkAll", _noise] call _addArray; [actionKeys "PushToTalkCommand", _noise] call _addArray; [actionKeys "PushToTalkDirect", _noise] call _addArray; [actionKeys "PushToTalkGroup", _noise] call _addArray; [actionKeys "PushToTalkSide", _noise] call _addArray; [actionKeys "PushToTalkVehicle", _noise] call _addArray; [actionKeys "VoiceOverNet", _noise] call _addArray; [actionKeys "NextChannel", _noise] call _addArray; [actionKeys "PrevChannel", _noise] call _addArray; [actionKeys "Chat", _noise] call _addArray; [actionKeys "User20", _journal] call _addArray; [actionKeys "Diary", _journal] call _addArray; [actionKeys "NetworkStats", _journal] call _addArray; [[DIK_F1], _muteSound] call _addArray; //[[DIK_F4, DIK_TAB, DIK_DELETE], _forcesave] call _addArray; //[[DIK_F4, DIK_RMENU, DIK_LMENU,DIK_LSHIFT,DIK_RSHIFT,DIK_ESCAPE], _forcesave2] call _addArray; [actionKeys "LeanLeft", _build_left ] call _addArray; [actionKeys "LeanRight", _build_right ] call _addArray; [actionKeys "PersonView", _build_camOnOff ] call _addArray; // Camera Mode [actionKeys "GetOver", _build_str8OnOff ] call _addArray; // V // [[DIK_NUMPAD7], _rotate_left] call _addArray; // [[DIK_NUMPAD9], _rotate_right] call _addArray; [actionKeys "ForceCommandingMode", {DZE_5 = true;_handled = true;}] call _addArray; [[ DIK_F9,DIK_F10,DIK_F11,DIK_F12, DIK_F8,DIK_F7,DIK_F6,DIK_F5,DIK_F4, DIK_F3,DIK_F2,DIK_9, DIK_8,DIK_7,DIK_6,DIK_5,DIK_4], _block] call _addArray; if (dayz_groupSystem) then { [[DIK_F5], _openGroups] call _addArray; [[DIK_LWIN,DIK_RWIN], {dayz_groupNameTags = !dayz_groupNameTags;_handled = true;}] call _addArray; [actionKeys "TacticalView", _block] call _addArray; }; diag_log "keyboard_keys reset"; if (!isNil "bis_fnc_halo_keydown_eh") then {bis_fnc_halo_keydown_eh = (finddisplay 46) displayaddeventhandler ["keydown","_this call bis_fnc_halo_keydown;"];}; // halo in progress }; if (r_player_unconsciousInputDisabled) exitWith {true}; _code = keyboard_keys select _dikCode; if (!isNil "_code") then { call _code; }; //------------------DEBUG-----------------// if (_dikCode == 210) then { // _dikCode 210 = InsertKey if (isNil 'debugMonitor') then { debugMonitor = true; _nill = execvm "PATHTOYOUR\player_debug.sqf"; } else { debugMonitor = !debugMonitor; hintSilent ''; _nill = execvm "PATHTOYOUR\player_debug.sqf"; }; }; //-----------------DEBUGEND---------------// _handled  
      Понравилась статья? Поставь +
    • By Alex39
      Дебаг монитор
      Идем в корень сервера в папку SE1\serverDZ.cfg  и открываем блокнотом, и вставляем код, ну к примеру после строки BattlEye = 1;
      loginQueueMaxPlayers = 10; storageAutoFix = 1; disablePublisherBanKick = 1; updateStrategyVersion = 1; showPlayerStatus = 1; И получаем

       
      Сам дебаг вкл/выкл  showPlayerStatus = 1;
    • By OXIDE
      http://itmages.ru/image/view/5219992/be3f0914
      http://itmages.ru/image/view/5219997/f33c7d57
      1. Есть у кого такой худ, как на скрине? 
      2. Вопрос к Ультиме. Взял с RN портала себе такой дебаг монитор. Не работает строчка "онлайн" и "до рестарта осталось". Как это реализовать? 
      Код дебаг монитора:
       
      if ((isServer) || (isDedicated)) exitWith {diag_log "custom_debug:: Script tried to launch serverside where it should not be!";}; waitUntil {!isNil "dayz_animalCheck"}; [2] spawn // Specify the default state. 0=OFF 1=SMALL 2=LARGE { private ["_displayActive","_fps","_lastFpsUpdate","_logo"]; displayState = (_this select 0); _displayActive = if (displayState == 0) then { false } else { true }; _fps = round(diag_fps); _lastFpsUpdate = diag_tickTime; _logo = "custom_debug\logo_red.paa"; /*DIK*/ (findDisplay 46) displayAddEventHandler ['keyDown','if ((_this select 1) == 0xCF) then { if (displayState > 0) then { displayState = displayState - 1; } else { displayState = 2;}; };']; /*DIK*/ while {true} do { if ((diag_tickTime - _lastFpsUpdate) > 0.9) then { _fps = round(diag_fps); _lastFpsUpdate = diag_tickTime; }; sleep 0.1; switch (displayState) do { case 0: { // Display off. if (_displayActive) then {_displayActive = false; hintSilent "";}; }; case 1: { // Display small. _displayActive = true; hintSilent parseText format [" <img size='1.4' align='left' image='%1'/><br/> <t size='1' color='#EE8888' font='Zeppelin33' align='left'>Кровь: %2</t><br/> <t size='1' color='#6EF191' font='Zeppelin33' align='left'>ФПС: %3</t> ", _logo, (player getVariable ['USEC_BloodQty',r_player_blood]), _fps ]; }; case 2: { // Display large. _displayActive = true; hintSilent parseText format [" <img size='3.2' align='center' image='%1'/><br/> <br/> <t size='1' color='#6ECCF1' font='Bitstream' align='left'>Выживание: %11 Дней</t><br/> <t size='1' color='#EE8888' font='Bitstream' align='left'>Убито бандитов: %2</t><br/> <t size='1' color='#EE8888' font='Bitstream' align='left'>Убито зомби: %3</t><br/> <t size='1' color='#EE8888' font='Bitstream' align='left'>Убито героев: %4</t><br/> <t size='1' color='#EE8888' font='Bitstream' align='left'>Выстрел в голову: %12</t><br/> <t size='1' color='#00CC00' font='Bitstream' align='center'>Онлайн: %14</t><br/> <t size='1' color='#6EF191' font='Bitstream' align='left'>Репутация: %5</t><br/> <t size='1' color='#EE8888' font='Bitstream' align='left'>Кровь: %6</t><br/> <t size='1' color='#6ECCF1' font='Zeppelin33' align='left'>ФПС: %7</t><br/> <t size='1' color='#6EF191' font='Bitstream' align='left'>Осталось до рестарта: %13 Минут</t><br/> <t size='0.9' color='#EE8888' font='Zeppelin33' align='left'>[END] Свернуть</t> ", _logo, (player getVariable ['banditKills',0]), (player getVariable ['zombieKills',0]), (player getVariable ['humanKills',0]), (player getVariable ['humanity',0]), (player getVariable ['USEC_BloodQTY',r_player_blood]), _fps, (dayz_Survived), (player getVariable['headShots',0]), (240-(round(serverTime/60))), (count playableUnits) ]; }; }; }; };
    • By almalk454
      Как убрать стандартный дебаг монитор? Хочу поставить свой. 
       


      if (_dikCode == 210) then { _nill = execvm "\z\addons\dayz_code\actions\playerstats.sqf"; }; Нашел решение в dayz_spaceInterrapt.sqf...
    • By Alex39
      Подводный дебаг монитор
       
      Название говорит само за себя
       
      Установка:
       
      Качаем скрипт  https://yadi.sk/d/xfebcrCPfr5Cb
       
      Открываем в вашей миссии init.sqf  и вставляем:
       
      getGasTot = compile preprocessFileLineNumbers "scripts\trindisplay\functions\trin_fn_gasCalc.sqf"; getTisTot = compile preprocessFileLineNumbers "scripts\trindisplay\functions\trin_fn_initTissues.sqf";  
       
      Открываем description.ext и вставляем:
       
      #include "scripts\trindisplay\dialog\define.hpp" class RscTitles { #include "scripts\trindisplay\dialog\trin_display.hpp" }; class CfgSounds { sounds[] = {}; class trin_dispStart { name = "Trin Display Start"; sound[] = {"scripts\trindisplay\sounds\dispStart.ogg", 1, 1}; titles[] = {}; }; class trin_dispExit { name = "Trin Display Exit"; sound[] = {"scripts\trindisplay\sounds\dispExit.ogg", 1, 1}; titles[] = {}; }; class trin_dispWarn { name = "Trin Display Warn"; sound[] = {"scripts\trindisplay\sounds\dispWarn.ogg", 0.5, 1}; titles[] = {}; }; class trin_dispCount { name = "Trin Display Count"; sound[] = {"scripts\trindisplay\sounds\dispCount.ogg", 2, 1}; titles[] = {}; }; class trin_dispClear { name = "Trin Display Clear"; sound[] = {"scripts\trindisplay\sounds\dispClear.ogg", 1, 1}; titles[] = {}; }; class trin_dispSilence { name = "Trin Display Silence"; sound[] = {"scripts\trindisplay\sounds\dispSilence.ogg", 1, 1}; titles[] = {}; }; };  
      Открываем mission.sqm и в инициализацию юнита вставляем :
      null = [this, 25, 3000, 1.3, 0.15, 0.30, 0.55, 25] execVM "scripts\trindisplay\diverstats.sqf"; Пример :
       
      class Vehicles { items=1; class Item0 { position[]={1242.3566,-0.13068128,1145.0415}; azimut=95.724602; id=0; side="WEST"; vehicle="B_diver_TL_F"; player="PLAYER COMMANDER"; leader=1; skill=0.60000002; init="removeAllWeapons this; null = [this, 25, 3000, 1.3, 0.15, 0.30, 0.55, 25] execVM "scripts\trindisplay\diverstats.sqf""; }; };  
       

       
      Скачать пример готового скрипта https://yadi.sk/d/l9CWbT-Nfr5gM
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.