anchor.diff:              % relative path
               {ParentCtx, _} = files_tree:get_parent(SymlinkFileCtx, UserCtx),
               resolve_symlink_path(PathTokens, ParentCtx, NewResolutionCtx)
  -    end.
  -
  -
  -%% @private
  --spec assert_hops_limit_not_reached(file_ctx:ctx(), ctx()) -> ctx() | no_return().
  -assert_hops_limit_not_reached(SymlinkFileCtx, #resolution_ctx{
  -    symlinks_encountered = Symlinks
  -} = ResolutionCtx) ->
  -    SymlinkGuid = file_ctx:get_logical_guid_const(SymlinkFileCtx),
  -
  -    AlreadyEncountered = ordsets:is_element(SymlinkGuid, Symlinks),
  -    HopsLimitReached = (1 + ordsets:size(Symlinks)) > ?SYMLINK_HOPS_LIMIT,
  -
  -    case AlreadyEncountered orelse HopsLimitReached of
  -        true ->
  -            throw(?ELOOP);
  -        false ->
  -            ResolutionCtx#resolution_ctx{
  -                symlinks_encountered = ordsets:add_element(SymlinkGuid, Symlinks)
  -            }
       end.
   
   
  
positive.code: -spec resolve_symlink(file_ctx:ctx(), ctx()) -> {file_ctx:ctx(), ctx()} | no_return().
  resolve_symlink(SymlinkFileCtx, #resolution_ctx{
      user_ctx = UserCtx,
      space_id = SpaceId
  } = ResolutionCtx) ->
      SpaceIdSize = byte_size(SpaceId),
      NewResolutionCtx = assert_hops_limit_not_reached(SymlinkFileCtx, ResolutionCtx),
  
      case filepath_utils:split(read_symlink(UserCtx, SymlinkFileCtx)) of
          [] ->
  
negative.code: -record(resolution_ctx, {
      user_ctx :: user_ctx:ctx(),
      space_id :: od_space:id(),
      symlinks_encountered :: pos_integer()
  }).
  -type ctx() :: #resolution_ctx{}.
  
  