teleren/devto huggingface dataset:
Day 948 : I Can't Call It
Tags: hiphop, code, coding, lifelongdev
Published: 2024-04-19 22:13:48

_liner notes_:
- Professional : So, I went to the community channel to see if there were any questions like I normally do and there was a direct message. It was a very nice message saying that the person appreciated the way I was answering questions. That was a good way to start the day. I updated some web samples and a blog post that I wrote with some new updates. Good thing the blog post didn't go live yet. Worked on the project I'm building. Did a LOT of research to book a flight and hotel for an upcoming trip. So many choices and options. I can't call it. It's a lot! haha

- Personal : Last night I finished up the social media posts for the tracks I bought on Bandcamp. Listened to tracks that I wanted to use to start the radio show. Worked on my side project and watched a couple of episodes of "X-Men: The Animated series".

![The image shows a canyon with red and orange-hued rock formations with a river. There is a juniper tree in the foreground on the edge of a cliff. The sky is light blue and there are some clouds. The location is Canyonlands National Park in Moab, Utah, USA.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlsoo9dz4kp9g3a7m4a1.jpg)

Going to finish up putting together the radio show. I want to continue working on my highlight video creator. I'm thinking I'm going to have to upload the archive and then get clips from that. I was thinking I could do it without needing to upload, but I don't think so. I just want to move past this part. I may come back to it and find a way. But I just want to get something working before the study sessions on Sunday.

Have a great night and weekend!

peace piece
Dwane / conshus
https://dwane.io / https://HIPHOPandCODE.com
{% youtube XcQ_0fAJ3Zg %}
DevLog #14 - Sprint Review Meeting
Tags: agile
Published: 2024-04-19 22:00:05

Sprint review meeting is a one of key ceremonies of the scrum Agile methodology and it helps the team to discuss and finalise the progress of the work done within the sprint. Initially, the team will demonstrate the work they have completed to the stakeholders and customers and then get the feedback from them about further suggestions, changes and improvements or clarify the reasons behind the functions which they do not have the idea to the stakeholders. After that based on the feedback and gained insight from the sprint, the product owner will adjust the product backlog.

According to our project, we have been conducting sprint review meetings for 3 sprints up to now. I think we have done a good job up to now in the review meetings and we have improved and groomed our product backlog based on the feedback we received. Based on my point of view, all stakeholders of the project need to contribute to the review meeting and should have an open discussion with the development team. As an example, in our project, we had not included login for the nation admin and our project supervisor explained to us about the usefulness of the login for admin and he explained that we can do it in a very simple way. And he asked us why we have implemented login for nation users and as the development team, we could clarify to him the reason behind it and why it was more important than our backlog items. Then we can consider it as a clarification for the stakeholder. Finally, I can express that the sprint review meeting is a very useful event in the scrum methodology based on my experiences in this project.
即時 批 核 貸款
Published: 2024-04-19 21:45:43

即時批核貸款是指能夠快速獲得批准和放款的貸款方案。這種貸款通常具有高效率和快速處理的特點，適合急需資金或緊急支出的情況。讓我們深入探討這個主題，包括清數貸款、即時借錢、貸款公司、結餘轉戶易批、專業人士貸款、公務員借貸、網上貸款平台、特快批核、大額貸款、業主大額貸款、大額私人貸款、清卡數貸款、業主貸款、低息私人貸款、貸款和私人借錢。

即時批核貸款的優勢和特點
快速放款: 即時批核貸款通常能在申請提交後迅速獲得批准，並在短時間內完成放款程序，使借款人能夠及時獲得所需資金。
**_[即時 批 核 貸款](https://www.funki.com.hk/personal-loan)_**
線上申請: 大多數即時貸款公司提供線上申請平台，借款人可以通過網絡提交貸款申請，節省時間和方便快捷。
無需抵押: 某些即時貸款方案無需抵押或提供擔保，讓借款人更容易獲得貸款資金，而無需擔心抵押品的問題。
多種用途: 即時貸款可以用於各種用途，包括應急支出、支付帳單、應對突發狀況或處理緊急開支。
靈活還款: 部分即時貸款公司提供靈活的還款計劃，允許借款人根據自己的財務狀況選擇合適的還款方式和期限。
清數貸款和結餘轉戶易批
清數貸款是指基於個人的結餘數量來進行貸款的一種方式。這種貸款通常與個人帳戶的結餘或流水相關聯，便於貸款公司評估借款人的還款能力和信用風險。結餘轉戶易批則是指通過轉戶結餘來獲得快速批核的貸款，具有便捷性和高效率的特點。

貸款公司和網上貸款平台
貸款公司提供各種貸款產品，包括即時批核貸款、大額貸款、業主貸款、專業人士貸款等。網上貸款平台則是通過網絡平台提供貸款服務，方便借款人線上申請貸款並處理貸款事務。

特快批核和大額貸款選擇
特快批核貸款是指能夠在短時間內完成貸款批核程序的貸款方案，適合急需資金的情況。大額貸款則是指金額較大的貸款方案，通常需要借款人提供相應的收入證明和信用資料來支持貸款申請。

專業人士和公務員借貸選擇
專業人士貸款和公務員借貸是針對不同人群提供的貸款方案。專業人士貸款通常針對高收入人士或專業人士提供特定的貸款條件和利率優惠。公務員借貸則是針對政府部門或公共機構的工作人員提供的貸款服務，具有較低的利率和較長的還款期限。

總結
即時批核貸款、清數貸款、大額貸款、業主貸款、特快批核貸款等貸款方案為借款人提供了多種選擇，能夠滿足不同的財務需求和用途。網上貸款平台的出現使得借款人能夠更加便捷地申請和處理貸款事務。對於需要借錢解決緊急或特定財務需求的人士來說，這些貸款方案為他們提供了靈活、高效和便捷的解決方案。
Subscription app (part 5)
Tags: webdev, javascript, programming, tutorial
Published: 2024-04-19 21:38:04

In the previous post, I created a login route.

In this post, I'll be creating a user route and a middleware to verify a user.

Before a user can access the profile page after logging in or signing up, a request needs to be sent with the token received to verify the user before getting access to the profile page.

The user route will be a protected route and it'll send the user details. The user needs to sign up or login before hitting the route.

The user route will receive the token, extract the payload from the token, verify it and return the data to the client.

A middleware will be created for this steps.

This middleware intercepts the request to get access to a protected route.

It will extract the token from the request header, verify it and check if the user is authenticated before getting access to a protected route. If the the user is not authenticated, then it will throw an error. 


## Creating the middleware

In the src directory, create a new directory named "middleware."

Then inside it, create a file named "checkAuth.ts"


![auth 1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v2mwintkkel17idavets.png)


![auth 2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3e44y1gdau45f4n2xjr.png)
Create and export a function which takes in the request, response and next parameters

Logic for verifying the token:
1. get the token from the request header (ln 9)
2. check if there's a token (ln 11–19)
3. extract the token (ln 21). 
4. In a try-and-catch block, verify the token with JWT and set a property on the user to have the verified email and catch any errors.( ln 23–41) 


![c-3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nbyykc2n0r4siln91p2r.png)
 Make sure to define the type for Typescript  
 - To define the property for the user in typescript
 - in the project root, create a @types directory, express directory and an index.ts file


![c-4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u1ifqjwz17iyprteji1b.png)
And add the types to the `tsconfig.json ` file.

5. execute the next route (ln 31)



#### Using the middleware...

## Create the user route
In the `auth.ts` file, create a get request for getting the user profile.

And import the middleware.


![using the middleware](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bh787bre79to7pgq576g.png)
- right here, the user route is created with the middleware placed in-between the path and the call-back function
- find the user in the DB (ln 146)
- send the data to the client (ln. 148–157)


#### Testing the code...
In postman:


![testing the user route](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/34qafd60z20fdozhypwx.png)
- create a new GET request
- change the route url 
- login an existing user to get a token
- copy the token and place inside of the header
- send 

Yay! I got the token verified and the user data.

In the next post, I will be setting up Stripe and creating the subs/prices route.
priori
Published: 2024-04-19 21:20:09

```
  void process::Prioridad() {
      //se ordena por prioridad
      node *p = head;
      while (p != nullptr) {
          node *q = p -> next();
          while (q != nullptr) {

              if (q -> prty() > p -> prty()) {

                  char idx = p -> id();
                  int tmex = p -> tme();
                  int prtyx = p -> prty();

                  p -> setid(q -> id());
                  p -> settme(q -> tme());
                  p -> setprty(q -> prty());

                  q -> setid(idx);
                  q -> settme(tmex);
                  q -> setprty(prtyx);

              }
              q = q -> next();
          }
          p = p -> next();
      }


      node *r = head;
      float tR = 0, tRT = 0;
      int Q = calcQ();
      cout << "\n\tId //" << " Tiempo de ejecucion //" << " Prioridad //" << " Tiempo de retorno //" << " Procesos restantes (ID Tiempo Prioridad)" << endl;

      while (r != nullptr) {

            if (r -> tme() <= Q) {
                
          tR += r -> tme();
          tRT += tR;
          cout << "\t"<< r -> id() << "\t\t"<< r -> tme()<< "\t\t"<< r -> prty()<< "\t\t"<< tR<< "\t\t";
          node *t = r -> next();
      while(t != nullptr){
      std::cout << " | " << t -> id() << " " << t -> tme() << " " << t -> prty() << " | ";
      t = t -> next();
            }
          cout << endl;
          r = r -> next();
            }else{
                
            tR += Q;
            r -> settme(r -> tme() - Q);
            r -> setprty(r -> prty() - 1);
            
            node *t = r;
        while(t -> next() != nullptr && t -> next() -> prty() == r -> prty()){
      t = t -> next();
            }
            r -> next(t -> next());
            t -> next(r);
            

            
            
            cout << "\t"<< r -> id() << " no terminado\t\t"<< r -> tme()<< "\t\t"<< r -> prty()<< "\t\t"<< tR<< "\t\t";
         
          cout << endl;
          
            }
          
      }

      cout << "\n\tTiempo promedio: "<< (float)tRT/n<< endl;
      cout << "\n\tQuantum: "<< Q<< endl;
      

  }
```
CSS code for an Earth Day Celebration Landing Page
Tags: frontendchallenge, devchallenge, css, beginners
Published: 2024-04-19 21:19:08

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Earth Day Celebration</title>
<style>
  body {
    font-family: 'Arial', sans-serif;
    background-color: #e4f9f5;
    margin: 0;
    padding: 0;
  }
  .header {
    background-color: #30e3ca;
    color: #fff;
    padding: 20px;
    text-align: center;
  }
  .content {
    padding: 20px;
    text-align: center;
  }
  .footer {
    background-color: #30e3ca;
    color: #fff;
    position: fixed;
    bottom: 0;
    width: 100%;
    text-align: center;
    padding: 10px;
  }
</style>
</head>
<body>
TypeScript utility Refine<T, P>
Tags: typescript, utility, refine, extends
Published: 2024-04-19 20:59:13

## TL;DR

See my [`Refine` Gist](https://gist.github.com/sylvaindethier/0fc4b31d130231aff7bd32091d2474a7).
```ts
export type Refine<T, P extends Partial<T>> = {
  [k in keyof T]: T[k] & P[k];
};
```

## Why ?
For a project I have the need to be able to (kind of) extend a type but keep it's original type. Let me explain.
Say you have a type

```ts
type TheType = {
  aProp: string;
  someOtherProp: unknown;
};
```
But you whish the `aProp` to be a more specific type for example `` `${number}` `` (which is still a `string` type). The `extends` keyword is not restrictive enough (IMO) because it lets you completly override the original type, for example with `boolean`.
So I have to define a [`Refine<T,P>` utility type](https://gist.github.com/sylvaindethier/0fc4b31d130231aff7bd32091d2474a7).

## Example and usage

```ts
type TheType = {
  aProp: string;
  someOtherProp: unknown;
};

type RefinedType = Refine<TheType, {
  aProp: `{$number}`;
}>;
```
The resulting `RefinedType` is:

```ts
type RefinedType = {
  aProp: `${number}`;
  someOtherProp: unknown;
};
```
The Concept of Expansion in the Linux Command Line
Published: 2024-04-19 20:48:44



![Linux Command Line](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3twq4bd3lmtmskpiodys.png)
In this short article, we will be exploring an important concept in linux shell called expansion.

When you type a command and press the Enter key, bash performs several processes upon the argument text before it executes the command. This process is called “expansion”.

Let’s see the different types of expansion within the shell.

1)  **Pathname expansion:** The shell first expands the path (current directory) to get all the files that end with .js (see image below) after which the ls command is performed on the result.

![pathname expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ne167bd4hqxu0i1fteb.png)

2)  **Tilde expansion:** From the example below, the shell expands the tilde (~) sign to get the home directory of the user before executing the echo command on its result.

![tilde expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qzdxr0drl6j9tpxmf71t.png)

3)  **Arithmetic expansion:** From the screenshot below, the shell performs the computation (expansion) before the echo command is executed on its result.

![arithmetic expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etueppqxlohhz0lssdq6.png)

4)  **Brace expansion:** This is the most fascinating expansion. It simplifies complex tasks with just a single command. After expansion, dir-{1..5} becomes dir-1 dir-2 dir-3 dir-4 dir-5, before the mkdir is performed on them, creating 5 directories.

![brace expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2czbhq4hmrfq4hx8n9mi.png)

5) **Parameter expansion:** This is more useful in shell scripts than directly on the command line. It is also known as variables. From the image below, the shell expands $USER to get its value and passes it to the echo command. Use the printenv command to see all variables.

![parameter expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p60slebpzxfnq5o7xwki.png)

6) **Command substitution:** This allows you to use the output of a regular shell command as an expansion. See example below

![command substitution expansion](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/97ykdpxnubtvtuv0m9ao.png)

Lastly for this session, we will discuss a concept called “quoting” used to control expansion performed in shell. It is used to suppress unwanted expansions. There are 2 types of quoting, double and single quotes.

**Double quotes:** This will suppress any kind of special characters usually meant for expansion and treat them as ordinary characters except for $ (dollar), \ (backslash), and ` (back tick) signs.

![double quoting](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10sp30jg0tqljgbq12qi.png)

**Single quotes:** With this, you can suppress all expansions.

![single quoting](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/essrjy3xiftr5se228yh.png)

I hope you learnt about a few of the superpowers that the Linux Shell embodies.

Thanks for your time. Your feedback will be much appreciated.
Type safe SolidJS Router `useParam` utility Type
Tags: solidjs, typescript, useparam, routedefinition
Published: 2024-04-19 20:18:17

## The Type definition
The SolidJS Router `useParam<T>()` is a generic function that returns the current route parameters. To be type safe we have to specify the type of this parameters. The path for the route already defines this type. To be DRY here is a utility Type that extracts this parameters types from the `RouteDefinition`.

The route parameters live in a `RouteDefinition["matchFilters"]` property. We have to extract and convert each of them to `string` type (parameters are always `string` type).

```ts
// The `matchFilters` of a RouteDefinition describes its Params
type RD$matchFilters<RD extends RouteDefinition> = NonNullable<
  RD["matchFilters"]
>;

// Convert a MatchFilter to string type
type MF$toString<MF extends MatchFilter | undefined> =
  MF extends readonly string[]
    ? MF[number]
    : MF extends RegExp
    ? `${string}`
    : MF extends (s: string) => boolean
    ? `${string}`
    : never;

// Params of a RouteDefinition {[keyof matchFilters]: `${any}`}: Extract and Convert each MatchFilter
type RD$Params<RD extends RouteDefinition> = {
  [k in NonNullable<keyof RD$matchFilters<RD>>]: MF$toString<
    RD$matchFilters<RD>[k]
  >;
};
```

Finally we want to be able to specify the type each route parameter using the my [`Refine` utility type](https://gist.github.com/sylvaindethier/0fc4b31d130231aff7bd32091d2474a7) and [`Prettify`](https://www.totaltypescript.com/concepts/the-prettify-helper) them.

```ts
// Refine a defined RouteDefintion
type RD$RouteParams<
  RD extends RouteDefinition,
  tRD extends RouteDefinition = RouteDefinition<RD["path"]>
> = Refine<RD$Params<tRD>, RD$Params<RD>>;

// Refine with user Type and Prettify the result
export type RouteDefinitionParams<
  RD extends RouteDefinition,
  P extends Partial<RD$RouteParams<RD>> = NonNullable<unknown>
> = Prettify<Refine<RD$RouteParams<RD>, P>>;
```

## Example of usage

```ts
const path = "/:aNumberParam";
type TRouteDefinition = RouteDefinition<typeof path>;

type TParams = RouteDefinitionParams<TRouteDefinition>;
// or with refined param Type
type TParams = RouteDefinitionParams<TRouteDefinition, {
  aNumberParam: `${number}`;
}>;

const params = useParams<TParams>();
//    ^? Type is { aNumberParam: `${string}` }
//    ^? Type is { aNumberParam: `${number}` } with refined types
```

## TL;DR
You can find the whole TypeScript defintion for this utility type in my [Gist `solidjs-RouteDefintionParams.d.ts`](https://gist.github.com/sylvaindethier/daf830e610afce09360fff5506a328b1).

What do you think about this utility type ?
How would you improve it ?
Whould you use it or not and why ?

Thank you for reading.
What Good Is a Mobile App?
Tags: development, ios, android, discuss
Published: 2024-04-19 20:16:00

Serious question...

What tasks are mobile apps uniquely good at accomplishing? Why would an organization turn to building a mobile app rather than using a desktop application, email, or web-based application? What can a mobile app do well that nothing else can? 

This is an important question for anyone trying to sell a potential client on the need for a mobile app, or for anyone who wants to design an app people will download - an in-demand app should include features people can't get elsewhere. 

So what needs can only be satisfied with the creation of a mobile app?

Please post your thoughts! Thanks!
nest.js Guard
Published: 2024-04-19 20:09:09

 Guard'lar, NestJS'de bir route handler'ın çalıştırılıp çalıştırılmayacağını belirlemek için kullanılan bir yapıdır. Guard'lar genellikle kimlik doğrulama ve yetkilendirme işlemleri için kullanılır, ancak her türlü özel erişim kontrolü için de kullanılabilirler.

Bir Guard, canActivate adında bir metod içeren bir sınıftır. Bu metod, bir ExecutionContext nesnesi alır ve boolean bir değer veya boolean değer döndüren bir Promise veya Observable döndürür. Eğer canActivate true döndürürse, route handler çalıştırılır. Eğer false döndürürse, route handler engellenir.

İşte basit bir Guard örneği:

```
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class MyGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    // Some custom authentication logic here
    return true;
  }
}
```
Bu Guard'ı bir controller'da kullanmak için @UseGuards() decorator'ını kullanabilirsiniz:

```
@UseGuards(MyGuard)
@Controller('my-route')
export class MyController {
  // ...
}
```
Bu şekilde, MyGuard'ın canActivate metodu her seferinde my-route route'una bir istek geldiğinde çalıştırılır.

Guard'lar ayrıca global olarak da ayarlanabilirler. Bu durumda, Guard tüm uygulama için geçerli olur:

```
async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalGuards(new MyGuard());
  await app.listen(3000);
}
bootstrap();
```
Bu şekilde, MyGuard tüm uygulama için geçerli olacaktır ve her controller'da otomatik olarak uygulanacaktır.
Weekly Updates - Apr 19 2024
Tags: couchbase, community, ai, nosql
Published: 2024-04-19 20:05:27

The weekend is quickly approaching! Here are our updates for this week! 🎉 👋 

- 📺 **Webcast: "Bringing the "Smart City" to Life With Tondo and Couchbase"** - Join us on May 7/8 virtually to learn how Tondo Smart processes vast amount of telemetry data in real time and how they use Couchbase. [*Register for the Webcast here >>*](https://info.couchbase.com/bringing-the-smart-city-to-life-2024may.html)

- 📑 **New Blog - A Guide to Serverless Functions** - Serverless functions have become a popular application development and deployment approach.  [*To read more about what Serverless Functions are and how they work, read our blog here >>*](https://www.couchbase.com/blog/serverless-functions/)

- 📹 **New Video: AI/ML, Laravel Couchbase, & Pushing the Boundaries of Software Development with Babacar Cissé Dia** - Listen in as Nyah Macklin, Couchbase Developer Evangelist, chats with special guest Babacar Cissé Dia about AI, Machine Learning, and more. [*Watch or listen here >>*](https://www.youtube.com/watch?v=dzAAf2x4i78)

- 🔎 **Looking for resources? We got you covered!** Did you know that you can find all kinds of resources in one convenient spot? You can find case studies, whitepapers, videos, blogs, training and more on our website. [*Check out the resources we have available right here >>*](https://www.couchbase.com/resources/?content=customer_usecases)

Have a great weekend!
Drag and Drop file upload with progress bar in ReactJS
Tags: reactproject, fileupload, dnd
Published: 2024-04-19 19:26:55

You know drag and drop file uploads should be provided as the default behavior for input type file. Yet the pioneers of the web never were ever able to provide such functionalities. 

However I've created a project where I successfully implemented drag-and-drop file upload along with a progress bar and that provides you a cloud-uploaded URL as well. 

How cool is that! 

I've used no packages for the implementation of drag and drop upload, here's how! Created a tutorial on that topic to help you grasp the topic in a better way.

{% embed https://www.youtube.com/embed/r6wtq3aZ4Q4 %}

I'm sure you'll like the way I've explained, if you've any doubts at all, make sure to ask questions right away.
Shortest pathfinder in React using BFS
Tags: bfs, pathfinder, shortestpath, dsaanddev
Published: 2024-04-19 19:32:22

Ever imagined your DSA skills could be implemented directly into your development projects? 
Here you are, I've just curated a video where I showcase how to find the shortest path between two nodes avoiding their obstacles.

This pathfinder is created based on the Breadth First Search algorithm from graph. 

{% embed https://www.youtube.com/embed/D5H2HZV7j1Y %}

I've received a lot of positive comments on all the social media combined for this tutorial and I hope for a positive reply from you as well.
MailHippo - HIPAA Compliant Email Platform
Tags: email, encryption, hippa, data
Published: 2024-04-19 19:31:03

MailHippo empowers users to start sending and receiving fully encrypted HIPAA-compliant emails within minutes. Designed for ease of use, MailHippo works with any email provider using your existing email address with no setup or configuration required. It’s simple yet incredibly strong, with AES 256-bit end-to-end encryption, plus encrypted key rings, for industry-leading security both in transit and at rest. And it’s totally mobile-friendly, working well on any smartphone or tablet.

[https://www.mailhippo.com](https://www.mailhippo.com)
Reserved Variables in Liferay Journal Structures
Tags: liferay, webcontent, learnliferay, webdev
Published: 2024-04-19 19:24:32

- RESERVED_ARTICLE_ASSET_TAG_NAMES
- RESERVED_ARTICLE_AUTHOR_COMMENTS
- RESERVED_ARTICLE_AUTHOR_EMAIL_ADDRESS
- RESERVED_ARTICLE_AUTHOR_ID
- RESERVED_ARTICLE_AUTHOR_JOB_TITLE
- RESERVED_ARTICLE_AUTHOR_NAME
- RESERVED_ARTICLE_CREATE_DATE
- RESERVED_ARTICLE_DISPLAY_DATE

View All Reserved Variables in [Liferay web content](https://learnliferay.com/liferay-tutorials/journal-structures-variables-liferay-webcontent/)