From c223a04cf2436968bffd02d269c336c5824ce4c4 Mon Sep 17 00:00:00 2001 From: sethduda Date: Sun, 20 Mar 2016 21:37:52 -0400 Subject: [PATCH 1/3] Fixing towing over objects (bridges, docks ,etc) & water. Disabling chains by default. --- .../functions/fn_advancedTowingInit.sqf | 132 +++++++++++------- 1 file changed, 79 insertions(+), 53 deletions(-) diff --git a/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf b/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf index 7046831..c683311 100644 --- a/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf +++ b/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf @@ -9,6 +9,28 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#define SA_Find_Surface_ASL_Under_Position(_object,_positionAGL,_returnSurfaceASL,_canFloat) \ +_objectASL = AGLToASL (_object modelToWorldVisual (getCenterOfMass _object)); \ +_surfaceIntersectStartASL = [_positionAGL select 0, _positionAGL select 1, (_objectASL select 2) + 1]; \ +_surfaceIntersectEndASL = [_positionAGL select 0, _positionAGL select 1, (_objectASL select 2) - 10]; \ +_surfaces = lineIntersectsSurfaces [_surfaceIntersectStartASL, _surfaceIntersectEndASL, _object, objNull, true, 1]; \ +if(count _surfaces == 1) then { \ + _returnSurfaceASL = (_surfaces select 0) select 0; \ + if(_canFloat && (_returnSurfaceASL select 2) < 0) then { \ + _returnSurfaceASL set [2,0]; \ + }; \ +} else { \ + _returnSurfaceASL = [_positionAGL select 0, _positionAGL select 1, 0]; \ +}; + +#define SA_Find_Surface_ASL_Under_Model(_object,_modelOffset,_returnSurfaceASL,_canFloat) \ +SA_Find_Surface_ASL_Under_Position(_object, (_object modelToWorldVisual _modelOffset), _returnSurfaceASL,_canFloat); + +#define SA_Find_Surface_AGL_Under_Model(_object,_modelOffset,_returnSurfaceAGL,_canFloat) \ +SA_Find_Surface_ASL_Under_Model(_object,_modelOffset,_returnSurfaceAGL,_canFloat); \ +_returnSurfaceAGL = ASLtoAGL _returnSurfaceAGL; + { diag_log "Advanced Towing Loading..."; @@ -21,16 +43,19 @@ SA_Simulate_Towing = { params ["_vehicle","_vehicleHitchModelPos","_cargo","_cargoHitchModelPos","_ropeLength"]; + _cargo setVariable ["SA_TOWING_VEHICLE",_vehicle,true]; + _vehicle setVariable ["SA_TOWING_CARGO",_cargo,true]; + private ["_lastCargoHitchPosition","_lastCargoVectorDir","_cargoLength","_maxDistanceToCargo","_lastMovedCargoPosition","_cargoHitchPoints"]; private ["_vehicleHitchPosition","_cargoHitchPosition","_newCargoHitchPosition","_cargoVector","_movedCargoVector","_attachedObjects"]; - private ["_newCargoDir","_lastCargoVectorDir","_newCargoPosition","_doExit","_cargoPosition","_vehiclePosition","_maxVehicleSpeed","_vehicleMass","_cargoMass"]; + private ["_newCargoDir","_lastCargoVectorDir","_newCargoPosition","_doExit","_cargoPosition","_vehiclePosition","_maxVehicleSpeed","_vehicleMass","_cargoMass","_cargoCanFloat"]; private ["_cargoCorner1AGL","_cargoCorner1ASL","_cargoCorner2AGL","_cargoCorner2ASL","_cargoCorner3AGL","_cargoCorner3ASL","_cargoCorner4AGL","_cargoCorner4ASL","_surfaceNormal1","_surfaceNormal2","_surfaceNormal"]; - // Calculate _cargoModelCenterGroundPosition (This is the model center position that should be set to ground level) - private ["_cargoCenterOfMass","_cargoCenterOfMassAGL","_cargoModelCenterGroundPosition"]; - _cargoCenterOfMass = getCenterOfMass _cargo; - _cargoCenterOfMassAGL = _cargo modelToWorldVisual _cargoCenterOfMass; - _cargoCenterOfMassAGL set [2,0]; + _maxVehicleSpeed = getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "maxSpeed"); + _cargoCanFloat = if( getNumber (configFile >> "CfgVehicles" >> typeOf _cargo >> "canFloat") == 1 ) then { true } else { false }; + + private ["_cargoCenterOfMassAGL","_cargoModelCenterGroundPosition"]; + SA_Find_Surface_AGL_Under_Model(_cargo,getCenterOfMass _cargo,_cargoCenterOfMassAGL,_cargoCanFloat); _cargoModelCenterGroundPosition = _cargo worldToModelVisual _cargoCenterOfMassAGL; _cargoModelCenterGroundPosition set [0,0]; _cargoModelCenterGroundPosition set [1,0]; @@ -76,8 +101,6 @@ SA_Simulate_Towing = { _cargoHitchPosition = _lastCargoHitchPosition; _cargoHitchPosition set [2,0]; - _maxVehicleSpeed = getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "maxSpeed"); - _cargoPosition = getPos _cargo; _vehiclePosition = getPos _vehicle; @@ -88,33 +111,29 @@ SA_Simulate_Towing = { _cargoVector = _lastCargoVectorDir vectorMultiply _cargoLength; _movedCargoVector = _newCargoHitchPosition vectorDiff _lastCargoHitchPosition; _newCargoDir = vectorNormalized (_cargoVector vectorAdd _movedCargoVector); + //if(_isRearCargoHitch) then { + // _newCargoDir = _newCargoDir vectorMultiply -1; + //}; _lastCargoVectorDir = _newCargoDir; _newCargoPosition = _newCargoHitchPosition vectorAdd (_newCargoDir vectorMultiply -(vectorMagnitude (_cargoHitchModelPos))); - _newCargoPosition = AGLToASL _newCargoPosition; - _newCargoPosition = _newCargoPosition vectorAdd ( _cargoModelCenterGroundPosition vectorMultiply -1 ); + + SA_Find_Surface_ASL_Under_Position(_cargo,_newCargoPosition,_newCargoPosition,_cargoCanFloat); // Calculate surface normal (up) (more realistic than surfaceNormal function) - _cargoCorner1AGL = _cargo modelToWorldVisual _corner1; - _cargoCorner1AGL set [2,0]; - _cargoCorner1ASL = AGLToASL _cargoCorner1AGL; - _cargoCorner2AGL = _cargo modelToWorldVisual _corner2; - _cargoCorner2AGL set [2,0]; - _cargoCorner2ASL = AGLToASL _cargoCorner2AGL; - _cargoCorner3AGL = _cargo modelToWorldVisual _corner3; - _cargoCorner3AGL set [2,0]; - _cargoCorner3ASL = AGLToASL _cargoCorner3AGL; - _cargoCorner4AGL = _cargo modelToWorldVisual _corner4; - _cargoCorner4AGL set [2,0]; - _cargoCorner4ASL = AGLToASL _cargoCorner4AGL; + SA_Find_Surface_ASL_Under_Model(_cargo,_corner1,_cargoCorner1ASL,_cargoCanFloat); + SA_Find_Surface_ASL_Under_Model(_cargo,_corner2,_cargoCorner2ASL,_cargoCanFloat); + SA_Find_Surface_ASL_Under_Model(_cargo,_corner3,_cargoCorner3ASL,_cargoCanFloat); + SA_Find_Surface_ASL_Under_Model(_cargo,_corner4,_cargoCorner4ASL,_cargoCanFloat); _surfaceNormal1 = (_cargoCorner1ASL vectorFromTo _cargoCorner3ASL) vectorCrossProduct (_cargoCorner1ASL vectorFromTo _cargoCorner2ASL); _surfaceNormal2 = (_cargoCorner4ASL vectorFromTo _cargoCorner2ASL) vectorCrossProduct (_cargoCorner4ASL vectorFromTo _cargoCorner3ASL); _surfaceNormal = _surfaceNormal1 vectorAdd _surfaceNormal2; - - _cargo allowDamage false; + + _newCargoPosition = _newCargoPosition vectorAdd ( _cargoModelCenterGroundPosition vectorMultiply -1 ); + _cargo setVectorDir _newCargoDir; _cargo setVectorUp _surfaceNormal; _cargo setPosWorld _newCargoPosition; - _cargo allowDamage true; + _lastCargoHitchPosition = _newCargoHitchPosition; _maxDistanceToCargo = _vehicleHitchPosition distance _newCargoHitchPosition; _lastMovedCargoPosition = _cargoPosition; @@ -149,7 +168,10 @@ SA_Simulate_Towing = { sleep 0.01; - }; + }; + + _cargo setVariable ["SA_TOWING_VEHICLE",nil,true]; + _vehicle setVariable ["SA_TOWING_CARGO",nil,true]; }; @@ -183,9 +205,9 @@ SA_Get_Hitch_Points = { _frontCorner2 = _cornerPoints select 3; _rearHitchPoint = ((_rearCorner vectorDiff _rearCorner2) vectorMultiply 0.5) vectorAdd _rearCorner2; _frontHitchPoint = ((_frontCorner vectorDiff _frontCorner2) vectorMultiply 0.5) vectorAdd _frontCorner2; - _sideLeftPoint = ((_frontCorner vectorDiff _rearCorner) vectorMultiply 0.5) vectorAdd _frontCorner; - _sideRightPoint = ((_frontCorner2 vectorDiff _rearCorner2) vectorMultiply 0.5) vectorAdd _frontCorner2; - [_frontHitchPoint,_rearHitchPoint,_sideLeftPoint,_sideRightPoint]; + //_sideLeftPoint = ((_frontCorner vectorDiff _rearCorner) vectorMultiply 0.5) vectorAdd _frontCorner; + //_sideRightPoint = ((_frontCorner2 vectorDiff _rearCorner2) vectorMultiply 0.5) vectorAdd _frontCorner2; + [_frontHitchPoint,_rearHitchPoint]; }; SA_Attach_Tow_Ropes = { @@ -196,31 +218,32 @@ SA_Attach_Tow_Ropes = { private ["_towRopes","_vehicleHitch","_cargoHitch","_objDistance","_ropeLength"]; _towRopes = _vehicle getVariable ["SA_Tow_Ropes",[]]; if(count _towRopes == 1) then { - /*_closestCargoHitch = [0,0,0]; - _closestDistance = -1; - { - _distanceToHitch = player distance (_cargo modelToWorld _x); - if(_closestDistance < 0 || _distanceToHitch < _closestCargoHitch) then { - _closestCargoHitch = _x; - _closestDistance = _distanceToHitch; - }; - } forEach ([_cargo] call SA_Get_Hitch_Points); - _cargoHitch = _closestCargoHitch; - */ - _cargoHitch = ([_cargo] call SA_Get_Hitch_Points) select 0; + + private ["_cargoHitchPoints","_distanceToFrontHitch","_distanceToRearHitch","_isRearCargoHitch"]; + _cargoHitchPoints = [_cargo] call SA_Get_Hitch_Points; + _distanceToFrontHitch = player distance (_cargo modelToWorld (_cargoHitchPoints select 0)); + _distanceToRearHitch = player distance (_cargo modelToWorld (_cargoHitchPoints select 1)); + if( _distanceToFrontHitch < _distanceToRearHitch ) then { + _cargoHitch = _cargoHitchPoints select 0; + _isRearCargoHitch = false; + } else { + _cargoHitch = _cargoHitchPoints select 1; + _isRearCargoHitch = true; + }; + _vehicleHitch = ([_vehicle] call SA_Get_Hitch_Points) select 1; _ropeLength = (ropeLength (_towRopes select 0)); _objDistance = ((_vehicle modelToWorld _vehicleHitch) distance (_cargo modelToWorld _cargoHitch)); if( _objDistance > _ropeLength ) then { "The tow ropes are too short. Move vehicle closer." remoteExec ["hint", _player]; - } else { + } else { [_vehicle,_player] call SA_Drop_Tow_Ropes; _helper = "Land_Can_V2_F" createVehicle position _cargo; _helper attachTo [_cargo, _cargoHitch]; hideObject _helper; _helper remoteExec ["hideObjectGlobal",2]; [_helper, [0,0,0], [0,0,-1]] ropeAttachTo (_towRopes select 0); - [_vehicle,_vehicleHitch,_cargo,_cargoHitch,_ropeLength] spawn SA_Simulate_Towing; + [_vehicle,_vehicleHitch,_cargo,_cargoHitch,_ropeLength,_isRearCargoHitch] spawn SA_Simulate_Towing; }; }; } else { @@ -323,11 +346,16 @@ SA_Attach_Tow_Ropes_Action = { }; SA_Attach_Tow_Ropes_Action_Check = { - private ["_vehicle","_towVehicle"]; + private ["_vehicle","_towVehicle","_isCargoBeingTowed","_isCargoTowingCargo","_isChainingEnabled","_isTowVehicleBeingTowed","_isTowVehicleTowingCargo"]; _vehicle = cursorTarget; _towVehicle = player getVariable ["SA_Tow_Ropes_Vehicle", objNull]; if(!isNull _towVehicle && !isNull _vehicle) then { - [_towVehicle,_vehicle] call SA_Is_Supported_Cargo && vehicle player == player && player distance _vehicle < 10 && _towVehicle != _vehicle; + _isChainingEnabled = missionNamespace getVariable ["SA_TOW_CHAINS_ENABLED",false]; + _isCargoBeingTowed = not isNull (_vehicle getVariable ["SA_TOWING_VEHICLE",objNull]); + _isCargoTowingCargo = not isNull (_vehicle getVariable ["SA_TOWING_CARGO",objNull]); + _isTowVehicleBeingTowed = not isNull (_towVehicle getVariable ["SA_TOWING_VEHICLE",objNull]); + _isTowVehicleTowingCargo = not isNull (_towVehicle getVariable ["SA_TOWING_CARGO",objNull]); + [_towVehicle,_vehicle] call SA_Is_Supported_Cargo && vehicle player == player && player distance _vehicle < 10 && _towVehicle != _vehicle && !_isTowVehicleTowingCargo && !_isCargoBeingTowed && ((!_isTowVehicleBeingTowed && !_isCargoTowingCargo) || _isChainingEnabled); } else { false; }; @@ -403,7 +431,7 @@ SA_Is_Supported_Vehicle = { if(_vehicle isKindOf _x) then { _isSupported = true; }; - } forEach SA_TOW_SUPPORTED_VEHICLES; + } forEach (missionNamespace getVariable ["SA_TOW_SUPPORTED_VEHICLES_OVERRIDE",SA_TOW_SUPPORTED_VEHICLES]); }; _isSupported; }; @@ -414,17 +442,15 @@ SA_TOW_RULES = [ ["Tank","CAN_TOW","Ship"], ["Tank","CAN_TOW","Air"], ["Tank","CAN_TOW","Cargo_base_F"], + ["Tank","CAN_TOW","StaticCannon"], ["Car","CAN_TOW","Car"], ["Car","CAN_TOW","Ship"], ["Car","CAN_TOW","Air"], - ["Car","CANT_TOW","Helicopter"], - ["Truck_F","CAN_TOW","Helicopter"], + ["Car","CAN_TOW","StaticCannon"], ["Truck_F","CAN_TOW","Cargo_base_F"], ["Ship","CAN_TOW","Ship"] ]; -SA_TOW_RULES_OVERRIDE = []; - SA_Is_Supported_Cargo = { params ["_vehicle","_cargo"]; private ["_canTow"]; @@ -440,7 +466,7 @@ SA_Is_Supported_Cargo = { }; }; }; - } forEach (SA_TOW_RULES + SA_TOW_RULES_OVERRIDE); + } forEach (missionNamespace getVariable ["SA_TOW_RULES_OVERRIDE",SA_TOW_RULES]); }; _canTow; }; @@ -531,7 +557,7 @@ SA_Find_Nearby_Tow_Vehicles = { _nearVehicles = []; { _nearVehicles append (position player nearObjects [_x, 30]); - } forEach SA_TOW_SUPPORTED_VEHICLES; + } forEach (missionNamespace getVariable ["SA_TOW_SUPPORTED_VEHICLES_OVERRIDE",SA_TOW_SUPPORTED_VEHICLES]); _nearVehiclesWithTowRopes = []; { _vehicle = _x; @@ -561,4 +587,4 @@ if(!isDedicated) then { diag_log "Advanced Towing Loaded"; -} remoteExecCall ["bis_fnc_call", 0,true]; +} remoteExecCall ["bis_fnc_call", 0,true]; \ No newline at end of file From b90a1104a636cccd8e42f7bb07cd3b2133043528 Mon Sep 17 00:00:00 2001 From: sethduda Date: Sun, 20 Mar 2016 21:43:05 -0400 Subject: [PATCH 2/3] Removing rear cargo hitch code --- .../functions/fn_advancedTowingInit.sqf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf b/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf index c683311..a45f55d 100644 --- a/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf +++ b/addons/SA_AdvancedTowing/functions/fn_advancedTowingInit.sqf @@ -219,6 +219,7 @@ SA_Attach_Tow_Ropes = { _towRopes = _vehicle getVariable ["SA_Tow_Ropes",[]]; if(count _towRopes == 1) then { + /* private ["_cargoHitchPoints","_distanceToFrontHitch","_distanceToRearHitch","_isRearCargoHitch"]; _cargoHitchPoints = [_cargo] call SA_Get_Hitch_Points; _distanceToFrontHitch = player distance (_cargo modelToWorld (_cargoHitchPoints select 0)); @@ -230,6 +231,9 @@ SA_Attach_Tow_Ropes = { _cargoHitch = _cargoHitchPoints select 1; _isRearCargoHitch = true; }; + */ + + _cargoHitch = ([_cargo] call SA_Get_Hitch_Points) select 0; _vehicleHitch = ([_vehicle] call SA_Get_Hitch_Points) select 1; _ropeLength = (ropeLength (_towRopes select 0)); @@ -243,7 +247,7 @@ SA_Attach_Tow_Ropes = { hideObject _helper; _helper remoteExec ["hideObjectGlobal",2]; [_helper, [0,0,0], [0,0,-1]] ropeAttachTo (_towRopes select 0); - [_vehicle,_vehicleHitch,_cargo,_cargoHitch,_ropeLength,_isRearCargoHitch] spawn SA_Simulate_Towing; + [_vehicle,_vehicleHitch,_cargo,_cargoHitch,_ropeLength] spawn SA_Simulate_Towing; }; }; } else { @@ -441,13 +445,9 @@ SA_TOW_RULES = [ ["Tank","CAN_TOW","Car"], ["Tank","CAN_TOW","Ship"], ["Tank","CAN_TOW","Air"], - ["Tank","CAN_TOW","Cargo_base_F"], - ["Tank","CAN_TOW","StaticCannon"], ["Car","CAN_TOW","Car"], ["Car","CAN_TOW","Ship"], ["Car","CAN_TOW","Air"], - ["Car","CAN_TOW","StaticCannon"], - ["Truck_F","CAN_TOW","Cargo_base_F"], ["Ship","CAN_TOW","Ship"] ]; From d9b14db304ba1a5b31fcd165ede7f5e028ea607b Mon Sep 17 00:00:00 2001 From: sethduda Date: Sun, 20 Mar 2016 21:57:55 -0400 Subject: [PATCH 3/3] Updating PBOs --- addons/SA_AdvancedTowing.pbo | Bin 21841 -> 24031 bytes ...A_AdvancedTowing.pbo.AdvancedTowing.bisign | Bin 567 -> 567 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/addons/SA_AdvancedTowing.pbo b/addons/SA_AdvancedTowing.pbo index d9a46eeeca2d211f8f5334e89a3af02e3ef2482f..c262803416130a9a091a38e60d15a7ae15e5571a 100644 GIT binary patch delta 3505 zcmb_eTW=dh6vm-Vx=u}QPFjZ+rbY?gc8l$#QCo6RQpa|!x=FCp07}hvYmbvfX1Chi zw4gSuKz%@hipwD0kdUgrAOWgYJQWEc1XQXJEq|awJo3;dBqW5y+1XiN)^?f-q)5)r z%=ylDF5j8C_qp%>E#C*J$NSGb_%Jikx%t9_m0PPfuU__b9h->9V-v@$&W?p0X2AbU z372IBqx_thl9iH}-_XiZ5sP#AtawH#VNG08b=i~(%(cE!>U9CMD9R(9_Z@30yJeoo=*QZIHw(zQB z1Fen;EM?p#b+d_ZMaNq(eZ-cC6-)k|s;%D;TYYf#LGviDB2oM9eKgC>zH5Gr9*ZTzxi3t-a@fSmF_O-%oxXPXM* zEwd8=`PM(=6Uc$?!Cn@W%a^xiyT93Ko$EW>F%ga0QkL}`mb8SO+mo_UTzA>f28%{H zQNfq!?!2r)IAl1uzc=o*Uo=YDaU7Al2FNc1pGefGiDZjA#^G7Tb}t{H#R@&@@+bcU zUoqP|U~S3Ji>jtzE$*hk`GPs`F1Qz%6V0|!O$s#TqBvjw9hTyZH=vHUM9tgM-!@wc zd!zyONHZ+?Z114;>7KNYoC}7?7r|w+BlHGY9PT7b14HD`fe^XdyVLqLG+{p`pvv17 zqas&odfKiIYeq2P;Lq-|fFB}GV?(rtp9*(%M5APCWX=A$KJuQmF#5U=ctKjY=t1YV zCR~Rq?d>I1Rt!B1A}-0gAt^3L_xhB1X zrs~d7&wMJx{p2E{- zWTermE~t8=I(j_1as_$ow-c9mxRP&9j*`{UUUK);E^F!eA9nd7z?+FVqdF+13oyjKi1?%h7 nyWLyDSuf{)>ll3O+K(ag?$7VsxxM?;y_Y_E|J?1bZv6f))*^;$ delta 1572 zcmb7^&rcIU6vr)KVSz#`1uPMqAc?fJX(tW4Y375=`g$&0gV`2b|4dVfkz|Oxvt5Q+o{tYR1hvR!k;vvYF^Xr!8~ZlnSJ%qpE%Sad85?jP}`DVS9w^ z3@_1=3=N{SH3SjWRIC-_i_V5zk#rgJ?8L{SGe9kGHS&UUd=Yz(6)D@eE#KG)tOBK=ex z63EFE)~vxaIce(^1+ZwVg!Q^YWu~sBK&iaYRtU5s2Jak?Yn+V4M=*_}@^z6<$lB*H zAB)S1uW89JO1T{jCx{Z3?o6z5N5!QTUtH#QeUsvB3!CJo!%IKFcPg_dUMKF`Bgqa|`p~rbLK`yO;e=x*^ zhHj8yFBW)CoF-Rbeb`C5Jy9P@rnoyyP?PJaTW?WiIMW_XnD9$|*Yx`&7Ry1Lcf zSLz0y8yZIZ>e^ZuHKBu_durv+;G+_?AZ2%aE3evAeCm7C*6!@5r$2fhR2x0~>dwl~ Him!hG+xqQr diff --git a/addons/SA_AdvancedTowing.pbo.AdvancedTowing.bisign b/addons/SA_AdvancedTowing.pbo.AdvancedTowing.bisign index 7161634656992cd600f57e496c12df077dfdf8e1..a8880e7c339addfa59666170dfa8529e6b657bec 100644 GIT binary patch delta 406 zcmV;H0crlX1h)i`tAAGM+@>C1UH4f2^Dz3CDq~qzv^PluFLC(Q}tyC1z&4O~j6 z!AK!rnrW~xF!kYjXtj>d$VYy4qy}8?T~10tU_6OUfPF5U9dsuBvN}BY?bd`#lp>kf zK<{2R#Ick57k?BJ()TRH81+RrfB*mhU~_u$nsG4`;t_s)aD)JXP70*zXD)8|cRDb~ zKb`gIUhOYL@piw((jOO-`}^Uqsoy^}z=?%ZAtwav3o!Pt=q68|eD3tWuVk&M$-}sjNG>3rf zstg#0o})$)R8f1;C*Yi=gO+xEAVC|Z<47*XZn_?6z10B>evZX=$W_eB1S~$=?z!=^ zvNwwOf9;#yM}9o?g{~wH#W@}=?{%MSv7PWEJr3s?y%C|ux_@8-0001h0001ITG}f} zARy{>+?I=FRxYJsHZ;}A0oW=q|ImWDiFNm(vG|v27SuD=<6k9kLOa5+BT|J@z?wCg z#wP$ELRZ@;yvgRB_}=*$9NfM5pgmOa7|EKZHHulTpS^A`c8B6`v4Y-$31$T4@zOt& zh99_NNFya6b$`5^zh1a|#(8)lfB*mh9u4O*VgY$ug>=kJK}z=aWz+Sb5Gy5X{WvX`&R?Vq&b4*lOA47Uun*M?A>-8h=4tx zj>7reJ$X9qZz9y5I0yX>%t{8JJ$vOjsv=d~gN$dZ1`mv4b6|O@ZgXCCajK`su;fq5 AUjP6A