text:
push!(LOAD_PATH,"/home/michel/git/PIPS.jl/src")
using PIPS
using Test
using MPI
using Libdl

# hs071
# min x1 * x4 * (x1 + x2 + x3) + x3
# st  x1 * x2 * x3 * x4 >= 25
#     x1^2 + x2^2 + x3^2 + x4^2 = 40
#     1 <= x1, x2, x3, x4 <= 5
# Start at (1,5,5,1)
# End at (1.000..., 4.743..., 3.821..., 1.379...)

function init_x0_wrapper(x0_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(Int(data.row_node_id))
    colid = Int(Int(data.col_node_id))
    @assert(rowid == colid)
    # n0 = prob.model.get_num_cols(colid)
    x0 = unsafe_wrap(Array, x0_ptr, 4)
    x0[1] = 1.0
    x0[2] = 5.0
    x0[3] = 5.0
    x0[4] = 1.0
    # prob.model.str_init_x0(colid,x0)
            # @assert(id in getLocalBlocksIds(instance.internalModel))
            # mm = getModel(instance.internalModel,id)
            # nvar = getNumVars(instance.internalModel,id)
            # @assert length(x0) == nvar
            #
            # for i=1:nvar
            #     x0[i] = getvalue(Variable(mm,i))
            #     isnan(x0[i]) ? x0[i]=1.0 : nothing
            # end
    return Int32(1)
end

# prob info (prob_info)
function prob_info_wrapper(n_ptr::Ptr{Cint}, col_lb_ptr::Ptr{Float64}, col_ub_ptr::Ptr{Float64}, m_ptr::Ptr{Cint}, row_lb_ptr::Ptr{Float64}, row_ub_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(Int(data.row_node_id))
    colid = Int(data.col_node_id)
    flag = Int(data.flag)
    @assert(rowid == colid)

	mode = (col_lb_ptr == C_NULL) ? (:Structure) : (:Values)
	if mode==:Structure
        if flag == 1
            m = 0
            println("Only storing this")
            unsafe_store!(m_ptr,convert(Cint,m)::Cint)
        else
            if colid == 0
                n = prob.n
                m = prob.m
            end
            # n = getNumVars(instance.internalModel,id)
            # m = getNumCons(instance.internalModel,id)
    		# prob.model.set_num_rows(colid, m)
    		# prob.model.set_num_cols(colid, n)
            println("Storing m and n")
            unsafe_store!(n_ptr,convert(Cint,n)::Cint)
            unsafe_store!(m_ptr,convert(Cint,m)::Cint)
        end
	else
        # This is for linking constraints which is not supported
        if flag == 1
            m = unsafe_load(m_ptr)
            @assert m==0
        else
    		n = unsafe_load(n_ptr)
    		m = unsafe_load(m_ptr)

    		col_lb = unsafe_wrap(Array,col_lb_ptr,n)
    		col_ub = unsafe_wrap(Array,col_ub_ptr,n)
    		row_lb = unsafe_wrap(Array,row_lb_ptr,m)
    		row_ub = unsafe_wrap(Array,row_ub_ptr,m)
    		# prob.model.str_prob_info(colid,flag,mode,col_lb,col_ub,row_lb,row_ub)
            if colid == 0
                col_lb[1] = prob.x_L[1]
                col_lb[2] = prob.x_L[2]
                col_lb[3] = prob.x_L[3]
                col_lb[4] = prob.x_L[4]
                col_ub[1] = prob.x_U[1]
                col_ub[2] = prob.x_U[2]
                col_ub[3] = prob.x_U[3]
                col_ub[4] = prob.x_U[4]
                row_lb[1] = prob.g_L[1]
                row_lb[2] = prob.g_L[2]
                row_ub[1] = prob.g_U[1]
                row_ub[2] = prob.g_U[2]
        		neq = 0
        		nineq = 0
        		for i = 1:length(row_lb)
        			if row_lb[i] == row_ub[i]
        				neq += 1
        			else
        				nineq += 1
        			end
        		end
        		@assert(neq+nineq == length(row_lb) == m)
            end
    		# prob.model.set_num_eq_cons(colid,neq)
    		# prob.model.set_num_ineq_cons(colid,nineq)
        end
	end
	return Int32(1)
end
# Objective (eval_f)
function eval_f_wrapper(x0_ptr::Ptr{Float64}, x1_ptr::Ptr{Float64}, obj_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(Int(data.row_node_id))
    colid = Int(data.col_node_id)
    @assert(rowid == colid)
    # n0 = prob.model.get_num_cols(0)
    # n1 = prob.model.get_num_cols(colid)
    # Calculate the new objective
    n0 = prob.n
    n1 = prob.n
    x0 = unsafe_wrap(Array, x0_ptr, n0)
    x1 = unsafe_wrap(Array, x1_ptr, n1)
    obj = x0[1] * x0[4] * (x0[1] + x0[2] + x0[3]) + x0[3]

    # new_obj = convert(Float64, prob.model.str_eval_f(colid,x0,x1))::Float64
    unsafe_store!(obj_ptr, obj)
    return Int32(1)
end

# Constraints (eval_g)
function eval_g_wrapper(x0_ptr::Ptr{Float64}, x1_ptr::Ptr{Float64}, eq_g_ptr::Ptr{Float64}, ineq_g_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    # @show " julia - eval_g_wrapper "
    data = unsafe_load(cbd)
    # @show data
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(data.row_node_id)
    colid = Int(data.col_node_id)
    @assert(rowid == colid)
    # n0 = probd.model.get_num_cols(0)
    # n1 = prob.model.get_num_cols(colid)
    n0 = prob.n
    n1 = prob.n
    x0 = unsafe_wrap(Array, x0_ptr, n0)
    x1 = unsafe_wrap(Array, x1_ptr, n1)
    # Calculate the new constraint values
    # neq = prob.model.get_num_eq_cons(rowid)
    # nineq = prob.model.get_num_ineq_cons(rowid)
    neq = 1
    nineq = 1
    eq_g = unsafe_wrap(Array, eq_g_ptr, neq)
    ineq_g = unsafe_wrap(Array, ineq_g_ptr, nineq)
    eq_g[1] = x0[1]^2 + x0[2]^2 + x0[3]^2 + x0[4]^2
    ineq_g[1] = x0[1]   * x0[2]   * x0[3]   * x0[4]

    return Int32(1)
end

# Objective gradient (eval_grad_f)
function eval_grad_f_wrapper(x0_ptr::Ptr{Float64}, x1_ptr::Ptr{Float64}, grad_f_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(data.row_node_id)
    colid = Int(data.col_node_id)
    n0 = prob.n
    n1 = prob.n
    x0 = unsafe_wrap(Array, x0_ptr, n0)
    x1 = unsafe_wrap(Array, x1_ptr, n1)
    # grad_len = prob.model.get_num_cols(colid)
    grad_len = prob.n
    grad_f = unsafe_wrap(Array, grad_f_ptr, grad_len)
    grad_f[1] = x0[1] * x0[4] + x0[4] * (x0[1] + x0[2] + x0[3])
    grad_f[2] = x0[1] * x0[4]
    grad_f[3] = x0[1] * x0[4] + 1.0
    grad_f[4] = x0[1] * (x0[1] + x0[2] + x0[3])

    # TODO: Gotta think about this
    # if prob.model.get_sense() == :Max
    #     new_grad_f *= -1.0
    # end
    return Int32(1)
end

# Jacobian (eval_jac_g)
function eval_jac_g_wrapper(x0_ptr::Ptr{Float64}, x1_ptr::Ptr{Float64},
	e_nz_ptr::Ptr{Cint}, e_values_ptr::Ptr{Float64}, e_row_ptr::Ptr{Cint}, e_col_ptr::Ptr{Cint},
	i_nz_ptr::Ptr{Cint}, i_values_ptr::Ptr{Float64}, i_row_ptr::Ptr{Cint}, i_col_ptr::Ptr{Cint},
	cbd::Ptr{CallBackData}
	)
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(Int(data.row_node_id))
    colid = Int(Int(data.col_node_id))
    flag = Int(data.flag)
    # n0 = prob.model.get_num_cols(0)
    # n1 = prob.model.get_num_cols(rowid) #we can do this because of 2-level and no linking constraint
    n0 = prob.n
    n1 = prob.n
    x0 = unsafe_wrap(Array, x0_ptr, n0)
    x1 = unsafe_wrap(Array, x1_ptr, n1)
    # nrow = prob.model.get_num_rows(rowid)
    # ncol = prob.model.get_num_cols(colid)
    ncol = prob.n
    mode = (e_col_ptr == C_NULL && i_col_ptr == C_NULL) ? (:Structure) : (:Values)
    if flag != 1
        if mode == :Structure
            if colid == 0 && rowid == 0
                e_values = unsafe_wrap(Array,e_values_ptr,0)
                e_colptr = unsafe_wrap(Array,e_col_ptr,0)
                e_rowidx = unsafe_wrap(Array,e_row_ptr,0)
                i_values = unsafe_wrap(Array,i_values_ptr,0)
                i_colptr = unsafe_wrap(Array,i_col_ptr,0)
                i_rowidx = unsafe_wrap(Array,i_row_ptr,0)

                # (e_nz,i_nz) = prob.model.str_eval_jac_g(rowid,colid,flag,x0,x1,mode,e_rowidx,e_colptr,e_values,i_rowidx,i_colptr,i_values)
                e_nz::Cint = prob.n
                i_nz::Cint = prob.n
                # else
                #     e_nz = 0
                #     i_nz = 0
                # end
                unsafe_store!(e_nz_ptr,convert(Cint,e_nz)::Cint)
                unsafe_store!(i_nz_ptr,convert(Cint,i_nz)::Cint)
            end
        else
            if colid == 0 && rowid == 0
                e_nz = unsafe_load(e_nz_ptr)
                i_nz = unsafe_load(i_nz_ptr)
                if e_nz > 0
                    e_rowidx = unsafe_wrap(Array,e_row_ptr,e_nz)
                    e_colptr = unsafe_wrap(Array,e_col_ptr,ncol+1)
                    e_values = unsafe_wrap(Array,e_values_ptr,e_nz)
                    e_rowidx[1] = 0
                    e_rowidx[2] = 0
                    e_rowidx[3] = 0
                    e_rowidx[4] = 0
                    e_colptr[1] = 0
                    e_colptr[2] = 1
                    e_colptr[3] = 2
                    e_colptr[4] = 3
                    e_colptr[5] = 4
                    e_values[1] = 2*x0[1]  # 2,1
                    e_values[2] = 2*x0[2]  # 2,2
                    e_values[3] = 2*x0[3]  # 2,3
                    e_values[4] = 2*x0[4]  # 2,4
                end
                if i_nz > 0
                    # Constraint (row) 2
                    i_rowidx = unsafe_wrap(Array,i_row_ptr,i_nz)
                    i_colptr = unsafe_wrap(Array,i_col_ptr,ncol+1)
                    i_values = unsafe_wrap(Array,i_values_ptr,i_nz)
                    i_rowidx[1] = 0
                    i_rowidx[2] = 0
                    i_rowidx[3] = 0
                    i_rowidx[4] = 0
                    i_colptr[1] = 0
                    i_colptr[2] = 1
                    i_colptr[3] = 2
                    i_colptr[4] = 3
                    i_colptr[5] = 4
                    # prob.model.str_eval_jac_g(rowid,colid,flag,x0,x1,mode,e_rowidx,e_colptr,e_values,i_rowidx,i_colptr,i_values)
                    # Constraint (row) 2
                    i_values[1] = x0[2]*x0[3]*x0[4]  # 1,1
                    i_values[2] = x0[1]*x0[3]*x0[4]  # 1,2
                    i_values[3] = x0[1]*x0[2]*x0[4]  # 1,3
                    i_values[4] = x0[1]*x0[2]*x0[3]  # 1,4
                end
                return Int32(1)
            end
        end
    else
        @assert flag == 1
        if mode == :Structure
            e_nz = 0
            i_nz = 0
            unsafe_store!(e_nz_ptr,convert(Cint,e_nz)::Cint)
            unsafe_store!(i_nz_ptr,convert(Cint,i_nz)::Cint)
        else
            e_nz = unsafe_load(e_nz_ptr)
            i_nz = unsafe_load(i_nz_ptr)
            @assert e_nz == i_nz == 0
        end
    end
    return Int32(1)
end

# Hessian
function eval_h_wrapper(x0_ptr::Ptr{Float64}, x1_ptr::Ptr{Float64}, lambda_ptr::Ptr{Float64}, nz_ptr::Ptr{Cint}, values_ptr::Ptr{Float64}, row_ptr::Ptr{Cint}, col_ptr::Ptr{Cint}, cbd::Ptr{CallBackData})
    data = unsafe_load(cbd)
    userdata = data.prob
    prob = unsafe_pointer_to_objref(userdata)::PipsNlpProblemStruct
    rowid = Int(data.row_node_id)
    colid = Int(data.col_node_id)
    flag = Int(data.flag)

    high = max(rowid,colid)
    low  = min(rowid,colid)
    n0 = prob.n
    # n0 = prob.model.get_num_cols(0)
    # n1 = prob.model.get_num_cols(high)
    x0 = unsafe_wrap(Array,x0_ptr,n0)
    ncol = prob.n
    # x1 = unsafe_wrap(Array,x1_ptr,n1)
    # ncol = prob.model.get_num_cols(low)
    # g0 = prob.model.get_num_rows(high)
    lambda = unsafe_wrap(Array,lambda_ptr,2)
    obj_factor = 1.0
    mode = (col_ptr == C_NULL) ? (:Structure) : (:Values)
    if mode == :Structure
		if (rowid == 0 && colid == 0)
            nz = prob.nele_hess
        else
            nz = 0
        end
		unsafe_store!(nz_ptr,convert(Cint,nz)::Cint)
    else
    	nz = unsafe_load(nz_ptr)
        if nz > 0
            if colid == 0 && rowid == 0
                values = unsafe_wrap(Array, values_ptr, nz)
                rowidx = unsafe_wrap(Array, row_ptr, nz)
                colptr = unsafe_wrap(Array, col_ptr, ncol+1)
                rowidx[1] = 0

                rowidx[2] = 0
                rowidx[3] = 1

                rowidx[4] = 0
                rowidx[5] = 1
                rowidx[6] = 2

                rowidx[7] = 0
                rowidx[8] = 1
                rowidx[9] = 2
                rowidx[10] = 3

                colptr[1] = 0
                colptr[2] = 1
                colptr[3] = 3
                colptr[4] = 6
                colptr[5] = 10
                # return Int32(1)

                values[1] = obj_factor * (2*x0[4])  # 1,1
                values[2] = obj_factor * (  x0[4])  # 2,1
                values[3] = 0                      # 2,2
                values[4] = obj_factor * (  x0[4])  # 3,1
                values[5] = 0                      # 3,2
                values[6] = 0                      # 3,3
                values[7] = obj_factor * (2*x0[1] + x0[2] + x0[3])  # 4,1
                values[8] = obj_factor * (  x0[1])  # 4,2
                values[9] = obj_factor * (  x0[1])  # 4,3
                values[10] = 0                     # 4,4

                # First constraint
                values[2] += lambda[2] * (x0[3] * x0[4])  # 2,1
                values[4] += lambda[2] * (x0[2] * x0[4])  # 3,1
                values[5] += lambda[2] * (x0[1] * x0[4])  # 4,1
                values[7] += lambda[2] * (x0[2] * x0[3])  # 3,2
                values[8] += lambda[2] * (x0[1] * x0[3])  # 4,2
                values[9] += lambda[2] * (x0[1] * x0[2])  # 4,3

                # Second constraint
                values[1]  += lambda[1] * 2  # 1,1
                values[3]  += lambda[1] * 2  # 2,2
                values[6]  += lambda[1] * 2  # 3,3
                values[10] += lambda[1] * 2  # 4,4
                # prob.model.str_eval_h(rowid,colid,flag,x0,x1,obj_factor,lambda,mode,rowidx,colptr,values)
            end
        end
    end

    return Int32(1)
end

#write solution
function write_solution_wrapper(x_ptr::Ptr{Float64}, y_eq_ptr::Ptr{Float64}, y_ieq_ptr::Ptr{Float64}, cbd::Ptr{CallBackData})
    x = unsafe_wrap(Array,x_ptr,4)
    @test x[1] ≈ 1.0000000000000000 atol=1e-5
    @test x[2] ≈ 4.7429996418092970 atol=1e-5
    @test x[3] ≈ 3.8211499817883077 atol=1e-5
    @test x[4] ≈ 1.3794082897556983 atol=1e-5
    return Int32(1)
end

function PIPScreateProblem(comm::MPI.Comm, model, prof::Bool, numscen::Int, n::Int, x_L::Vector{Float64}, x_U::Vector{Float64},
    m::Int, g_L::Vector{Float64}, g_U::Vector{Float64},
    nele_jac::Int, nele_hess::Int)
	# println(" createProblemStruct  -- julia")
    # TODO: Some callbacks to do not much
	str_init_x0_cb = @cfunction(init_x0_wrapper, Cint, (Ptr{Float64}, Ptr{CallBackData}) )
    str_prob_info_cb = @cfunction(prob_info_wrapper, Cint, (Ptr{Cint}, Ptr{Float64}, Ptr{Float64}, Ptr{Cint}, Ptr{Float64}, Ptr{Float64}, Ptr{CallBackData}) )
    str_eval_f_cb = @cfunction(eval_f_wrapper,Cint, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{CallBackData}) )
    str_eval_g_cb = @cfunction(eval_g_wrapper,Cint, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{CallBackData}) )
    str_eval_grad_f_cb = @cfunction(eval_grad_f_wrapper, Cint, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{CallBackData}) )
    str_eval_jac_g_cb = @cfunction(eval_jac_g_wrapper, Cint, (Ptr{Float64}, Ptr{Float64},
    	Ptr{Cint}, Ptr{Float64}, Ptr{Cint}, Ptr{Cint},
    	Ptr{Cint}, Ptr{Float64}, Ptr{Cint}, Ptr{Cint},
    	Ptr{CallBackData}))
    str_eval_h_cb = @cfunction(eval_h_wrapper, Cint, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{Cint}, Ptr{Float64}, Ptr{Cint}, Ptr{Cint}, Ptr{CallBackData}))
    str_write_solution_cb = @cfunction(write_solution_wrapper, Cint, (Ptr{Float64}, Ptr{Float64}, Ptr{Float64}, Ptr{CallBackData}))

    # println(" callback created ")
    prob = PipsNlpProblemStruct(comm, model, prof, n, x_L, x_U, m, g_L, g_U, nele_jac, nele_hess)
    # @show prob
    ret = ccall(Libdl.dlsym(getPipsLib(),:CreatePipsNlpProblemStruct),Ptr{Nothing},
            (MPI.CComm,
            Cint, Ptr{Nothing}, Ptr{Nothing},
	    Ptr{Nothing}, Ptr{Nothing}, Ptr{Nothing},
	    Ptr{Nothing}, Ptr{Nothing}, Ptr{Nothing},Any
            ),
            MPI.CComm(comm),
            numscen,
            str_init_x0_cb,
            str_prob_info_cb,
            str_eval_f_cb,
            str_eval_g_cb,
            str_eval_grad_f_cb,
            str_eval_jac_g_cb,
            str_eval_h_cb,
            str_write_solution_cb,
            prob
            )
    # println(" ccall CreatePipsNlpProblemStruct done ")
    # @show ret

    if ret == C_NULL
        error("PIPS-NLP: Failed to construct problem.")
    else
        prob.ref = ret
    end
    # @show prob
    # println("end createProblemStruct - julia")
    return prob
end

n = 4
x_L = [1.0, 1.0, 1.0, 1.0]
x_U = [5.0, 5.0, 5.0, 5.0]

m = 2
g_L = [40.0, 25.0]
g_U = [40.0, 2.0e19]

comm = MPI.COMM_WORLD
model = nothing
prof = false
numscen = 0

prob = PIPScreateProblem(comm, model, prof, numscen, n, x_L, x_U, m, g_L, g_U, 8, 10)
@test solveProblemStruct(prob) == :SUCCESSFUL_TERMINATION
# @test PIPSRetCode(solveProblemStruct(prob)) == :SUCCESSFUL_TERMINATION
freeProblemStruct(prob)

# prob.x = [1.0, 5.0, 5.0, 1.0]
# solvestat = solveProblem(prob)


text:
@runonce immutable CCVArrayType{T}
    typ::Cint
    sig::UInt64
    refcount::Cint
    rnum::Cint
    size::Cint
    rsize::Cint
    data::Ptr{T}
end

@runonce type CCVArray{T}
    ptr::Ptr{CCVArrayType{T}}
    function CCVArray(ptr::Ptr{CCVArrayType{T}})
        arr = new(ptr)
        finalizer(arr, arr -> free(arr))
        arr
    end
end

function free(arr::CCVArray)
    if arr.ptr != C_NULL
        ccall((:ccv_array_free, libccv), Void, (Ptr{CCVArrayType},), arr)
        arr.ptr = C_NULL
    end
end

function Base.getindex{T}(arr::CCVArray{T}, i::Integer)
    at = unsafe_load(arr.ptr)
    if i <= at.rnum
        return unsafe_load(at.data, i)
    else
        throw(BoundsError("Index $i is greater than " *
                          "array length $(at.rnum)"))
    end
end

function Base.length(arr::CCVArray)
    at = unsafe_load(arr.ptr)
    return at.rnum
end
Base.size(arr::CCVArray) = (length(arr),)

Base.cconvert{T}(::Type{Ptr{CCVArrayType{T}}}, arr::CCVArray{T}) = arr
Base.unsafe_convert{T}(::Type{Ptr{CCVArrayType{T}}}, arr::CCVArray{T}) = arr.ptr

ext: jl


text:
function fit(objective::Union{NegativeLogLikelihood, Extended},
        optimizer = MigradAndHesse(), args...; kws...)
    d = model(objective)
    fit_result = minimize(x->objective(0,x), p2v(d), optimizer, args...; kws...)
    return fit_summary(fit_result, d)
end

fit(model::Normalized, data, optimizer = MigradAndHesse(), args...; kws...) =
    fit(NegativeLogLikelihood(model, data), optimizer, args...; kws...)
#

# the optimizer interface <: Optimizer should implement
#  - minimize(objective, optimizer::Optimizer)
#  - minimizer(minimizationResult)
#  - measurement(minimizationResult)
#  - minimum(minimizationResult)

function fit_summary(fit_result, model)
    nll = minimum(fit_result)
    parameters = v2p(minimizer(fit_result), model)
    meas = v2p(measurements(fit_result), model)
    best_model = updatepars(model, parameters)
    #
    return (; parameters, best_model, nll, fit_result, measurements=meas)
end

# function fit(data::AbstractArray, model::AbstractFunctionWithParameters, args...; kws...)
#     fit_results = fit_llh(data, model, args...; init_pars = p2v(model), kws...)
#     return fit_summary(fit_results, model) + (fit_results = fit_results, )
# end

#                                            _|                          _|              _|
#    _|_|_|    _|_|    _|_|_|      _|_|_|  _|_|_|_|  _|  _|_|    _|_|_|      _|_|_|    _|_|_|_|    _|_|_|
#  _|        _|    _|  _|    _|  _|_|        _|      _|_|      _|    _|  _|  _|    _|    _|      _|_|
#  _|        _|    _|  _|    _|      _|_|    _|      _|        _|    _|  _|  _|    _|    _|          _|_|
#    _|_|_|    _|_|    _|    _|  _|_|_|        _|_|  _|          _|_|_|  _|  _|    _|      _|_|  _|_|_|

# function fit_llh(data, d::AbstractFunctionWithParameters, constraints::NamedTuple;
#     init_pars = p2v(d), kws...)
#     #
#     filtered_data = filter(x->inrange(x, AlgebraPDF.lims(d)), data)
#     #
#     llh(p) = -sum((v>0) ? log(v) : -1e4 for v in d(filtered_data, p))
#     fc(v) = AlgebraPDF.chi2(constraints; p=v2p(v, d))
#     llh_constr(p) = llh(p) + fc(p)
#     return minimize(llh_constr, init_pars; kws...)
# end

# chi2(specification; p) = sum(((getproperty(p, k)-v) / e)^2
#     for (k,(v,e)) in zip(keys(specification),specification))

# function fit_llh_with_constraints(data, d::AbstractPDF, specification)
#     filtered_data = filter(x->inrange(x, lims(d)), data)
#     fc(v) = chi2(specification; p=v2p(v, d))
#     return fit_llh_with_constraints(filtered_data, d, fc; init=p2v(d))
# end

# function fit_llh_with_constraints(data, f, fc; init = error("init!!"))
#     nll(p) = -sum((v>0) ? log(v) : -1e4 for v in f(data, p))
#     nll_constr(p) = nll(p) + fc(p)
#     return optimize_get_state_hessian(nll_constr, init, BFGS())
# end


text:
# THIS IS THE APP'S LAYOUT

function layout!(app)
    app.layout = html_div(id="main") do
        html_div(id="header") do
            html_h1(
                "Lab Climate Dashboard",
            )#h1
        end,
        html_hr(),
        html_div(id="body") do
            html_div(className="graph", id="graph-div") do
                dcc_graph(
                    id = "log-graph",
                    figure = (
                        data = [
                            (
                                x    = DateTime[],
                                y    = Float64[],
                                name = "Temperature",
                                line = (color=:OrangeRed,)
                            ),
                            (
                                x     = DateTime[],
                                y     = Float64[],
                                name  = "Humidity",
                                yaxis = "y2",
                                line  = (color=:SteelBlue,)
                            ),
                        ],
                        layout = (
                            yaxis = (
                                title = "Temperature (°C)",
                                titlefont = (
                                    color = :OrangeRed,
                                ),
                                tickfont = (
                                    color = :OrangeRed,
                                ),
                            ),
                            yaxis2 = (
                                title = "relative Humidity (%)",
                                titlefont = (
                                    color = :SteelBlue,
                                ),
                                tickfont = (
                                    color = :SteelBlue,
                                ),
                                overlaying = "y",
                                side = "right",
                            ),
                            uirevision="no",
                        )
                    )
                )
            end, #log-graph
            html_hr(),
            html_div(id="range-select") do
                html_p("Pick a date range:"),
                dcc_datepickerrange(
                    id = "date-picker-range",
                    min_date_allowed = DateTime("2020-01-01"), #minimum(df.date),
                    max_date_allowed = DateTime("2040-01-01"), #maximum(df.date),
                    initial_visible_month = now(),
                    start_date = START_DATE,
                    end_date = Date( now() ) + Day(1),
                )
            end, #range-select
            html_hr(),
            html_div(className="stats", id="stats") do
                html_h2("Statistics"),
                html_div() do
                    html_h3("Temperature"),
                    html_div(id = "temperature-stats")
                end,
                html_div() do
                    html_h3("Humidity"),
                    html_div(id = "humidity-stats")
                end
            end #stats
        end, #body

        # INVISIBLE COMPONENTS
        html_div() do
            # This will trigger a callback to update the graph regularly
            dcc_interval(
                id = "refresh-interval",
                interval = INTERVAL*1000, # interval in ms
                n_intervals = 0,
            )
        end
    end

    nothing
end #layout


text:
@testset "misc-html" begin
    fs1()
    λ = "blah/blah.ext"
    set_curpath("pages/cpB/blah.md")
    @test F.html_ahref(λ, 1)           == "1"
    @test F.html_ahref(λ, "bb")        == "bb"
    @test F.html_ahref_key("cc", "dd") == "dd"
    @test F.html_div("dn","ct") == "
ct
"
    @test F.html_img("src", "alt") == ""
    @test F.html_code("code") == "
code
"
    @test F.html_code("code", "lang") == "
code
"
    @test F.html_err("blah") == "
// blah //
"

    fs2()
    λ = "blah/blah.ext"
    set_curpath("cpB/blah.md")
    @test F.html_ahref(λ, 1)           == "1"
    @test F.html_ahref(λ, "bb")        == "bb"
    @test F.html_ahref_key("cc", "dd") == "dd"

    fs1()
end

@testset "misc-html 2" begin
   h = "
blah
"
   @test !F.is_html_escaped(h)
   @test F.html_code(h, "html") == """
<div class="foo">blah</div>
"""
   he = Markdown.htmlesc(h)
   @test F.is_html_escaped(he)
   @test F.html_code(h, "html") == F.html_code(h, "html")
end

@testset "html/hide" begin
    c = """
        a=5
        b=7
        """
    @test F.html_skip_hidden(c, "foo") == c
    c = """
        #hideall
        a=5
        b=7
        """
    @test F.html_skip_hidden(c, "julia") == ""
    c = """
        a=5 #hide
        b=7
        """
    @test F.html_skip_hidden(c, "julia") == "b=7"
end

@testset "html_code" begin
    c = """
        using Random
        Random.seed!(555) # hide
        a = randn()
        b = a + 5
        """
    @test F.html_code(c, "julia") ==
        """
using Random
        a = randn()
        b = a + 5
"""
end


text:
using ArgParse

parser = ArgParseSettings()
@add_arg_table! parser begin
    "--two-step"
        arg_type = Float64
        help = """Test statistic bound for use with the two-step estimator.
            Not compatible with --no-intercept and --constrain-intercept."""
    "--h²"
        arg_type = String
        help = """Filename for a .sumstats[.gz] file for one-phenotype LD Score regression.
            --h2 requires at minimum also setting the --ref-ld and --w-ld flags."""
    "--h²-cts"
        arg_type = String
        help = """Filename for a .sumstats[.gz] file for cell-type-specific analysis.
            --h2-cts requires the --ref-ld-chr, --w-ld, and --ref-ld-chr-cts flags."""
    "--rg"
        arg_type = String
        help = "Comma-separated list of prefixes of .chisq filed for genetic correlation estimation."
    "--ref-ld"
        arg_type = String
        help = """Use --ref-ld to tell LDSC which LD Scores to use as the predictors in the LD Score regression.
            LDSC will automatically append .l2.ldscore/.l2.ldscore.gz to the filename prefix."""
    "--n-blocks"
        default = 200
        arg_type = Int64
        help = "Number of block jackknife blocks."
    "--χ²-max"
        arg_type = Float64
        help = "Max χ²."
    "--intercept-h²"
        help = "Intercepts for constrained-intercept single-trait LD Score regression."
    "--overlap-annot"
        default = false
        action = "store_true"
        help = """This flag informs LDSC that the partitioned LD Scores were generates using an
            annot matrix with overlapping categories (i.e., not all row sums equal 1),
            and prevents LDSC from displaying output that is meaningless with overlapping categories."""
end # add_arg_table parser
args = parse_args(ARGS, parser)

#= sanity check
print(args["two-step"])
=#

#= TODO arguments to be implemented
"--out", default = "ldsc", arg_type = String,
    help = "Output filename prefix. If --out is not set, LDSC will use ldsc as the "
    "defualt output filename prefix.")
# Basic LD Score Estimation Flags"
"--bfile", arg_type = String,
    help = "Prefix for Plink .bed/.bim/.fam file")
"--l2", default = false, action = "store_true",
    help = "Estimate l2. Compatible with both jackknife and non-jackknife.")
# Filtering / Data Management for LD Score
"--extract", arg_type = String,
    help = "File with SNPs to include in LD Score estimation. "
    "The file should contain one SNP ID per row.")
"--keep", arg_type = String,
    help = "File with individuals to include in LD Score estimation. "
    "The file should contain one individual ID per row.")
"--ld-wind-snps", arg_type = Int32,
    help = "Specify the window size to be used for estimating LD Scores in units of "
    "# of SNPs. You can only specify one --ld-wind-* option.")
"--ld-wind-kb", arg_type = Float64,
    help = "Specify the window size to be used for estimating LD Scores in units of "
    "kilobase-pairs (kb). You can only specify one --ld-wind-* option.")
"--ld-wind-cm", arg_type = Float64,
    help = "Specify the window size to be used for estimating LD Scores in units of "
    "centiMorgans (cM). You can only specify one --ld-wind-* option.")
"--print-snps", arg_type = String,
    help = "This flag tells LDSC to only print LD Scores for the SNPs listed "
    "(one ID per row) in PRINT_SNPS. The sum r^2 will still include SNPs not in "
    "PRINT_SNPs. This is useful for reducing the number of LD Scores that have to be "
    "read into memory when estimating h2 or rg." )
# Fancy LD Score Estimation Flags
"--annot", arg_type = String,
    help = "Filename prefix for annotation file for partitioned LD Score estimation. "
    "LDSC will automatically append .annot or .annot.gz to the filename prefix. "
    "See docs/file_formats_ld for a definition of the .annot format.")
"--thin-annot", action = "store_true", default = false,
    help = "This flag says your annot files have only annotations, with no SNP, CM, CHR, BP columns.")
"--cts-bin", arg_type = String,
    help = "This flag tells LDSC to compute partitioned LD Scores, where the partition "
    "is defined by cutting one or several continuous variable[s] into bins. "
    "The argument to this flag should be the name of a single file or a comma-separated "
    "list of files. The file format is two columns, with SNP IDs in the first column "
    "and the continuous variable in the second column. ")
"--cts-breaks", arg_type = String,
    help = "Use this flag to specify names for the continuous variables cut into bins "
    "with --cts-bin. For each continuous variable, specify breaks as a comma-separated "
    "list of breakpoints, and separate the breakpoints for each variable with an x. "
    "For example, if binning on MAF and distance to gene (in kb), "
    "you might set --cts-breaks 0.1,0.25,0.4x10,100,1000 ")
"--cts-names", arg_type = String,
    help = "Use this flag to specify names for the continuous variables cut into bins "
    "with --cts-bin. The argument to this flag should be a comma-separated list of "
    "names. For example, if binning on DAF and distance to gene, you might set "
    "--cts-bin DAF,DIST_TO_GENE ")
"--per-allele", default = false, action = "store_true",
    help = "Setting this flag causes LDSC to compute per-allele LD Scores, "
    "i.e., \ell_j : =  \sum_k p_k(1-p_k)r^2_{jk}, where p_k denotes the MAF "
    "of SNP j. ")
"--pq-exp", arg_type = Float64,
    help = "Setting this flag causes LDSC to compute LD Scores with the given scale factor, "
    "i.e., \ell_j : =  \sum_k (p_k(1-p_k))^a r^2_{jk}, where p_k denotes the MAF "
    "of SNP j and a is the argument to --pq-exp. ")
"--no-print-annot", default = false, action = "store_true",
    help = "By defualt, seting --cts-bin or --cts-bin-add causes LDSC to print "
    "the resulting annot matrix. Setting --no-print-annot tells LDSC not "
    "to print the annot matrix. ")
"--maf", arg_type = Float64,
    help = "Minor allele frequency lower bound. Default is MAF > 0.")
# Basic Flags for Working with Variance Components
"--ref-ld-chr", arg_type = String,
    help = "Same as --ref-ld, but will automatically concatenate .l2.ldscore files split "
    "across 22 chromosomes. LDSC will automatically append .l2.ldscore/.l2.ldscore.gz "
    "to the filename prefix. If the filename prefix contains the symbol @, LDSC will "
    "replace the @ symbol with chromosome numbers. Otherwise, LDSC will append chromosome "
    "numbers to the end of the filename prefix."
    "Example 1: --ref-ld-chr ld/ will read ld/1.l2.ldscore.gz ... ld/22.l2.ldscore.gz"
    "Example 2: --ref-ld-chr ld/@_kg will read ld/1_kg.l2.ldscore.gz ... ld/22_kg.l2.ldscore.gz")
"--w-ld", arg_type = String,
    help = "Filename prefix for file with LD Scores with sum r^2 taken over SNPs included "
    "in the regression. LDSC will automatically append .l2.ldscore/.l2.ldscore.gz.")
"--w-ld-chr", arg_type = String,
    help = "Same as --w-ld, but will read files split into 22 chromosomes in the same "
    "manner as --ref-ld-chr.")
"--print-coefficients",default = false,action = "store_true",
    help = "when categories are overlapping, print coefficients as well as heritabilities.")
"--frqfile", arg_type = String,
    help = "For use with --overlap-annot. Provides allele frequencies to prune to common "
    "snps if --not-M-5-50 is not set.")
"--frqfile-chr", arg_type = String,
    help = "Prefix for --frqfile files split over chromosome.")
"--no-intercept", action = "store_true",
    help = "If used with --h2, this constrains the LD Score regression intercept to equal "
    "1. If used with --rg, this constrains the LD Score regression intercepts for the h2 "
    "estimates to be one and the intercept for the genetic covariance estimate to be zero.")
"--intercept-gencov", action = "store", default = None,
    help = "Intercepts for constrained-intercept cross-trait LD Score regression."
    " Must have same length as --rg. The first entry is ignored.")
"--M", arg_type = String,
    help = "# of SNPs (if you don\"t want to use the .l2.M files that came with your .l2.ldscore.gz files)")
"--ref-ld-chr-cts", arg_type = String,
    help = "Name of a file that has a list of file name prefixes for cell-type-specific analysis.")
"--print-all-cts", action = "store_true", default = false)

# Flags for both LD Score estimation and h2/gencor estimation
"--print-cov", default = false, action = "store_true",
    help = "For use with --h2/--rg. This flag tells LDSC to print the "
    "covaraince matrix of the estimates.")
"--print-delete-vals", default = false, action = "store_true",
    help = "If this flag is set, LDSC will print the block jackknife delete-values ("
    "i.e., the regression coefficeints estimated from the data with a block removed). "
    "The delete-values are formatted as a matrix with (# of jackknife blocks) rows and "
    "(# of LD Scores) columns.")
# Flags you should almost never use
"--chunk-size", default = 50, arg_type = Int32,
    help = "Chunk size for LD Score calculation. Use the default.")
"--pickle", default = false, action = "store_true",
    help = "Store .l2.ldscore files as pickles instead of gzipped tab-delimited text.")
"--yes-really", default = false, action = "store_true",
    help = "Yes, I really want to compute whole-chromosome LD Score.")
"--invert-anyway", default = false, action = "store_true",
    help = "Force LDSC to attempt to invert ill-conditioned matrices.")
"--not-M-5-50", default = false, action = "store_true",
    help = "This flag tells LDSC to use the .l2.M file instead of the .l2.M_5_50 file.")
"--return-silly-things", default = false, action = "store_true",
    help = "Force ldsc to return silly genetic correlation estimates.")
"--no-check-alleles", default = false, action = "store_true",
    help = "For rg estimation, skip checking whether the alleles match. This check is "
    "redundant for pairs of chisq files generated using munge_sumstats.py and the "
    "same argument to the --merge-alleles flag.")
# transform to liability scale
"--samp-prev",default = None,
    help = "Sample prevalence of binary phenotype (for conversion to liability scale).")
"--pop-prev",default = None,
    help = "Population prevalence of binary phenotype (for conversion to liability scale).")

if __name__  =  =  "__main__":

    args = parser.parse_args()
    if args.out is None:
        raise ValueError("--out is required.")

    log = Logger(args.out+".log")
    try:
        defaults = vars(parser.parse_args(""))
        opts = vars(args)
        non_defaults = [x for x in opts.keys() if opts[x] ! =  defaults[x]]
        header = MASTHEAD
        header + =  "Call: \n"
        header + =  "./ldsc.py \\\n"
        options = ["--"+x.replace("_","-")+" "+String(opts[x])+" \\" for x in non_defaults]
        header + =  "\n".join(options).replace("true","").replace("false","")
        header = header[0:-1]+"\n"
        log.log(header)
        log.log("Beginning analysis at {T}".format(T = time.ctime()))
        start_time = time.time()
        if args.n_blocks < =  1:
            raise ValueError("--n-blocks must be an integer > 1.")
        if args.bfile is not None:
            if args.l2 is None:
                raise ValueError("Must specify --l2 with --bfile.")
            if args.annot is not None and args.extract is not None:
                raise ValueError("--annot and --extract are currently incompatible.")
            if args.cts_bin is not None and args.extract is not None:
                raise ValueError("--cts-bin and --extract are currently incompatible.")
            if args.annot is not None and args.cts_bin is not None:
                raise ValueError("--annot and --cts-bin are currently incompatible.")
            if (args.cts_bin is not None) ! =  (args.cts_breaks is not None):
                raise ValueError("Must set both or neither of --cts-bin and --cts-breaks.")
            if args.per_allele and args.pq_exp is not None:
                raise ValueError("Cannot set both --per-allele and --pq-exp (--per-allele is equivalent to --pq-exp 1).")
            if args.per_allele:
                args.pq_exp = 1

            ldscore(args, log)
        # summary statistics
        elif (args.h2 or args.rg or args.h2_cts) and (args.ref_ld or args.ref_ld_chr) and (args.w_ld or args.w_ld_chr):
            if args.h2 is not None and args.rg is not None:
                raise ValueError("Cannot set both --h2 and --rg.")
            if args.ref_ld and args.ref_ld_chr:
                raise ValueError("Cannot set both --ref-ld and --ref-ld-chr.")
            if args.w_ld and args.w_ld_chr:
                raise ValueError("Cannot set both --w-ld and --w-ld-chr.")
            if (args.samp_prev is not None) ! =  (args.pop_prev is not None):
                raise ValueError("Must set both or neither of --samp-prev and --pop-prev.")

            if not args.overlap_annot or args.not_M_5_50:
                if args.frqfile is not None or args.frqfile_chr is not None:
                    log.log("The frequency file is unnecessary and is being ignored.")
                    args.frqfile = None
                    args.frqfile_chr = None
            if args.overlap_annot and not args.not_M_5_50:
                if not ((args.frqfile and args.ref_ld) or (args.frqfile_chr and args.ref_ld_chr)):
                    raise ValueError("Must set either --frqfile and --ref-ld or --frqfile-chr and --ref-ld-chr")

            if args.rg:
                sumstats.estimate_rg(args, log)
            elif args.h2:
                sumstats.estimate_h2(args, log)
            elif args.h2_cts:
                sumstats.cell_type_specific(args, log)

            # bad flags
        else:
            print header
            print "Error: no analysis selected."
            print "ldsc.py -h describes options."
    except Exception:
        ex_type, ex, tb = sys.exc_info()
        log.log( traceback.format_exc(ex) )
        raise
    finally:
        log.log("Analysis finished at {T}".format(T = time.ctime()) )
        time_elapsed = round(time.time()-start_time,2)
        log.log("Total time elapsed: {T}".format(T = sec_to_str(time_elapsed)))
=#


text:
### A Pluto.jl notebook ###
# v0.16.1

using Markdown
using InteractiveUtils

# ╔═╡ 2742e226-1dff-11ec-3535-3b0f1144e703
using CairoMakie, DataFrames, NetCDF, PlutoUI, Proj4,
Downloads, GeoJSON, GeoMakie, GeoInterface, ClimateModels

# ╔═╡ a1f0b05a-9d7f-4e42-a9c3-955d1e9b33e2
md"""This notebook is a non-official rendering of graphics provided in the following report, published in 2021 by  the _Intergovernmental Panel on Climate Change_. For additional informatin about the plots, please refer to the report.

```
Climate Change 2021
The Physical Science Basis Summary for Policymakers

IPCC, 2021: Summary for Policymakers. In: Climate Change 2021: The Physical Science Basis. Contribution of Working Group I to the Sixth Assessment Report of the Intergovernmental Panel on Climate Change [Masson-Delmotte, V., P. Zhai, A. Pirani, S. L. Connors, C. Péan, S. Berger, N. Caud, Y. Chen, L. Goldfarb, M. I. Gomis, M. Huang, K. Leitzell, E. Lonnoy, J.B.R. Matthews, T. K. Maycock, T. Waterfield, O. Yelekçi, R. Yu and B. Zhou (eds.)]. Cambridge University Press. In Press.
```

## Fig 6 : Changes in annual mean surface temperature, precipitation, and soil moisture.
"""

# ╔═╡ 2c6825ef-bc4b-4e14-bae4-5416588fc652
md"""## Coast Lines / Countries Outline

Here for example we take a look at `countries.geojson`. For more on GeoJSON, see e.g.:

- <https://github.com/simonepri/geo-maps>
- <https://datahub.io/collections/geojson>
- <https://datatracker.ietf.org/doc/html/rfc7946>
- <https://tools.ietf.org/html/rfc7946>
- <https://datahub.io/collections>
"""

# ╔═╡ 421f31f1-0ce8-48b9-8deb-a3cf6e55e357
begin
	url = "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/"
	#https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/countries.geojson
	land = Downloads.download(url * "countries.geojson", IOBuffer())
    land_geo = GeoJSON.read(seekstart(land))
	land_geo.features[1]
end

# ╔═╡ 4ea7e47d-cb3d-4e01-ab89-0946839530ab
pth=joinpath(IPCC_SPM_path,"spm/spm_05/v20210809/")

# ╔═╡ 19700040-a506-4c49-b695-01bb0aafe242
begin
	readme="Readme_for_figure_SPM5.txt"
	lst=readdir(pth)
	fil="Panel_a2_Simulated_temperature_change_at_1C.nc"

	function prep_proj_etc()
		source=Proj4.Projection("+proj=longlat +datum=WGS84")
		dest=Proj4.Projection("+proj=eqearth +lon_0=200.0 +lat_1=0.0 +x_0=0.0 +y_0=0.0 +ellps=GRS80")

		lon = Float64.(NetCDF.open(joinpath(pth,fil), "lon")[:])
		lat = Float64.(NetCDF.open(joinpath(pth,fil), "lat")[:])
		tas = Float64.(NetCDF.open(joinpath(pth,fil), "tas")[:,:,1])

		tmp=(;lon,lat)
		lon=[tmp.lon[i] for i in 1:length(tmp.lon), j in 1:length(tmp.lat)]
		lat=[tmp.lat[j] for i in 1:length(tmp.lon), j in 1:length(tmp.lat)]

		xy=Proj4.transform(source, dest, [vec(lon) vec(lat)])
		x=xy[:,1]
		y=xy[:,2]

		x=reshape(x,size(lon))
		y=reshape(y,size(lon))

		x=circshift(x, (-20,0))
		y=circshift(y, (-20,0))
		z=circshift(tas, (-20,0))

		return lon,lat,tas,source,dest,x,y,z
	end

	lon,lat,tas,source,dest,x,y,z=prep_proj_etc();

	md"""## Retrieve Data From NetCDF File

	- `lon,lat,tas` is original data
	- `x,y,z` is after geo projection
	- `source,dest` defines projection

	Information about the files and their content is provided just below.
	"""
end

# ╔═╡ 8f981e09-471a-4962-a9d3-89517ca36a1e
#code adapted from https://lazarusa.github.io/BeautifulMakie/
let
	projection_choice=1

	projection_choice==1 ? dx=-180 : dx=-20
	lons = circshift(lon[:,1],dx)
	lats = lat[1,:]
	field = circshift(tas,(dx,0))
	field=0.5*floor.(2*field,digits=0)
	cmap=:Reds_9

	txt_source="+proj=longlat +datum=WGS84"
	txt_dest="+proj=eqearth +lon_0=200.0 +lat_1=0.0 +x_0=0.0 +y_0=0.0 +ellps=GRS80"
	if projection_choice==2
		trans = Proj4.Transformation(txt_source,txt_dest, always_xy=true)
	else
		trans = Proj4.Transformation("+proj=longlat +datum=WGS84", "+proj=wintri", always_xy=true)
	end
	#+proj=wintri, natearth2

	ptrans = Makie.PointTrans{2}(trans)
	fig = Figure(resolution = (1200,800), fontsize = 22)
	ax = Axis(fig[1,1], aspect = DataAspect(), title = "Simulated change at 1 °C global warming")
	# all input data coordinates are projected using this function
	ax.scene.transformation.transform_func[] = ptrans
	# add some limits, still it needs to be manual
	points = [Point2f0(lon, lat) for lon in lons, lat in lats]
	rectLimits = FRect2D(Makie.apply_transform(ptrans, points))
	limits!(ax, rectLimits)

	hm1 = surface!(ax, lons, lats, field, shading = false, overdraw = false,
	colorrange=(0.0,6.0), colormap=cmap)

	hm2 = lines!(ax, GeoMakie.coastlines(), color = :black, overdraw = true)

	#Colorbar(fig[1,2], hm1, height = Relative(0.65))

	##
	if projection_choice==1
		lonrange = -180:60:180
	else
		lonrange = collect(20.0:60:380); lonrange[end]-=0.0001
	end
	latrange = -90.0:30:90

	lonlines = [Point2f0(j,i) for i in lats, j in lonrange]
	latlines = [Point2f0(j,i) for j in lons, i in latrange]

	[lines!(ax, lonlines[:,i], color = (:black,0.25),
	 linestyle = :dash, overdraw = true) for i in 1:size(lonlines)[2]]
	[lines!(ax, latlines[:,i], color = (:black,0.25), linestyle = :dash,
	 overdraw = true) for i in 1:size(latlines)[2]]

	xticks = first.(trans.(Point2f0.(lonrange, -90)))
	yticks = last.(trans.(Point2f0.(-180,latrange)))
	ax.xticks = (xticks, string.(lonrange, 'ᵒ'))
	ax.yticks = (yticks, string.(latrange, 'ᵒ'))

	# hide just original grid
	hidedecorations!(ax, ticks = false, label = false, ticklabels=false)
	hidespines!(ax)

	##

	#save(joinpath(@__DIR__, "change_at_1C.png"), fig) # HIDE

	fig
end

# ╔═╡ 66b17846-ea43-4821-8a67-6357d68fc18b
begin
	with_terminal() do
		println("### 1 [/3] README file : \n\n")
		println.(readlines(joinpath(pth,readme)))
		println("\n\n### 2 [/3] file list : \n\n")
		println.(lst)
		println("\n\n### 3 [/3] sample file  : $(fil) \n\n")
		println(ncinfo(joinpath(pth,fil)))
	end
end

# ╔═╡ d1068bfe-ee9d-4632-b0b2-48618b510c7f
md"""## Mapping / Geographic Projection

`GeoMakie.jl` uses a file of the same format, `geojson`, to allow us to plot the World Ocean coast lines. The plotting recipe used here builds upon <https://lazarusa.github.io/BeautifulMakie/>.
For more on Julia packages, see:

- Makie.jl, [GeoMakie.jl](https://github.com/JuliaPlots/GeoMakie.jl), GeoJSON.jl, LibGEOS.jl
- [BeautifulMakie](https://lazarusa.github.io/BeautifulMakie/GeoPlots/geoFieldCountries/)

!!! note
	GeoJSON splits polygons at the dateline. This makes it easier to stick with -180 to 180 range for longitude. Otherwise there will be a need to split polygons again (see `projection_choice=2` below)
"""

# ╔═╡ f4de1ad9-923a-4b8c-9719-6565505dd2a1
md"""## Earlier Plots

The method below applies the transformation outside of Makie. Works for arbitrary choice of centrl longitude (but does not resolve the GeoJSON issue).
"""

# ╔═╡ 36b849eb-8195-406e-95a1-a4afa4162907
"""
    proj_map(B::NamedTuple)

Geographic projection map
"""
function proj_map(z,rng=[0.0,2.0])

	col=deepcopy(z)
    msk=findall(isnan.(z))
	col[msk].=Inf
	cmap=:Reds_9

	##

	f = Figure(resolution = (900, 600))
	ax = Axis(f[1,1], title="Change in global surface temperature", ylabel="degree C")

	surface!(ax,x,y,0*x; color=col,colorrange = rng,colormap=cmap,
		shading = false, scale_plot = false, axis = (xticks = [0.0],))

	##

    ii=[i for i in -180:45:180, j in -78.5:1.0:78.5]';
    jj=[j for i in -180:45:180, j in -78.5:1.0:78.5]';
    xl=vcat([[ii[:,i]; NaN] for i in 1:size(ii,2)]...)
    yl=vcat([[jj[:,i]; NaN] for i in 1:size(ii,2)]...)
    tmp=Proj4.transform(source, dest,[xl[:] yl[:]])
    xl=tmp[:,1]; yl=tmp[:,2]
    lines!(xl,yl, color = :gray, linewidth = 2)

    tmp=circshift(-179.5:1.0:179.5,(-200))
    ii=[i for i in tmp, j in -75:15:75];
    jj=[j for i in tmp, j in -75:15:75];
    xl=vcat([[ii[:,i]; NaN] for i in 1:size(ii,2)]...)
    yl=vcat([[jj[:,i]; NaN] for i in 1:size(ii,2)]...)
    tmp=Proj4.transform(source, dest,[xl[:] yl[:]])
    xl=tmp[:,1]; yl=tmp[:,2]
    lines!(ax,xl,yl, color = :gray, linewidth = 2)

	##

    hidespines!(ax)
    hidedecorations!.(ax)

	Colorbar(f[1, 2], colorrange = rng,colormap=cmap)

    return f
end

# ╔═╡ e741c445-9880-4412-b879-9272d999bf49
let
	col=deepcopy(z)
    msk=findall(isnan.(z))
	col[msk].=Inf
	rng=(0.0,2.0)

	fig1b = Figure(resolution = (900, 600))
	fig1b_ax2 = Axis(fig1b[1,1], title="Change in global surface temperature", ylabel="degree C")

	surface!(x,y,z,colorrange = rng,colormap=:hot)
	Colorbar(fig1b[1, 2], colorrange = rng,colormap=:hot)

	fig1b
end

# ╔═╡ 7bf0cac6-44ef-4e80-b8fa-32f669f73008
begin
	zz=0.5*round.(2*z,digits=0)
	proj_map(zz,(0.0,6.0))
end

# ╔═╡ 00000000-0000-0000-0000-000000000001
PLUTO_PROJECT_TOML_CONTENTS = """
[deps]
CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
ClimateModels = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
GeoJSON = "61d90e0f-e114-555e-ac52-39dfb47a3ef9"
GeoMakie = "db073c08-6b98-4ee5-b6a4-5efafb3259c6"
NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9"
PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
Proj4 = "9a7e659c-8ee8-5706-894e-f68f43bc57ea"

[compat]
CairoMakie = "~0.6.5"
ClimateModels = "~0.1.19"
DataFrames = "~1.2.2"
GeoInterface = "~0.5.5"
GeoJSON = "~0.5.1"
GeoMakie = "~0.2.2"
NetCDF = "~0.11.3"
PlutoUI = "~0.7.10"
Proj4 = "~0.7.6"
"""

# ╔═╡ 00000000-0000-0000-0000-000000000002
PLUTO_MANIFEST_TOML_CONTENTS = """
# This file is machine-generated - editing it directly is not advised

julia_version = "1.6.2"
manifest_format = "2.0"

[[deps.AWS]]
deps = ["Base64", "Compat", "Dates", "Downloads", "GitHub", "HTTP", "IniFile", "JSON", "MbedTLS", "Mocking", "OrderedCollections", "Retry", "Sockets", "URIs", "UUIDs", "XMLDict"]
git-tree-sha1 = "edd645e3ca91a3b0c64add9dafa91c568cabda6e"
uuid = "fbe9abb3-538b-5e4e-ba9e-bc94f4f92ebc"
version = "1.67.0"

[[deps.AbstractFFTs]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "485ee0867925449198280d4af84bdb46a2a404d0"
uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
version = "1.0.1"

[[deps.AbstractTrees]]
git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
version = "0.3.4"

[[deps.Adapt]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "84918055d15b3114ede17ac6a7182f68870c16f7"
uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
version = "3.3.1"

[[deps.Animations]]
deps = ["Colors"]
git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d"
uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
version = "0.4.1"

[[deps.ArgTools]]
uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"

[[deps.ArrayInterface]]
deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"]
git-tree-sha1 = "b8d49c34c3da35f220e7295659cd0bab8e739fed"
uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
version = "3.1.33"

[[deps.Artifacts]]
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"

[[deps.Automa]]
deps = ["Printf", "ScanByte", "TranscodingStreams"]
git-tree-sha1 = "d50976f217489ce799e366d9561d56a98a30d7fe"
uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
version = "0.8.2"

[[deps.AxisAlgorithms]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7"
uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
version = "1.0.1"

[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"

[[deps.Blosc]]
deps = ["Blosc_jll"]
git-tree-sha1 = "84cf7d0f8fd46ca6f1b3e0305b4b4a37afe50fd6"
uuid = "a74b3585-a348-5f62-a45c-50e91977d574"
version = "0.7.0"

[[deps.Blosc_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "e747dac84f39c62aff6956651ec359686490134e"
uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9"
version = "1.21.0+0"

[[deps.Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c3598e525718abcc440f69cc6d5f60dda0a1b61e"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
version = "1.0.6+5"

[[deps.CEnum]]
git-tree-sha1 = "215a9aa4a1f23fbd05b92769fdd62559488d70e9"
uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
version = "0.4.1"

[[deps.CFTime]]
deps = ["Dates", "Printf"]
git-tree-sha1 = "bca6cb6ee746e6485ca4535f6cc29cf3579a0f20"
uuid = "179af706-886a-5703-950a-314cd64e0468"
version = "0.1.1"

[[deps.CSV]]
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"]
git-tree-sha1 = "567d865fc5702dc094e4519daeab9e9d44d66c63"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.9.6"

[[deps.Cairo]]
deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b"
uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
version = "1.0.5"

[[deps.CairoMakie]]
deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "SHA", "StaticArrays"]
git-tree-sha1 = "8664989955daccc90002629aa80193e44893bb45"
uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
version = "0.6.5"

[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "e2f47f6d8337369411569fd45ae5753ca10394c6"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
version = "1.16.0+6"

[[deps.ChainRulesCore]]
deps = ["Compat", "LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "2f294fae04aa5069a67964a3366e151e09ea7c09"
uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
version = "1.9.0"

[[deps.ClimateModels]]
deps = ["AWS", "CFTime", "CSV", "DataFrames", "Dates", "Downloads", "Git", "NetCDF", "OrderedCollections", "Pkg", "Statistics", "Suppressor", "TOML", "Test", "UUIDs", "Zarr"]
git-tree-sha1 = "f5fddbc90f0edb5d881510d89f09ff965e47da48"
uuid = "f6adb021-9183-4f40-84dc-8cea6f651bb0"
version = "0.1.19"

[[deps.CodecZlib]]
deps = ["TranscodingStreams", "Zlib_jll"]
git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.0"

[[deps.ColorBrewer]]
deps = ["Colors", "JSON", "Test"]
git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4"
uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
version = "0.4.0"

[[deps.ColorSchemes]]
deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"]
git-tree-sha1 = "a851fec56cb73cfdf43762999ec72eff5b86882a"
uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
version = "3.15.0"

[[deps.ColorTypes]]
deps = ["FixedPointNumbers", "Random"]
git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597"
uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
version = "0.11.0"

[[deps.ColorVectorSpace]]
deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"]
git-tree-sha1 = "45efb332df2e86f2cb2e992239b6267d97c9e0b6"
uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
version = "0.9.7"

[[deps.Colors]]
deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40"
uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
version = "0.12.8"

[[deps.Compat]]
deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"]
git-tree-sha1 = "31d0151f5716b655421d9d75b7fa74cc4e744df2"
uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
version = "3.39.0"

[[deps.CompilerSupportLibraries_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"

[[deps.Contour]]
deps = ["StaticArrays"]
git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
version = "0.5.7"

[[deps.CoordinateTransformations]]
deps = ["LinearAlgebra", "StaticArrays"]
git-tree-sha1 = "6d1c23e740a586955645500bbec662476204a52c"
uuid = "150eb455-5306-5404-9cee-2592286d6298"
version = "0.6.1"

[[deps.Crayons]]
git-tree-sha1 = "3f71217b538d7aaee0b69ab47d9b7724ca8afa0d"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
version = "4.0.4"

[[deps.DataAPI]]
git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8"
uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
version = "1.9.0"

[[deps.DataFrames]]
deps = ["Compat", "DataAPI", "Future", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Reexport", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"]
git-tree-sha1 = "d785f42445b63fc86caa08bb9a9351008be9b765"
uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
version = "1.2.2"

[[deps.DataStructures]]
deps = ["Compat", "InteractiveUtils", "OrderedCollections"]
git-tree-sha1 = "7d9d316f04214f7efdbb6398d545446e246eff02"
uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
version = "0.18.10"

[[deps.DataValueInterfaces]]
git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
version = "1.0.0"

[[deps.Dates]]
deps = ["Printf"]
uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"

[[deps.DelimitedFiles]]
deps = ["Mmap"]
uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"

[[deps.DiskArrays]]
git-tree-sha1 = "6a50d800025a1664c99a8e819e0568c75e3ac0c7"
uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3"
version = "0.2.12"

[[deps.Distributed]]
deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"

[[deps.Distributions]]
deps = ["ChainRulesCore", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns"]
git-tree-sha1 = "9809cf6871ca006d5a4669136c09e77ba08bf51a"
uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
version = "0.25.20"

[[deps.DocStringExtensions]]
deps = ["LibGit2"]
git-tree-sha1 = "a32185f5428d3986f47c2ab78b1f216d5e6cc96f"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.8.5"

[[deps.Downloads]]
deps = ["ArgTools", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"

[[deps.EarCut_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d"
uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
version = "2.2.3+0"

[[deps.EllipsisNotation]]
deps = ["ArrayInterface"]
git-tree-sha1 = "8041575f021cba5a099a456b4163c9a08b566a02"
uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949"
version = "1.1.0"

[[deps.Expat_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f"
uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
version = "2.2.10+0"

[[deps.ExprTools]]
git-tree-sha1 = "b7e3d17636b348f005f11040025ae8c6f645fe92"
uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
version = "0.1.6"

[[deps.EzXML]]
deps = ["Printf", "XML2_jll"]
git-tree-sha1 = "0fa3b52a04a4e210aeb1626def9c90df3ae65268"
uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
version = "1.1.0"

[[deps.FFMPEG]]
deps = ["FFMPEG_jll"]
git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8"
uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a"
version = "0.4.1"

[[deps.FFMPEG_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "LibVPX_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
git-tree-sha1 = "3cc57ad0a213808473eafef4845a74766242e05f"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "4.3.1+4"

[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
git-tree-sha1 = "463cb335fa22c4ebacfd1faba5fde14edb80d96c"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
version = "1.4.5"

[[deps.FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea"
uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
version = "3.3.10+0"

[[deps.FileIO]]
deps = ["Pkg", "Requires", "UUIDs"]
git-tree-sha1 = "3c041d2ac0a52a12a27af2782b34900d9c3ee68c"
uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
version = "1.11.1"

[[deps.FilePathsBase]]
deps = ["Dates", "Mmap", "Printf", "Test", "UUIDs"]
git-tree-sha1 = "7fb0eaac190a7a68a56d2407a6beff1142daf844"
uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
version = "0.9.12"

[[deps.FillArrays]]
deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"]
git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
version = "0.12.7"

[[deps.FixedPointNumbers]]
deps = ["Statistics"]
git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc"
uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
version = "0.8.4"

[[deps.Fontconfig_jll]]
deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "35895cf184ceaab11fd778b4590144034a167a2f"
uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
version = "2.13.1+14"

[[deps.Formatting]]
deps = ["Printf"]
git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8"
uuid = "59287772-0a20-5a39-b81b-1366585eb4c0"
version = "0.4.2"

[[deps.FreeType]]
deps = ["CEnum", "FreeType2_jll"]
git-tree-sha1 = "cabd77ab6a6fdff49bfd24af2ebe76e6e018a2b4"
uuid = "b38be410-82b0-50bf-ab77-7b57e271db43"
version = "4.0.0"

[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "cbd58c9deb1d304f5a245a0b7eb841a2560cfec6"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.10.1+5"

[[deps.FreeTypeAbstraction]]
deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "StaticArrays"]
git-tree-sha1 = "19d0f1e234c13bbfd75258e55c52aa1d876115f5"
uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
version = "0.9.2"

[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91"
uuid = "559328eb-81f9-559d-9380-de523a88c83c"
version = "1.0.10+0"

[[deps.Future]]
deps = ["Random"]
uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"

[[deps.GeoInterface]]
deps = ["RecipesBase"]
git-tree-sha1 = "38a649e6a52d1bea9844b382343630ac754c931c"
uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
version = "0.5.5"

[[deps.GeoJSON]]
deps = ["GeoInterface", "JSON3"]
git-tree-sha1 = "4764da92d333658552b2bedc9f6b379f017c727b"
uuid = "61d90e0f-e114-555e-ac52-39dfb47a3ef9"
version = "0.5.1"

[[deps.GeoMakie]]
deps = ["Colors", "GeoInterface", "GeoJSON", "GeometryBasics", "ImageMagick", "Makie", "Reexport", "StructArrays"]
git-tree-sha1 = "bf73529975a99034667d5039ccb100e2af6e0440"
uuid = "db073c08-6b98-4ee5-b6a4-5efafb3259c6"
version = "0.2.2"

[[deps.GeometryBasics]]
deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"]
git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c"
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
version = "0.4.1"

[[deps.Gettext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"]
git-tree-sha1 = "8c14294a079216000a0bdca5ec5a447f073ddc9d"
uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
version = "0.20.1+7"

[[deps.Git]]
deps = ["Git_jll"]
git-tree-sha1 = "d7bffc3fe097e9589145493c08c41297b457e5d0"
uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2"
version = "1.2.1"

[[deps.GitHub]]
deps = ["Base64", "Dates", "HTTP", "JSON", "MbedTLS", "Sockets", "SodiumSeal"]
git-tree-sha1 = "c8594dff1ed76e232d8063b2a2555335900af6f3"
uuid = "bc5e4493-9b4d-5f90-b8aa-2b2bcaad7a26"
version = "5.7.0"

[[deps.Git_jll]]
deps = ["Artifacts", "Expat_jll", "Gettext_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "33be385f3432a5a5b7f6965af9592d4407f3167f"
uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb"
version = "2.31.0+0"

[[deps.Glib_jll]]
deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "04690cc5008b38ecbdfede949220bc7d9ba26397"
uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
version = "2.59.0+4"

[[deps.Graphics]]
deps = ["Colors", "LinearAlgebra", "NaNMath"]
git-tree-sha1 = "1c5a84319923bea76fa145d49e93aa4394c73fc2"
uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
version = "1.1.1"

[[deps.Graphite2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011"
uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
version = "1.3.14+0"

[[deps.GridLayoutBase]]
deps = ["GeometryBasics", "InteractiveUtils", "Match", "Observables"]
git-tree-sha1 = "e2f606c87d09d5187bb6069dab8cee0af7c77bdb"
uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
version = "0.6.1"

[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
version = "1.0.2"

[[deps.HDF5_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "fd83fa0bde42e01952757f01149dd968c06c4dba"
uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
version = "1.12.0+1"

[[deps.HTTP]]
deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"]
git-tree-sha1 = "14eece7a3308b4d8be910e265c724a6ba51a9798"
uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
version = "0.9.16"

[[deps.HarfBuzz_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Gettext_jll", "Glib_jll", "Graphite2_jll", "ICU_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"]
git-tree-sha1 = "90bed5fc61d12d10832ebf988988104888eebaca"
uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
version = "2.6.1+10"

[[deps.HypertextLiteral]]
git-tree-sha1 = "f6532909bf3d40b308a0f360b6a0e626c0e263a8"
uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2"
version = "0.9.1"

[[deps.ICU_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6ce9cf3c5490b045710d60ac3fd2fe48188846b3"
uuid = "a51ab1cf-af8e-5615-a023-bc2c838bba6b"
version = "67.1.0+3"

[[deps.IfElse]]
git-tree-sha1 = "28e837ff3e7a6c3cdb252ce49fb412c8eb3caeef"
uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
version = "0.1.0"

[[deps.ImageCore]]
deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"]
git-tree-sha1 = "9a5c62f231e5bba35695a20988fc7cd6de7eeb5a"
uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
version = "0.9.3"

[[deps.ImageIO]]
deps = ["FileIO", "Netpbm", "OpenEXR", "PNGFiles", "TiffImages", "UUIDs"]
git-tree-sha1 = "13c826abd23931d909e4c5538643d9691f62a617"
uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
version = "0.5.8"

[[deps.ImageMagick]]
deps = ["FileIO", "ImageCore", "ImageMagick_jll", "InteractiveUtils", "Libdl", "Pkg", "Random"]
git-tree-sha1 = "5bc1cb62e0c5f1005868358db0692c994c3a13c6"
uuid = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
version = "1.2.1"

[[deps.ImageMagick_jll]]
deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pkg", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "ea2b6fd947cdfc43c6b8c15cff982533ec1f72cd"
uuid = "c73af94c-d91f-53ed-93a7-00f77d67a9d7"
version = "6.9.12+0"

[[deps.Imath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "87f7662e03a649cffa2e05bf19c303e168732d3e"
uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
version = "3.1.2+0"

[[deps.IndirectArrays]]
git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
version = "1.0.0"

[[deps.Inflate]]
git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c"
uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
version = "0.1.2"

[[deps.IniFile]]
deps = ["Test"]
git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8"
uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f"
version = "0.5.0"

[[deps.InlineStrings]]
deps = ["Parsers"]
git-tree-sha1 = "19cb49649f8c41de7fea32d089d37de917b553da"
uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
version = "1.0.1"

[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c"
uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
version = "2018.0.3+2"

[[deps.InteractiveUtils]]
deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"

[[deps.Interpolations]]
deps = ["AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
git-tree-sha1 = "61aa005707ea2cebf47c8d780da8dc9bc4e0c512"
uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
version = "0.13.4"

[[deps.IntervalSets]]
deps = ["Dates", "EllipsisNotation", "Statistics"]
git-tree-sha1 = "3cc368af3f110a767ac786560045dceddfc16758"
uuid = "8197267c-284f-5f27-9208-e0e47529a953"
version = "0.5.3"

[[deps.InvertedIndices]]
git-tree-sha1 = "bee5f1ef5bf65df56bdd2e40447590b272a5471f"
uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f"
version = "1.1.0"

[[deps.IrrationalConstants]]
git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
version = "0.1.1"

[[deps.Isoband]]
deps = ["isoband_jll"]
git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137"
uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
version = "0.1.1"

[[deps.IterTools]]
git-tree-sha1 = "05110a2ab1fc5f932622ffea2a003221f4782c18"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
version = "1.3.0"

[[deps.IteratorInterfaceExtensions]]
git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
uuid = "82899510-4779-5014-852e-03e436cf321d"
version = "1.0.0"

[[deps.JLLWrappers]]
deps = ["Preferences"]
git-tree-sha1 = "642a199af8b68253517b80bd3bfd17eb4e84df6e"
uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
version = "1.3.0"

[[deps.JSON]]
deps = ["Dates", "Mmap", "Parsers", "Unicode"]
git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37"
uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
version = "0.21.2"

[[deps.JSON3]]
deps = ["Dates", "Mmap", "Parsers", "StructTypes", "UUIDs"]
git-tree-sha1 = "7d58534ffb62cd947950b3aa9b993e63307a6125"
uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
version = "1.9.2"

[[deps.JpegTurbo_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943"
uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
version = "2.1.0+0"

[[deps.KernelDensity]]
deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"]
git-tree-sha1 = "591e8dc09ad18386189610acafb970032c519707"
uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
version = "0.6.3"

[[deps.LAME_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c"
uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
version = "3.100.1+0"

[[deps.LZO_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6"
uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
version = "2.10.1+0"

[[deps.LaTeXStrings]]
git-tree-sha1 = "c7f1c695e06c01b95a67f0cd1d34994f3e7db104"
uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
version = "1.2.1"

[[deps.LazyArtifacts]]
deps = ["Artifacts", "Pkg"]
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"

[[deps.LibCURL]]
deps = ["LibCURL_jll", "MozillaCACerts_jll"]
uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"

[[deps.LibCURL_jll]]
deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"]
uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"

[[deps.LibGit2]]
deps = ["Base64", "NetworkOptions", "Printf", "SHA"]
uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"

[[deps.LibSSH2_jll]]
deps = ["Artifacts", "Libdl", "MbedTLS_jll"]
uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"

[[deps.LibVPX_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "12ee7e23fa4d18361e7c2cde8f8337d4c3101bc7"
uuid = "dd192d2f-8180-539f-9fb4-cc70b1dcf69a"
version = "1.10.0+0"

[[deps.Libdl]]
uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[[deps.Libffi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "761a393aeccd6aa92ec3515e428c26bf99575b3b"
uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
version = "3.2.2+0"

[[deps.Libgcrypt_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"]
git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae"
uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
version = "1.8.7+0"

[[deps.Libgpg_error_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9"
uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
version = "1.42.0+0"

[[deps.Libiconv_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778"
uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
version = "1.16.1+1"

[[deps.Libmount_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73"
uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
version = "2.35.0+0"

[[deps.Libtiff_jll]]
deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9"
uuid = "89763e89-9b03-5906-acba-b20f662cd828"
version = "4.3.0+0"

[[deps.Libuuid_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066"
uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
version = "2.36.0+0"

[[deps.LinearAlgebra]]
deps = ["Libdl"]
uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[[deps.LogExpFunctions]]
deps = ["ChainRulesCore", "DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
git-tree-sha1 = "34dc30f868e368f8a17b728a1238f3fcda43931a"
uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
version = "0.3.3"

[[deps.Logging]]
uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"

[[deps.Lz4_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "5d494bc6e85c4c9b626ee0cab05daa4085486ab1"
uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
version = "1.9.3+0"

[[deps.MKL_jll]]
deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"]
git-tree-sha1 = "5455aef09b40e5020e1520f551fa3135040d4ed0"
uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
version = "2021.1.1+2"

[[deps.Makie]]
deps = ["Animations", "Base64", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Distributions", "DocStringExtensions", "FFMPEG", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MakieCore", "Markdown", "Match", "MathTeXEngine", "Observables", "Packing", "PlotUtils", "PolygonOps", "Printf", "Random", "RelocatableFolders", "Serialization", "Showoff", "SignedDistanceFields", "SparseArrays", "StaticArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "UnicodeFun"]
git-tree-sha1 = "7e49f989e7c7f50fe55bd92d45329c9cf3f2583d"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
version = "0.15.2"

[[deps.MakieCore]]
deps = ["Observables"]
git-tree-sha1 = "7bcc8323fb37523a6a51ade2234eee27a11114c8"
uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
version = "0.1.3"

[[deps.MappedArrays]]
git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142"
uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
version = "0.4.1"

[[deps.Markdown]]
deps = ["Base64"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"

[[deps.Match]]
git-tree-sha1 = "5cf525d97caf86d29307150fcba763a64eaa9cbe"
uuid = "7eb4fadd-790c-5f42-8a69-bfa0b872bfbf"
version = "1.1.0"

[[deps.MathTeXEngine]]
deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "Test"]
git-tree-sha1 = "70e733037bbf02d691e78f95171a1fa08cdc6332"
uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
version = "0.2.1"

[[deps.MbedTLS]]
deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"]
git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe"
uuid = "739be429-bea8-5141-9913-cc70e7f3736d"
version = "1.0.3"

[[deps.MbedTLS_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"

[[deps.Missings]]
deps = ["DataAPI"]
git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f"
uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
version = "1.0.2"

[[deps.Mmap]]
uuid = "a63ad114-7e13-5084-954f-fe012c677804"

[[deps.Mocking]]
deps = ["Compat", "ExprTools"]
git-tree-sha1 = "29714d0a7a8083bba8427a4fbfb00a540c681ce7"
uuid = "78c3b35d-d492-501b-9361-3d52fe80e533"
version = "0.7.3"

[[deps.MosaicViews]]
deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
git-tree-sha1 = "b34e3bc3ca7c94914418637cb10cc4d1d80d877d"
uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
version = "0.3.3"

[[deps.MozillaCACerts_jll]]
uuid = "14a3606d-f60d-562e-9121-12d972cd8159"

[[deps.NaNMath]]
git-tree-sha1 = "bfe47e760d60b82b66b61d2d44128b62e3a369fb"
uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
version = "0.3.5"

[[deps.NetCDF]]
deps = ["DiskArrays", "Formatting", "NetCDF_jll"]
git-tree-sha1 = "23b0e32fde256a4e2e497e678abcf956ed26204b"
uuid = "30363a11-5582-574a-97bb-aa9a979735b9"
version = "0.11.3"

[[deps.NetCDF_jll]]
deps = ["Artifacts", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Pkg", "Zlib_jll", "nghttp2_jll"]
git-tree-sha1 = "0cf4d1bf2ef45156aed85c9ac5f8c7e697d9288c"
uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3"
version = "400.702.400+0"

[[deps.Netpbm]]
deps = ["FileIO", "ImageCore"]
git-tree-sha1 = "18efc06f6ec36a8b801b23f076e3c6ac7c3bf153"
uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
version = "1.0.2"

[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"

[[deps.Observables]]
git-tree-sha1 = "fe29afdef3d0c4a8286128d4e45cc50621b1e43d"
uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
version = "0.4.0"

[[deps.OffsetArrays]]
deps = ["Adapt"]
git-tree-sha1 = "c0e9e582987d36d5a61e650e6e543b9e44d9914b"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
version = "1.10.7"

[[deps.Ogg_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7937eda4681660b4d6aeeecc2f7e1c81c8ee4e2f"
uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
version = "1.3.5+0"

[[deps.OpenEXR]]
deps = ["Colors", "FileIO", "OpenEXR_jll"]
git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633"
uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
version = "0.3.2"

[[deps.OpenEXR_jll]]
deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "923319661e9a22712f24596ce81c54fc0366f304"
uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
version = "3.1.1+0"

[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"

[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "15003dcb7d8db3c6c857fda14891a539a8f2705a"
uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
version = "1.1.10+0"

[[deps.OpenSpecFun_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1"
uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
version = "0.5.5+0"

[[deps.Opus_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720"
uuid = "91d4177d-7536-5919-b921-800302f37372"
version = "1.3.2+0"

[[deps.OrderedCollections]]
git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c"
uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
version = "1.4.1"

[[deps.PCRE2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"

[[deps.PCRE_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488"
uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc"
version = "8.44.0+0"

[[deps.PDMats]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
git-tree-sha1 = "4dd403333bcf0909341cfe57ec115152f937d7d8"
uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
version = "0.11.1"

[[deps.PNGFiles]]
deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
git-tree-sha1 = "85e3436b18980e47604dd0909e37e2f066f54398"
uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
version = "0.3.10"

[[deps.PROJ_jll]]
deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "LibSSH2_jll", "Libdl", "Libtiff_jll", "MbedTLS_jll", "Pkg", "SQLite_jll", "Zlib_jll", "nghttp2_jll"]
git-tree-sha1 = "2435e91710d7f97f53ef7a4872bf1f948dc8e5f8"
uuid = "58948b4f-47e0-5654-a9ad-f609743f8632"
version = "700.202.100+0"

[[deps.Packing]]
deps = ["GeometryBasics"]
git-tree-sha1 = "1155f6f937fa2b94104162f01fa400e192e4272f"
uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
version = "0.4.2"

[[deps.PaddedViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "646eed6f6a5d8df6708f15ea7e02a7a2c4fe4800"
uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
version = "0.5.10"

[[deps.Pango_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "9a336dee51d20d1ed890c4a8dca636e86e2b76ca"
uuid = "36c8627f-9965-5494-a995-c6b170f724f3"
version = "1.42.4+10"

[[deps.Parsers]]
deps = ["Dates"]
git-tree-sha1 = "98f59ff3639b3d9485a03a72f3ab35bab9465720"
uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
version = "2.0.6"

[[deps.Pixman_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29"
uuid = "30392449-352a-5448-841d-b1acce4e97dc"
version = "0.40.1+0"

[[deps.Pkg]]
deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"

[[deps.PkgVersion]]
deps = ["Pkg"]
git-tree-sha1 = "a7a7e1a88853564e551e4eba8650f8c38df79b37"
uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
version = "0.1.1"

[[deps.PlotUtils]]
deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"]
git-tree-sha1 = "b084324b4af5a438cd63619fd006614b3b20b87b"
uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
version = "1.0.15"

[[deps.PlutoUI]]
deps = ["Base64", "Dates", "HypertextLiteral", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "Suppressor"]
git-tree-sha1 = "26b4d16873562469a0a1e6ae41d90dec9e51286d"
uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8"
version = "0.7.10"

[[deps.PolygonOps]]
git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
version = "0.1.2"

[[deps.PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "a193d6ad9c45ada72c14b731a318bedd3c2f00cf"
uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720"
version = "1.3.0"

[[deps.Preferences]]
deps = ["TOML"]
git-tree-sha1 = "00cfd92944ca9c760982747e9a1d0d5d86ab1e5a"
uuid = "21216c6a-2e73-6563-6e65-726566657250"
version = "1.2.2"

[[deps.PrettyTables]]
deps = ["Crayons", "Formatting", "Markdown", "Reexport", "Tables"]
git-tree-sha1 = "69fd065725ee69950f3f58eceb6d144ce32d627d"
uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
version = "1.2.2"

[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[[deps.ProgressMeter]]
deps = ["Distributed", "Printf"]
git-tree-sha1 = "afadeba63d90ff223a6a48d2009434ecee2ec9e8"
uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
version = "1.7.1"

[[deps.Proj4]]
deps = ["CEnum", "CoordinateTransformations", "PROJ_jll", "StaticArrays"]
git-tree-sha1 = "5f15f1c647b563e49f655fbbfd4e2ade24bd3c64"
uuid = "9a7e659c-8ee8-5706-894e-f68f43bc57ea"
version = "0.7.6"

[[deps.QuadGK]]
deps = ["DataStructures", "LinearAlgebra"]
git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39"
uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
version = "2.4.2"

[[deps.REPL]]
deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"

[[deps.Random]]
deps = ["Serialization"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"

[[deps.Ratios]]
deps = ["Requires"]
git-tree-sha1 = "01d341f502250e81f6fec0afe662aa861392a3aa"
uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
version = "0.4.2"

[[deps.RecipesBase]]
git-tree-sha1 = "44a75aa7a527910ee3d1751d1f0e4148698add9e"
uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
version = "1.1.2"

[[deps.Reexport]]
git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
uuid = "189a3867-3050-52da-a836-e630ba90ab69"
version = "1.2.2"

[[deps.RelocatableFolders]]
deps = ["SHA", "Scratch"]
git-tree-sha1 = "df2be5142a2a3db2da37b21d87c9fa7973486bfd"
uuid = "05181044-ff0b-4ac5-8273-598c1e38db00"
version = "0.1.2"

[[deps.Requires]]
deps = ["UUIDs"]
git-tree-sha1 = "4036a3bd08ac7e968e27c203d45f5fff15020621"
uuid = "ae029012-a4dd-5104-9daa-d747884805df"
version = "1.1.3"

[[deps.Retry]]
git-tree-sha1 = "41ac127cd281bb33e42aba46a9d3b25cd35fc6d5"
uuid = "20febd7b-183b-5ae2-ac4a-720e7ce64774"
version = "0.4.1"

[[deps.Rmath]]
deps = ["Random", "Rmath_jll"]
git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f"
uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
version = "0.7.0"

[[deps.Rmath_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7"
uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
version = "0.3.0+0"

[[deps.SHA]]
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"

[[deps.SIMD]]
git-tree-sha1 = "9ba33637b24341aba594a2783a502760aa0bff04"
uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
version = "3.3.1"

[[deps.SQLite_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "9a0e24b81e3ce02c4b2eb855476467c7b93b8a8f"
uuid = "76ed43ae-9a5d-5a62-8c75-30186b810ce8"
version = "3.36.0+0"

[[deps.ScanByte]]
deps = ["Libdl", "SIMD"]
git-tree-sha1 = "9cc2955f2a254b18be655a4ee70bc4031b2b189e"
uuid = "7b38b023-a4d7-4c5e-8d43-3f3097f304eb"
version = "0.3.0"

[[deps.Scratch]]
deps = ["Dates"]
git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda"
uuid = "6c6a2e73-6563-6170-7368-637461726353"
version = "1.1.0"

[[deps.SentinelArrays]]
deps = ["Dates", "Random"]
git-tree-sha1 = "54f37736d8934a12a200edea2f9206b03bdf3159"
uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c"
version = "1.3.7"

[[deps.Serialization]]
uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"

[[deps.SharedArrays]]
deps = ["Distributed", "Mmap", "Random", "Serialization"]
uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"

[[deps.Showoff]]
deps = ["Dates", "Grisu"]
git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"

[[deps.SignedDistanceFields]]
deps = ["Random", "Statistics", "Test"]
git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9"
uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
version = "0.4.0"

[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"

[[deps.SodiumSeal]]
deps = ["Base64", "Libdl", "libsodium_jll"]
git-tree-sha1 = "80cef67d2953e33935b41c6ab0a178b9987b1c99"
uuid = "2133526b-2bfb-4018-ac12-889fb3908a75"
version = "0.1.1"

[[deps.SortingAlgorithms]]
deps = ["DataStructures"]
git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508"
uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
version = "1.0.1"

[[deps.SparseArrays]]
deps = ["LinearAlgebra", "Random"]
uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[[deps.SpecialFunctions]]
deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
git-tree-sha1 = "793793f1df98e3d7d554b65a107e9c9a6399a6ed"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "1.7.0"

[[deps.StackViews]]
deps = ["OffsetArrays"]
git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
version = "0.1.1"

[[deps.Static]]
deps = ["IfElse"]
git-tree-sha1 = "a8f30abc7c64a39d389680b74e749cf33f872a70"
uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
version = "0.3.3"

[[deps.StaticArrays]]
deps = ["LinearAlgebra", "Random", "Statistics"]
git-tree-sha1 = "3c76dde64d03699e074ac02eb2e8ba8254d428da"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.2.13"

[[deps.Statistics]]
deps = ["LinearAlgebra", "SparseArrays"]
uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"

[[deps.StatsAPI]]
git-tree-sha1 = "1958272568dc176a1d881acb797beb909c785510"
uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
version = "1.0.0"

[[deps.StatsBase]]
deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
git-tree-sha1 = "65fb73045d0e9aaa39ea9a29a5e7506d9ef6511f"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.33.11"

[[deps.StatsFuns]]
deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
git-tree-sha1 = "95072ef1a22b057b1e80f73c2a89ad238ae4cfff"
uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
version = "0.9.12"

[[deps.StructArrays]]
deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"]
git-tree-sha1 = "2ce41e0d042c60ecd131e9fb7154a3bfadbf50d3"
uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
version = "0.6.3"

[[deps.StructTypes]]
deps = ["Dates", "UUIDs"]
git-tree-sha1 = "d24a825a95a6d98c385001212dc9020d609f2d4f"
uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
version = "1.8.1"

[[deps.SuiteSparse]]
deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"

[[deps.Suppressor]]
git-tree-sha1 = "a819d77f31f83e5792a76081eee1ea6342ab8787"
uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb"
version = "0.2.0"

[[deps.TOML]]
deps = ["Dates"]
uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"

[[deps.TableTraits]]
deps = ["IteratorInterfaceExtensions"]
git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
version = "1.0.1"

[[deps.Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"]
git-tree-sha1 = "fed34d0e71b91734bf0a7e10eb1bb05296ddbcd0"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.6.0"

[[deps.Tar]]
deps = ["ArgTools", "SHA"]
uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"

[[deps.TensorCore]]
deps = ["LinearAlgebra"]
git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6"
uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50"
version = "0.1.1"

[[deps.Test]]
deps = ["InteractiveUtils", "Logging", "Random", "Serialization"]
uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[[deps.TiffImages]]
deps = ["ColorTypes", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "OffsetArrays", "OrderedCollections", "PkgVersion", "ProgressMeter"]
git-tree-sha1 = "945b8d87c5e8d5e34e6207ee15edb9d11ae44716"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
version = "0.4.3"

[[deps.TranscodingStreams]]
deps = ["Random", "Test"]
git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.9.6"

[[deps.URIs]]
git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355"
uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
version = "1.3.0"

[[deps.UUIDs]]
deps = ["Random", "SHA"]
uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"

[[deps.Unicode]]
uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"

[[deps.UnicodeFun]]
deps = ["REPL"]
git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
version = "0.4.1"

[[deps.WeakRefStrings]]
deps = ["DataAPI", "InlineStrings", "Parsers"]
git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa"
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
version = "1.4.1"

[[deps.WoodburyMatrices]]
deps = ["LinearAlgebra", "SparseArrays"]
git-tree-sha1 = "9398e8fefd83bde121d5127114bd3b6762c764a6"
uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
version = "0.5.4"

[[deps.XML2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"]
git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a"
uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
version = "2.9.12+0"

[[deps.XMLDict]]
deps = ["EzXML", "IterTools", "OrderedCollections"]
git-tree-sha1 = "d9a3faf078210e477b291c79117676fca54da9dd"
uuid = "228000da-037f-5747-90a9-8195ccbf91a5"
version = "0.4.1"

[[deps.XSLT_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"]
git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a"
uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
version = "1.1.34+0"

[[deps.Xorg_libX11_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527"
uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
version = "1.6.9+4"

[[deps.Xorg_libXau_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e"
uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
version = "1.0.9+4"

[[deps.Xorg_libXdmcp_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4"
uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
version = "1.1.3+4"

[[deps.Xorg_libXext_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3"
uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
version = "1.3.4+4"

[[deps.Xorg_libXrender_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"]
git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96"
uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
version = "0.9.10+4"

[[deps.Xorg_libpthread_stubs_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb"
uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
version = "0.1.0+3"

[[deps.Xorg_libxcb_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6"
uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
version = "1.13.0+3"

[[deps.Xorg_xtrans_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845"
uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
version = "1.4.0+3"

[[deps.Zarr]]
deps = ["AWS", "Blosc", "CodecZlib", "DataStructures", "Dates", "DiskArrays", "HTTP", "JSON", "OffsetArrays", "Pkg"]
git-tree-sha1 = "18ac3fd29790edeee42bfed5020b12ae61a029d0"
uuid = "0a941bbe-ad1d-11e8-39d9-ab76183a1d99"
version = "0.6.3"

[[deps.Zlib_jll]]
deps = ["Libdl"]
uuid = "83775a58-1f1d-513f-b197-d71354ab007a"

[[deps.Zstd_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6"
uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
version = "1.5.0+0"

[[deps.isoband_jll]]
deps = ["Libdl", "Pkg"]
git-tree-sha1 = "a1ac99674715995a536bbce674b068ec1b7d893d"
uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
version = "0.2.2+0"

[[deps.libass_jll]]
deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "acc685bcf777b2202a904cdcb49ad34c2fa1880c"
uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
version = "0.14.0+4"

[[deps.libfdk_aac_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "7a5780a0d9c6864184b3a2eeeb833a0c871f00ab"
uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
version = "0.1.6+4"

[[deps.libpng_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"]
git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.38+0"

[[deps.libsodium_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e"
uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8"
version = "1.0.20+0"

[[deps.libvorbis_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
git-tree-sha1 = "c45f4e40e7aafe9d086379e5578947ec8b95a8fb"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.7+0"

[[deps.nghttp2_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"

[[deps.p7zip_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"

[[deps.x264_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "d713c1ce4deac133e3334ee12f4adff07f81778f"
uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
version = "2020.7.14+2"

[[deps.x265_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "487da2f8f2f0c8ee0e83f39d13037d6bbf0a45ab"
uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
version = "3.0.0+3"
"""

# ╔═╡ Cell order:
# ╟─a1f0b05a-9d7f-4e42-a9c3-955d1e9b33e2
# ╠═2742e226-1dff-11ec-3535-3b0f1144e703
# ╟─8f981e09-471a-4962-a9d3-89517ca36a1e
# ╟─19700040-a506-4c49-b695-01bb0aafe242
# ╟─66b17846-ea43-4821-8a67-6357d68fc18b
# ╟─2c6825ef-bc4b-4e14-bae4-5416588fc652
# ╟─421f31f1-0ce8-48b9-8deb-a3cf6e55e357
# ╟─4ea7e47d-cb3d-4e01-ab89-0946839530ab
# ╟─d1068bfe-ee9d-4632-b0b2-48618b510c7f
# ╟─f4de1ad9-923a-4b8c-9719-6565505dd2a1
# ╟─36b849eb-8195-406e-95a1-a4afa4162907
# ╟─e741c445-9880-4412-b879-9272d999bf49
# ╟─7bf0cac6-44ef-4e80-b8fa-32f669f73008
# ╟─00000000-0000-0000-0000-000000000001
# ╟─00000000-0000-0000-0000-000000000002

max_stars_repo_name: gaelforget/Notebooks

max_issues_repo_name: gaelforget/Notebooks

max_forks_repo_name: gaelforget/Notebooks


text:
"""
appropriate_dims(n₁, n₂, N)
# Description
Create an array of size n₁, with the value N at the location n₂, and ones elswhere
# Arguments
- `n₁`: int | size of the array
- `n₂`: int | location of modification
- `N` : int | value at the modification index n2
# Return
A tuple with all 1's except at location n₂, where it is N
"""
function appropriate_dims(n₁, n₂, N)
    y = ones(Int, n₁)
    y[n₂] = N
    return Tuple(y)
end

max_stars_repo_name: sandreza/FourierCore

max_issues_repo_name: sandreza/FourierCore

max_forks_repo_name: sandreza/FourierCore