diff --git a/2019-05-17-skohub/index.html b/2019-05-17-skohub/index.html new file mode 100644 index 0000000..9ecff04 --- /dev/null +++ b/2019-05-17-skohub/index.html @@ -0,0 +1,295 @@ +SkoHub: Enabling KOS-based content subscription | Skohub Blog

SkoHub: Enabling KOS-based content subscription

May 17, 2019 | Adrian PohlFelix Ostrowski

For a long time, openness movements and initiatives with labels like “Open Access”, “Open Educational Resources” (OER) or “Linked Science” have been working on establishing a culture where scientific or educational resources are by default published with an open license on the web to be read, used, remixed and shared by anybody. With a growing supply of resources on the web, the challenge grows to learn about or find resources relevant for your teaching, studies, or research.

+

In this post, we describe the SkoHub project being carried out in 2019 by the hbz in cooperation with graphthinking GmbH. The project seeks to implement a prototype for a novel approach in syndicating content on the web by combining current web standards for sending notifications and subscribing to feeds with knowledge organization systems (KOS, sometimes also called “controlled vocabularies”).*

+

Current practices and problems

+

What are the present approaches to the problem of finding open content on the web, and what are their limitations?

+

Searching metadata harvested from silos

+

Current approaches for publishing and finding open content on the web are often focused on repositories as the place to publish content. Those repositories then provide (ideally standardized) interfaces for crawlers to collect and index the metadata in order to offer search solutions on top. An established approach for Open Access (OA) articles goes like this:

+
    +
  • Repositories with interfaces for metadata harvesting (OAI-PMH) are set up for scholars to upload their OA publications
  • +
  • Metadata is crawled from those repositories, normalized and loaded into search indexes
  • +
  • Search interfaces are offered to end users
  • +
+

+ + + + Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top. + + +
Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top.
+

+

With this approach, subject-specific filtering is either already done when crawling the data to create a subject-specific index, or when searching the index.

+

Maintenance burden

+

When offering a search interface with this approach, you have to create and maintain a list of sources to harvest:

+
    +
  1. watch out for new relevant sources to be added to your list,
  2. +
  3. adjust your crawler to changes regarding the services’ harvesting interface,
  4. +
  5. homogenize data from different sources to get a consistent search index.
  6. +
+

Furthermore, end users have to know where to find your service to search for relevant content.

+

Off the web

+

Besides being error-prone and requiring resources for keeping up with changes in the repositories, this approach also does not take into account how web standards work. As Van de Sompel and Nelson 2015 (both co-editors of the OAI-PMH specification) phrase it:

+
+

“Conceptually, we have come to see [OAI-PMH] as repository-centric instead of resource-centric or web-centric. It has its starting point in the repository, which is considered to be the center of the universe. Interoperability is framed in terms of the repository, rather than in terms of the web and its primitives. This kind of repository, although it resides on the web, hinders seamless access to its content because it does not fully embrace the ways of the web.”

+
+

In short, the repository metaphor guiding this practice obscures what constitutes the web: resources that are identified by HTTP URIs (Uniform Resource Identifier).

+

Subject-specific subscription to web resources

+

So how could a web- or resource-centric approach to resource discovery by subject look like?

+

Of the web

+

To truly be part of the web, URIs are the most important part: Every resource (e.g. an OER) needs a URL that locates and identifies it. In order to make use of knowledge organization systems on the web, representing a controlled vocabulary using SKOS vocabulary is the best way to go forward: each subject in the vocabulary is identified by a URI. With these prerequisites, anybody can link their resources to subjects from a controlled vocabulary. This can be done e.g. by embedding LRMI, “Learning Resource Metadata Initiative” metadata as JSON-LD into the resource or its description page.

+

+ + + + A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together + + +
A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together
+

+

Web-based subscriptions and notifications

+

So, HTTP URIs for resources and subject are important to transparently publish and thereafter identify and link educational resources, controlled vocabularies and subject on the web. But with URIs as the basic requirement in place, we also get the possibility to utilize further web standards for the discovery of OER. For SkoHub, we make use of Social Web Protocols to build an infrastructure where services can send and subscribe to notifications for subject. The general setup looks as follows:

+
    +
  1. Every element of a controlled vocabulary gets an inbox, identified by a URL.
  2. +
+

+ + + + A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together + + +
A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together
+
+2. Systems can send notifications to the inbox, for example “This is a new resource about this subject”. +
+ + + + A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox + + +
A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox
+
+3. Systems can subscribe to a subject’s inbox and will directly receive a notification as soon as it is received (push approach). +
+ + + + A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox + + +
A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject's inbox
+

+

This infrastructure allows applications

+
    +
  1. to send a notification to a subject’s inbox containing information about and a link to new content about this subject
  2. +
  3. to subscribe to the inbox of a subject from a knowledge organization system in order to receive push updates about new content in real time.
  4. +
+

Here is an example: a teacher is interested in new resources about environmental subjects. She subscribes to the subject via a controlled vocabulary like ISCED-2013 Fields of Education and Training. She then receives updates whenever a colleague publishes a resource that is linked to the subject.

+

+ + + + A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource. + + +
A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource.
+

+

To be really useful, applications for subscribing to content should enable additional filters, to subscribe to combinations of subjects (e.g. “Environment” & “Building and civil engineering”) or to add addtional filters on educational level, license type etc.

+

Advantages

+

This subject-oriented notification/subscription approach to content syndication on the web has many advantages.

+

Push instead of pull +
+With the push approach, you subscribe once and content is coming from different and new sources without the subscriber having to maintain a list of sources. Of course quality control might become an issue. Thus, instead of whitelisting by administering a subscription list one would practice blacklisting by filtering out sources that distribute spam or provide low-quality content.

+

Supporting web-wide publications

+

Being of the web, SkoHub supports publications residing anywhere on the web. While the repository-centric approach favours content in a repository that provides interfaces for harvesting, with SkoHub any web resource can make use of the notification mechanism. Thus, content producers can choose which tool or platform best fits their publishing needs, be it YouTube, a repository, hackmd.io or else. The only requirement is for publications to have a stable URL and, voilà, they can syndicate their content via KOS.

+

Knowledge organization systems are used to their full potential +
+This additional layer to the use of Knowledge Organization Systems makes them much more powerful (“KOS on steroids”) and attractive for potential users.

+

Encouraging creation and use of shared Knowledge Organization Systems across applications +
+In the German OER context it is a recurring theme that people are wishing everybody would use the same controlled vocabularies so that data exchange and aggregation required less mapping. With a SkoHub infrastructure in place, there are big additional incentives on going forward in this direction.

+

Incentive for content producers to add machine-readable descriptions +
+When subject indexing becomes tantamount with notifying interested parties about one’s resources, this means a huge incentive for content producers to describe their resources with structured data doing subject indexing.

+

SkoHub project scope

+

The SkoHub project has four deliverables. While working on the backend infrastructure for receiving and pushing notifications (skohub-pubsub), we also want to provide people with means to publish a controlled vocabulary along with inboxes (skohub-ssg), to link to subjects and send notifications (skohub-editor) and to subscribe to notifications in the browser (skohub-deck).

+

skohub-pubsub: Inboxes and subscriptions +
+Code: https://github.com/hbz/skohub-pubsub +
+This part provides the SkoHub core infrastructure, setting up basic inboxes for subjects plus the ability of subscribing to push subscriptions for each new notification.

+

skohub-ssg: Static site generator for Simple Knowledge Organization Systems +
+Code: https://github.com/hbz/skohub-ssg +
+This part of the project covers the need to easily publish a controlled vocabulary as a SKOS file, with a basic lookup API and a nice HTML view including links to an inbox for each subject.

+

skohub-editor: Describing & linking learning resources, sending notifications +
+Code: https://github.com/hbz/skohub-editor +
+The editor will run in the browser and enable structured description of educational resources published anywhere on the web. It includes validation of the entered content for each field and lookup of controlled values via the API provided by skohub-ssg.

+

skohub-deck: Browser-based subscription to subjects +
+Code: https://github.com/hbz/skohub-deck +
+The SkoHub deck is a proof of concept to show that the technologies developed actually work. It enables people to subscribe to notifications for specific subjects in the browser. The incoming notifications will be shown in a Tweetdeck-like interface.

+

Outlook

+

The project will be completed by end of 2019. We intend to provide updates about the process during the way. Next up, we will explain the technical architecture in more detail, expanding on our use of social web protocols. Furthermore, we will provide updates on the development status of the project.

+
+

* Note that while SkoHub has clear similarities with the “Information-Sharing Pipeline” envisioned in Ilik and Koster 2019 regarding the use of social web protocols on authority data, there is also a fundamental difference: While Ilik and Koster are talking about sharing updates of authority entries themselves (e.g. receiving updates for a person profile to be considered for inclusion in one’s own authority file), SkoHub is about sharing new links to an entry in an authority file or other controlled vocabulary.

+

References

+

de Sompel, Herbert Van / Nelson, Michael L. (2015): Reminiscing About 15 Years of Interoperability Efforts. D-Lib Magazine 21 , no. 11/12. DOI: 10.1045/november2015-vandesompel

+

Ilik, Violeta / Koster, Lukas (2019): Information-Sharing Pipeline, The Serials Librarian, DOI: 10.1080/0361526X.2019.1583045. Preprint: https://doi.org/10.31219/osf.io/hbwf8


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2019-09-27-skohub-vocabs/index.html b/2019-09-27-skohub-vocabs/index.html new file mode 100644 index 0000000..300d2a2 --- /dev/null +++ b/2019-09-27-skohub-vocabs/index.html @@ -0,0 +1,275 @@ +Presenting the SkoHub Vocabs Prototype | Skohub Blog

Presenting the SkoHub Vocabs Prototype

September 27, 2019 | Adrian PohlFelix Ostrowski

We are happy to announce that the SkoHub prototype outlined in our post “SkoHub: Enabling KOS-based content subscription” is now finished. In a series of three post we will report on the outcome by walking through the different components and presenting their features.

+

SkoHub is all about utilizing the power of Knowledge Organization Systems (KOS) to create a publication/subscription infrastructure for Open Educational Resources (OER). Consequently, publishing these KOS on the web according to the standards was the first area of focus for us. We are well aware that there are already plenty of Open Source tools to publish and edit vocabularies based on SKOS, but these are usually monolithic database applications. Our own workflows often involve managing smaller vocabularies as flat files on GitHub, and others seem to also do so.

+

We will thus start this series with SkoHub Vocabs (formerly called “skohub-ssg”), a static site generator that provides integration for a GitHub-based workflow to publish an HTML version of SKOS vocabularies. Check out the JAMStack Best Practices for some thoughts about the advantages of this approach. SkoHub Vocabs – like SkoHub Editor that will be presented in a separate post – is a stand-alone module that can already be helpful on its own, when used without any of the other SkoHub modules.

+

How to publish a SKOS scheme from GitHub with SkoHub Vocabs

+

Let’s take a look at the editing and publishing workflow step by step. We will use SkoHub Vocabs to publish a subject classification for Open Educational Resources. We will use the “Educational Subject Classification” (ESC), that was created for the OER World Map based on ISCED Fields of Education and Training 2013.

+

Step 1: Publish vocab as turtle file(s) on GitHub

+

Currently, a SKOS vocab has to be published in a GitHub repository as one or more Turtle file(s) in order to be processed by SkoHub Vocabs. ESC is already available on GitHub in one Turtle file, so there is nothing to do in this regard. Note that you can also use the static site generator locally, i.e. without GitHub integration; see below for more about this.

+

Step 2: Configure webhook

+

In order to publish a vocabulary from GitHub with SkoHub Vocabs, you have to set up a webhook in GitHub. It goes like this:

+
    +
  1. In the GitHub repo where the vocab resides, go to “Settings” → “Webhooks” and click “Add webhook”
  2. +
+

+ + + Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path. + +
Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path.
+
+2. Enter https://test.skohub.io/build as payload URL, choose application/json as content type and enter the secret. (Please contact us for the secret if you want to try it out.) +
+ + + Screenshot of the Webhook page with input (payload URL and secret). + +
Screenshot of the Webhook page with input (payload URL and secret).
+

+

Step 3: Execute build & error handling

+

For the vocabulary to be built and published on SkoHub, there has to be a new commit in the master branch. So, we have to adjust something in the vocab and push it into the master branch. Looking again at the webhook page in the repo settings, you can see a notice that the build was triggered:

+

+ + + + Screenshot from GitHub Webhook page with information that build was triggered with link to build log. + + +
Screenshot from GitHub Webhook page with information that build was triggered with link to build log.
+

+

However, looking at the build log, an error is shown and the site did not build:

+

+ + + + Screenshot from build log with error message + + +
Screenshot from build log with error message
+

+

Oops, we forgot to check the vocab for syntax errors before triggering the build and there actually is a syntax error in the turtle file. Fixing the syntax in a new commit will automatically trigger a new build:

+

+ + + + Screenshot from build log with error message + + +
Screenshot from build log with error message
+

+

This time the build goes through without errors and, voilà, SkoHub has published a human-readable version of the vocabulary at https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html. SkoHub Static Site Generator also publishes an overview of all the SKOS vocaularies in the GitHub repo.

+

Step 4: Redirect vocab URI to SkoHub

+

As we want the canonical version of ESC to be the one published with SkoHub Vocabs, we need to redirect the namespace URI we defined in the Turtle file to SkoHub. As we used w3id.org for this, we have to make a pull request in the respective repo.

+

+ + + Screenshot of a pull request to redirect ESC to SkoHub + +
Screenshot of a pull request to redirect ESC to SkoHub
+

+

If everything looks good, w3id.org PRs are merged very quickly, in this case it happened an hour later.

+

Result: HTML & JSON-LD representation published with SkoHub & basic GitHub editing workflow

+

As a result, we have published a controlled vocabulary in SKOS under a permanent URI and with a human-readable HTML representation from GitHub with a minimum amount of work. Additionally, the initial Turtle representation is transformed to more developer-friendly JSON-LD. The HTML has a hierarchy view that can be expanded and collapsed at will:

+

+ + + Screenshot of the HTML version of ESC published with SkoHub. + +
Screenshot of the HTML version of ESC published with SkoHub.
+

+

There also is a search field to easily filter the vocabulary:

+

+ + + + Screenshot: Filter the scheme by yping in the search box + + +
Screenshot: Filter the scheme by yping in the search box
+

+

This filter is based on a FlexSearch index that is also built along with the rest of the content. This allows us to implement lookup functionalities without the need for a server-side API. More about this below and in the upcoming post on the SkoHub Editor.

+

Implementation

+

To follow along the more technical aspects, you might want to have SkoHub Vocabs checked out locally:

+
$ git clone https://github.com/hbz/skohub-vocabs
+$ cd skohub-vocabs
+$ npm i
+$ cp .env.example .env
+

The static site generator itself is implemented with Gatsby. One reason for this choice was our good previous experience with React. Another nice feature of Gatsby is that all content is sourced into an in-memory database that is available using GraphQL. While there is certainly a learning curve, this makes the experience of creating a static site not that much different from traditional database-based approaches. You can locally build a vocab as follows:

+
$ cp test/data/systematik.ttl data/
+$ npm run build
+

This will result in a build in public/ directory. Currently, the build is optimized to be served by Apache with Multiviews in order to provide content negotiation. Please note that currently only vocabularies are supported that implement the slash namespace pattern. We will add support for hash URIs in the future.

+

In order to trigger the static site generator from GitHub, a small webhook server based on Koa was implemented. (Why not Express? – It wouldn’t have made a difference.) The webhook server listens for and validates POST requests coming from GitHub, retrieves the data from the corresponding repository and then spins up Gatsby to create the static content.

+

A final word on the FlexSearch index mentioned above. An important use case for vocabularies is to access them from external applications. Using the FlexSearch library and the index pre-built by SkoHub Vocabs, a lookup of vocabulary terms is easy to implement:

+
<script src="https://cdnjs.cloudflare.com/ajax/libs/FlexSearch/0.6.22/flexsearch.min.js"></script>
+
+<script>
+  fetch('https://w3id.org/class/esc/scheme', {
+    headers: { accept: 'text/index'}
+  }).then(response => response.json())
+    .then(serialized => {
+    const index = FlexSearch.create()
+    index.import(serialized)
+    console.log(index.search("philosophy"))
+  })
+</script>
+

Note that currently the index will only return URIs associated with the search term, not the corresponding labels. This will change in a future update.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2020-01-29-skohub-talk-at-swib19/index.html b/2020-01-29-skohub-talk-at-swib19/index.html new file mode 100644 index 0000000..775b41e --- /dev/null +++ b/2020-01-29-skohub-talk-at-swib19/index.html @@ -0,0 +1,11 @@ +SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub | Skohub Blog

SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub

January 29, 2020 | Adrian Pohl

On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in Hamburg (SWIB19).

+

A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2020-03-31-skohub-editor/index.html b/2020-03-31-skohub-editor/index.html new file mode 100644 index 0000000..a44f14c --- /dev/null +++ b/2020-03-31-skohub-editor/index.html @@ -0,0 +1,287 @@ +Presenting the SkoHub Editor | Skohub Blog

Presenting the SkoHub Editor

March 31, 2020 | Adrian PohlFelix Ostrowski


+

Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub Editor demo for an indefinite time. However, the code is still there for anybody to set up their own instance.

+
+

In a previous blog post we presented a first SkoHub module: SkoHub Vocabs. Before talking about another module, first a short summary of the features SkoHub Vocabs offers. Basically, it provides an editorial workflow to publish a SKOS vocabulary on the web which can then be consumed by humans and applications. It builds on git-based online software development platforms (currently GitHub and GitLab are supported) where you maintain a SKOS vocabulary as a Turtle file. This allows you to use all the associated features such as branches and pull requests for a full-fledged review process. With every new commit in a branch, triggered by a webhook, SkoHub Vocabs will build a static site for the vocab – with HTML for human consumption and JSON-LD for consumption by applications.

+

In this post, we present SkoHub Editor (demo, code) that is accompanied by a browser extension. In a nutshell, SkoHub Editor enables the automatic generation of a web form based on a JSON schema, along with the possibility to look up terms in a controlled vocabulary that is published with SkoHub Vocabs. Additionally, metadata generated by the editor can be published using SkoHub PubSub, which we will describe in an upcoming post. Let’s take a look at the specifics by configuring an editor that lets you create JSON-LD describing an open educational resource (OER) on the web.

+

Describing a resource with the browser extension

+

Let’s start with actually using SkoHub Editor. You will have the most comfortable experience when using the SkoHub browser extension that wraps the SkoHub Editor and pre-populates some field in the web form. The browser extension is available both for Firefox and Chrome. Just add the extension to your browser and a little icon will be shown on the right-hand side of your navigation bar:

+

+ + + + The SkoHub extension icon in between other extensions in the Firefox nav bar + + +
The SkoHub extension icon in between other extensions in the Firefox nav bar
+

+

While having any web page open, you can now open the SkoHub editor in your browser to describe that web resource. Let’s use as an example the YouTube video “COVID-19 – 6 Dangerous Coronavirus Myths, Busted by World Health Organization” published recently by the World Economic Forum under a CC-BY license. Open the video in your browser, click on the extension and you will see that several fields are automatically filled out.

+

+ + + + SkoHub extension in the sidebar of the browser with fields 'URL', 'Title' and 'Description' being pre-populated + + +
SkoHub extension in the sidebar of the browser with fields 'URL', 'Title' and 'Description' being pre-populated
+

+

We can now add additional metadata by selecting a type (VideoObject in this case), add a creator, creation date, language etc. As we mentioned, you can look up a subject from a controlled vocabulary for some fields in the web form. You will experience this when inputting content into the fields “Subject”, “License”, “Learning Resource Type”, and “Intended Audience”. For those fields you will get a drop down with suggestions from a controlled vocabulary, e.g. for “Subject” from a German classification of subjects in Higher education that is published with SkoHub Vocabs.

+

+ + + + The string 'gesund' is input in the subject field and several entries with this string from a controlled vocabulary are suggested. + + +
The string 'gesund' is input in the subject field and several entries with this string from a controlled vocabulary are suggested.
+

+

Currently, only the fields “URL”, “Type” and “Title” are obligatory, all other fields are optional. When you think you have described the resource sufficiently, you can click on “Show Preview” in the extension, copy & paste the JSON-LD to the clipboard and include it in the HTML of any web page within a <script type="application/ld+json"> tag.

+

+ + + + Preview of the structured JSON data in the SKoHub extension + + +
Preview of the structured JSON data in the SKoHub extension
+

+

Using the content subscription & publication features of SkoHub, you can furthermore publish the resource via SkoHub PubSub (to be covered in detail in an upcoming post).

+

Configuring the web form with JSON Schema

+

As said above, the SkoHub Extension wraps the SkoHub Editor running at https://skohub.io/editor/. SkoHub Editor is configured with a JSON schema document that is used both to generate appropriate form inputs and to validate the entered content. Thus, the JSON Schema is the central, most crucial part when working with SkoHub Editor. Currently, we are using as default schema a draft schema for OER we created using relevant properties and types from schema.org. With the JSON schema URL, we can now load the web form you already know from the browser extension by providing the link to the schema. Of course, you can just write your own schema to build a web form for your use case.

+

Let’s take a short look at the underlying schema, which we tried to keep as straightforward as possible. Generally, with JSON schema you can specify a number of optional or mandatory properties and what type of input each expects. The "title" of each property will be used as the label for the field in the web form.

+
{
+  "properties": {
+    "name": {
+      "title": "Title",
+      "type": "string"
+    }
+  }
+}
+

It is also possible to allow only values from a predefined list (an enum), which the editor will render as a drop down:

+
{
+  "type": {
+    "title": "Type",
+    "type": "string",
+    "enum": [
+      "AudioObject",
+      "Book",
+      "Course",
+      "CreativeWork",
+      "DataDownload",
+      "ImageObject",
+      "PresentationDigitalDocument",
+      "SoftwareApplication",
+      "VideoObject"
+    ]
+  }
+}
+

Such lists of allowed values can be considered controlled vocabularies, and ideally they should be shared across many data sources. This is where SkoHub Vocabs comes into play. Instead of embedding the list of allowed values into our schema, we can reference a SKOS vocabulary on the web:

+
{
+  "about": {
+    "title": "Subject",
+    "type": "array",
+    "items": {
+      "type": "object",
+      "properties": {
+        "inScheme": {
+          "type": "object",
+          "properties": {
+            "id": {
+              "type": "string",
+              "enum": [
+                "https://w3id.org/kim/hochschulfaechersystematik/scheme"
+              ]
+            }
+          }
+        }
+      },
+      "_widget": "SkohubLookup"
+    }
+  }
+}
+

Notice the custom key _widget in the JSON schema. This will configure the editor to use the specified UI element for the given field. In our example, the SkohubLookup widget is used, which works with all controlled vocabularies that are published with SkoHub Vocabs. All custom JSON schema extensions start with an underscore _ and are used to control the look and feel of the editor; see below for an example for how to hide a field on the form.

+

Finally, to make our data JSON-LD, we also set a mandatory @context property and a default object value for the @context. This makes the editor add it to the document without any user interaction needed.

+
{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "title": "OER",
+  "description": "This is a generic JSON schema for describing an Open Educational Resource with schema.org",
+  "type": "object",
+  "default": {
+    "@context": {
+      "id": "@id",
+      "type": "@type",
+      "@vocab": "http://schema.org/",
+      "skos": "http://www.w3.org/2004/02/skos/core#",
+      "prefLabel": "skos:prefLabel",
+      "inScheme": "skos:inScheme",
+      "Concept": "skos:Concept"
+    }
+  },
+  "properties": {
+    "@context": {
+      "type": "object",
+      "additionalProperties": true,
+      "_display": {
+        "className": "hidden"
+      }
+    }
+}
+

Implementation

+

Of course you can also poke around the editor while running it locally:

+
$ git clone https://github.com/hbz/skohub-editor.git
+$ cd skohub-editor
+$ npm install
+

As is the case with SkoHub Vocabs, the editor is implemented in React. The form components are located in src/components/JSONSchemaForm. In a nutshell, a Form provides data to the various input components:

+
<Form
+  data={{title: 'A title'}}
+  onSubmit={console.log}
+>
+  <Input property="title" />
+  <Textarea property="description" />
+  <button type="submit">Publish</button>
+</Form>
+

Obviously it would be tedious to manually code all the inputs for a given schema. This is where the Builder comes into play. It reads a schema and creates all necessary input components:

+
<Form
+  data={{title: ''}}
+  onSubmit={console.log}
+>
+  <Builder schema={{
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "title": "My JSON schema",
+    "type": "object",
+    "properties": {
+      "title": {
+        "type": "string",
+        "title": "Title"
+      },
+      "description": {
+        "type": "string",
+        "title": "Description",
+        "_widget": "Textarea"
+      }
+    }
+  }} />
+  <button type="submit">Publish</button>
+</Form>
+

The browser extension is essentially a simple wrapper for the editor running at https://skohub.io/editor/, which the extension injects as an iframe into the current page. Additionally, before the iframe is injected, some metadata is scraped from that page. This data is used to pre-populate the editor. This process obviously depends both on the data found in the web page and on the schema the editor is configured to use. YouTube for example uses meta name="description" for data about YouTube itself rather than the actual video, which is described in meta property="og:description". Even if the correct metadata is extracted, there is no guarantee that the schema used to configure the editor even has a description field. In the future, it would be nice to find a possibility to somehow map page metadata to properties in the schema itself.

+

Outlook

+

SkoHub Editor already works very well and can be extremely useful. However, some things are still work in progress and will need some future effort to be improved:

+
    +
  • Using schema.org markup for pre-population: This might sound obvious but we have not implemented it yet, see #17.
  • +
  • Further issues: See also the issues at https://github.com/hbz/skohub-editor/issues for further ideas for improvement.
  • +
+

Furthermore, some work will have to be put into the current default schema and the controlled vocabularies it uses:

+
    +
  • Develop JSON Schema: The JSON Schema definitely is not finished yet. For example, it makes sense to include http://schema.org/keywords in the future for adding arbitrary tags to describe a resource. We plan to develop the schema within the common OER metadata group of DINI AG KIM & Jointly with a focus on describing OER in the German-speaking world.
  • +
  • Improve Vocabularies: For “Learning Resource Type” and “Intended Audience” we are using controlled vocabularies that are not nearly finished but in development at the LRMI Task Group of the Dublin Core Metadata Initiative (DCMI). Trying out the browser extension, you will for instance see that the educational resources types are missing some options. However, we assume that the combination of SkoHub Editor & SkoHub Vocabs makes a pretty nice environment for the development of these vocabularies in an open and transparent process on GitHub or GitLab.
  • +
+

Get involved

+

Please try it out and let us know what doesn’t work or which feature you are missing and also what you like about SkoHub. We are happy about every bug report, suggestion and feature requests for the production version. Get in contact with us via a hypothes.is annotation, GitHub, Email, Mastodon or IRC.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2020-06-25-skohub-pubsub/index.html b/2020-06-25-skohub-pubsub/index.html new file mode 100644 index 0000000..c9dfb6a --- /dev/null +++ b/2020-06-25-skohub-pubsub/index.html @@ -0,0 +1,231 @@ +Presenting SkoHub PubSub | Skohub Blog

Presenting SkoHub PubSub

June 25, 2020 | Adrian PohlFelix Ostrowski


+

Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub PubSub demo server at skohub.io for an indefinite time. However, the code is still there for anybody to set up their own instance.

+
+

In the previous blog posts we have presented SkoHub Vocabs and SkoHub Editor. In the final post of this SkoHub introduction series we will take a deeper look at SkoHub PubSub, the part of SkoHub that brings the novel approach of KOS-based content subscription into the game.

+

Let’s refresh what SkoHub is about by quoting the gist from the project homepage:

+
+

SkoHub supports a novel approach for finding content on the web. The general idea is to extend the scope of Knowledge Organization Systems (KOS) to also act as communication hubs for publishers and information seekers. In effect, SkoHub allows to follow specific subjects in order to be notified when new content about that subject is published.

+
+

Before diving into the technical implementation and protocols used, we provide an example on how this subscription, publication and notification process can be carried out in practice. Although SkoHub PubSub constitutes the core of the SkoHub infrastructure being the module that brings all SkoHub components together, it is not visible to end users by itself but only through applications which send out notifications or subscribe to a specific topic. (This is the great thing about open standards as it also invites everybody to develop new clients for specific use cases!)

+

So, let’s take a look at an example workflow involving SkoHub Editor and the federated microblogging service Mastodon to demonstrate the functionalities.

+

Subscribing to a subject

+

In one of the already mentioned blog posts we exemplarily published the Educational Subjects Classification with SkoHub Vocabs. Now, let’s take a look at a single subject from this classification, e.g. Library, information and archival studies:

+

+ + + + Screenshot of the HTML version of a SKOS concept published with SkoHub. + + +
Screenshot of the HTML version of a SKOS concept published with SkoHub.
+

+

On the left-hand side, you can see the location of the topic in the classification hierarchy. On the right-hand side, there is some basic information on the subject: It has a URI (https://w3id.org/class/esc/n0322), a notation (0322), a preferred label (Library, information and archival studies) and an inbox. This is how the underlying JSON data (e.g. by adding the format suffix .json to the URI) looks like:

+
{
+  "id":"https://w3id.org/class/esc/n0322",
+  "type":"Concept",
+  "followers":"https://skohub.io/followers?subject=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322",
+  "inbox":"https://skohub.io/inbox?actor=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322",
+  "prefLabel":{
+    "en":"Library, information and archival studies"
+  },
+  "notation":[
+    "0322"
+  ],
+  "broader":{
+    "id":"https://w3id.org/class/esc/n032",
+    "prefLabel":{
+      "en":"Journalism and information"
+    }
+  },
+  "inScheme":{
+    "id":"https://w3id.org/class/esc/scheme",
+    "title":{
+      "en":"Educational Subjects Classification"
+    }
+  }
+}
+

Besides the usual SKOS properties, the followers key gives a hint that I can somehow follow this subject. Clicking on the associated URL, I will see a JSON file containing the list of followers of this subject. I am also interested in this topic and want to follow it to receive notifications about new online resources that are published and tagged with this subject. How do I achieve this?

+

As already noted, what I need is an application that speaks ActivityPub. In this case we will use one of the most popular services in the Fediverse: Mastodon. So, I open up my Mastodon client and put the topic URI into the search box:

+

+ + + + Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button + + +
Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button
+

+

I click on the follow button and am now following this subject with my Mastodon account and will receive any updates posted by it.

+

Describing and announcing a resource with SkoHub Editor

+

Let’s now switch into the role of a scholar, teacher, tutor or general interested person who has created an instructive online resource and wants to publish it to all people interested in the topic of “Library, information and archival studies”. In this case, I published a blog post about a talk at SWIB19 – Semantic Web in Libraries Conference and want to share it with others. I somehow need to send a message to the topic’s inbox, in this case I am using the SkoHub Editor (but it could be any other ActivityPub client or even the command line interface from which I publish). For the best user experience I download the SkoHub browser extension (Firefox, Chrome).

+

As the default JSON schema uses another classification, we first have to configure the editor based on a schema that actually makes use of the Educational Subjects Classification. For this, we created a version of the default schema that does so. Now I put it into the extension’s settings:

+

+ + + + Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox + + +
Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox
+

+

Then, I fire up the extension when visiting the web page I like to share and add data to the input form:

+

+ + + + Describing a resource with the SkoHub Editor browser extension + + +
Describing a resource with the SkoHub Editor browser extension
+

+

I select the topic “Library, information and archival studies” from the suggestions in the “subject” field, add information on licensing etc. and click “Publish”. A pop up lets me know that the resource is published to “Library, information and archival studies”. In the background, the description of the resource is sent to the respective topic (it could be more than one) which distributes the information to all its subscribers. Thus, in the end I as a subscriber of the topic will receive a notification of the resource in my Mastodon timeline:

+

+ + + + The toot announcing a resource newly published to a SkoHub topic + + +
The toot announcing a resource newly published to a SkoHub topic
+

+

Protocols and implementation

+

The SkoHub-PubSub server is built in Node.js and implements a subset of ActivityPub, Linked Data Notifications and Webfinger to achieve the behavior described above. On the ActivityPub side, Server to Server Follow and corresponding Undo interactions can be received to handle the subscription mechanism. Non-activity messages are considered Linked Data Notifications and can simply be sent to the inbox of a subject using a POST request with any JSON body. These notifications are considered metadata payload, wrapped in a Create action and distributed to every follower of the corresponding subject again using ActivityPub.

+

As for the internals, MongoDB is used to manage followers lists and an Elasticsearch index is used to keep an archive of all payloads that have been distributed. This archive can be used to search and further explore metadata that has been distributed, e.g. by visualizing the distribution of subjects across all payloads.

+

The most challenging aspects of the implementation were to gain an understanding of Webfinger for user discovery and of the details of message signatures and how to validate them. “How to implement a basic ActivityPub server” was a good guidance here!

+

Outlook

+

We currently consider PubSub the least mature component of SkoHub. In the future, we would like to validate incoming Linked Data Notifications against a JSON schema that should be specific enough to ensure a consistent experience when viewing them e.g. in Mastodon but flexible enough to support additional use cases. We would also like to support ActivityPub on the publication side and Announce activities in order to enable use cases such as mentioning a SkoHub concept on Mastodon. We would really value your input on this!


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2020-10-09-skohub-apconf/index.html b/2020-10-09-skohub-apconf/index.html new file mode 100644 index 0000000..5753438 --- /dev/null +++ b/2020-10-09-skohub-apconf/index.html @@ -0,0 +1,23 @@ +ActivityPub Conference 2020 | Skohub Blog

ActivityPub Conference 2020

October 09, 2020 | Adrian PohlFelix Ostrowski

From 2-5 October the ActivityPub conference happened online where people using the ActivityPub protocol came together to discuss topics all around federated networks and the respective web standards. For presentations, a flipped classroom approach was chosen where talks would be uploaded before the conference and the live part would be Q&A sessions for each talk. On Sunday, there was an additional round of lightning talks and some birds of a feather (bof) sessions where – quite similar to a barcamp session – people interested in a topic could propose a session and meet with likeminded people.

+

The programme with links to the recordings and forum can be viewed at https://conf.activitypub.rocks/#live.

+

On Friday, we had a session about SkoHub. Here is our previously recorded video:

+
+

With regard to creating and maintaining controlled vocabularies and assigning topics, (at least some) people who develop applications for the Fediverse have quite some interest in building on experiences and approaches from the library world. What we learned from our Q&A session is to better prepare next time as there most certainly will be some people who haven’t fully watched the recording or where some time has passed since watching it: Next time we would have some slides ready to recap the basic concepts and some links to point to exemplary implementations and further information.

+

Here are some projects that are dealing with categories, taxonomies in the Fediverse:

+
    +
  • CommonsPub – which builds on experiences from MoodleNet – is working on “[f]ederated taxonomies for topic-based search and discovery across instances.”
  • +
  • The CommonsPub-based HAHA Academy is experimenting with collaboratively created and maintained “taxonomy of all human knowledge”.
  • +
  • LearnAwesome.org helps people in managing and finding learning material online in very different formats. It supports following certain topics.
  • +
  • The “Rebooting Indymedia” project wants to use topic-based channels to create moderation workflows for building independent news sites from decentrally published content.
  • +
  • In a related effort by Trolli Schmittlauch, the problem is addressed how to create a comprehensive hashtag search & subscription in a federated social network. See this paper for details.
  • +
+

In a birds of a feather session about “Topics” and Services we can subscribe to some of the people working on tags, controlled vocabularies etc. came together and had a fruitful exchange, sorting out the different problems and which approaches exist to address them. We are looking forward to further working on SkoHub and discussing common approaches to assigning or following controlled topics in the fediverse.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2020-11-25-swib20-workshop/index.html b/2020-11-25-swib20-workshop/index.html new file mode 100644 index 0000000..a9ab76d --- /dev/null +++ b/2020-11-25-swib20-workshop/index.html @@ -0,0 +1,17 @@ +SkoHub workshop at SWIB20 | Skohub Blog

SkoHub workshop at SWIB20

November 25, 2020 | Adrian PohlSteffen Rörtgen

From 23-27 November the 12th Semantic Web in Libraries Conference took place online. The programme with links to recordings and slides forum can be viewed at https://swib.org/swib20/programme.html.

+

Wednesday was workshop day where Adrian and Steffen offered a SkoHub workshop. They tried out a flipped classroom approach and created several video tutorials and wrote down walkthroughs for the participants to prepare themselves. This did not work out as intended, lesson learned: Always be prepared that a bigger number of participants is not prepared.

+

Here are some links to the materials:

+

A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2021-12-10-skohub-vocabs-workshops/index.html b/2021-12-10-skohub-vocabs-workshops/index.html new file mode 100644 index 0000000..d510729 --- /dev/null +++ b/2021-12-10-skohub-vocabs-workshops/index.html @@ -0,0 +1,48 @@ +SKOS Introduction workshops with SkoHub Vocabs | Skohub Blog

SKOS Introduction workshops with SkoHub Vocabs

December 10, 2021 | Adrian PohlSteffen Rörtgen

We facilitated two workshops in November with the goal to introduce participants into Simple Knowledge Organization System (SKOS) by hands-on learning how to publish a small vocabulary with SkoHub Vocabs. The first one “Eine Einführung in SKOS mit SkoHub Vocabs” was held as a cooperation between the Hochschulbibliothekszentrum NRW and the Göttingen eResearch Alliance with 14 German-speaking participants on 2021-11-02, see the workshop pad and the slides.

+

As the workshop worked quite well, we applied the same approach to our Workshop “An Introduction to SKOS with SkoHub-Vocabs” on 2021-11-30 at SWIB21 (slides) with around 20 participants.

+

+ + + First slide of the SKOS introduction workshop at SWIB21 + +
First slide of the SKOS introduction workshop at SWIB21
+

+

Generally, we had the impression that participants of both workshops where having a good time, at least nobody left the conference room before the end of the workshop. Here are some notes and lessons learned we collected after the SWIB workshop:

+
    +
  • We invited participants to share their screen to not be talking to the void. Around 4-5 participants followed our invitation which was ok for us.
  • +
  • Many participants joined without their microphones connected. We missed to explicitly ask them to turn their mics on.
  • +
  • We introduced ourselves and used the BigBlueButton poll feature to get to know the participants and their previous experience bit more.
  • +
  • We divided the workshop into two parts: an introduction as a frontal presentation and a hands-on part with discussion and Q&A phases in between. Though this worked quite well, we think it might be nice to switch more often between explanatory parts and hands-on parts.
  • +
  • Participants were a bit shy. We got some good feedback in the chat at the end but only from some participants. Next time, we should prepare another poll for getting feedback at the end of the workshop
  • +
+

With regard to the further development of SkoHub Vocabs, it became clear during the workshops that it would be great to have an automatic test with each commit that lets you know whether a SKOS/Turtle file in a repo is “SkoHub-ready”, i.e. conforms to the pattern that is supported by SkoHub Vocabs. Issue #91 is already addressing this need and should be worked on to accomplish this.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2021-lis-workshop/index.html b/2021-lis-workshop/index.html new file mode 100644 index 0000000..47af530 --- /dev/null +++ b/2021-lis-workshop/index.html @@ -0,0 +1,48 @@ +SkoHub Presentation at LIS Workshop 2021 | Skohub Blog

SkoHub Presentation at LIS Workshop 2021

July 12, 2021 | Adrian PohlSteffen Rörtgen

+ + + First slide of SkoHub presentation at LIS Workshop 2021 + +
First slide of SkoHub presentation at LIS Workshop 2021
+

+

Last Friday afternoon, the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) took place organized by the Working Group within the GfKL – Data Science Society. Adrian and Steffen had the chance to present SkoHub in the workshop’s first presentation. The slides can be viewed at https://pad.gwdg.de/p/lis-workshop21-skohub.

+

Here is an overview over the full programme that comprised six talks:

+
    +
  • Adrian Pohl (hbz, Cologne, Germany) & Steffen Rörtgen (GWDG, Göttingen, Germany): SkoHub: Publishing and using knowledge organization systems on the web
  • +
  • Colin Higgins (University of Cambridge, Cambridge, United Kingdom): Justice, governance, and the thesaurus – the Cambridge experience with ‘illegal aliens’
  • +
  • Gislene Rodrigues da Silva & Célia da Consolação Dias (Universidade Federal de Minas Gerais, Belo Horizonte Brasil): Subjective aspects of indexing photographs from visual communication using a reading model based on the complex method and the primary functions of the image
  • +
  • Heidrun Wiesenmüller (Stuttgart Media University, Stuttgart, Germany): Orientation and exploration – the presentation of subject headings in German catalog
  • +
  • Karin Schmidgall (Deutsches Literaturarchiv Marbach, Marbach, Germany) & Matthias Finck (Effective Webwork, Hamburg, Germany): Glückliche Funde - ein Katalog der Forschende auf neue Ideen und Pfade bringt
  • +
  • Julijana Nadj-Guttandin (Deutsche Nationalbibliothek, Frankfurt, Germany) & Sarah Pielmeier (University and State Library, Münster, Germany): Ein neues und modulares Regelwerk für die verbale Inhaltserschließung / A new and modular standard for subject indexing
  • +
+

The workshop happened as part of the virtual conference “Data Science, Statistics & Visualisation and European Conference on Data Analysis 2021” (DSSV-ECDA 2021). The promotion for the workshop could probably have been better, e.g. the presentations weren’t even listed in the regular DSSV-ECDA programme. In the end, the speakers and moderators were among themselves with little additional audience. However, the talks discussed interesting topics and discussion was lively.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2022-05-eww-project-kickoff/index.html b/2022-05-eww-project-kickoff/index.html new file mode 100644 index 0000000..64d6633 --- /dev/null +++ b/2022-05-eww-project-kickoff/index.html @@ -0,0 +1,39 @@ +Collaborating on improving SkoHub Vocabs | Skohub Blog

Collaborating on improving SkoHub Vocabs

May 19, 2022 | Adrian PohlAnne Christensen

In a kickoff workshop, the SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some pending issues regarding both functionality and design of SkoHub Vocabs. The issues and progress of the project can be followed in a Kanban board.

+

+ + + The Backlog, Ready and Working columns of the project's Kanban board as of 2022-05-19 + +
The Backlog, Ready and Working columns of the project's Kanban board as of 2022-05-19
+

+

A big part of the project will concern a new functionality to support the grouping of concepts by creating SKOS collection pages (Issue #159). Another central goal of the cooperation is a redesign of the static sites that are generated by SkoHub Vocabs. Finally, a logo is to be developed for the SkoHub softwar suite that will hopefully capture the spirit of the software and the community behind it. We are looking forward to presenting the results within the next months.

+

The team from effective WEBWORK consists of software developers, a librarian and a designer whose skills overlap with those of the SkoHub community in many ways and especially regarding their enthusiasm for open source solutions. We are looking forward to this collaboration!


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2022-11-skohub-workshop/index.html b/2022-11-skohub-workshop/index.html new file mode 100644 index 0000000..82365dc --- /dev/null +++ b/2022-11-skohub-workshop/index.html @@ -0,0 +1,22 @@ +Things are moving at SkoHub | Skohub Blog

Things are moving at SkoHub

November 04, 2022 | Adrian PohlSteffen Rörtgen

In this blog post we want to introduce to you a new member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub as well as invite you to a workshop to present and discuss our future plans for the SkoHub project.

+

After some time with not much happening (or even with shutting down some SkoHub services), we are happy to inform about a lot of movement in the space. We already announced the current project with the effective WEBWORK team to develop a new logo, improve the design and fix some minor issues in SkoHub. We are happy about the improvements made. Watch this space for more details in an upcoming post.

+

Welcome, Steffen!

+

We are very happy to welcome Steffen Rörtgen in the open infrastructure team at the Hochschulbibliothekszentrum NRW who has joined the team this November. In his former projects he already made heavy use of SkoHub Vocabs and contributed to the project. He will now focus on further SkoHub development in context of the Metadaten.nrw project which is funded by the Ministry of Culture and Science of North Rhine-Westphalia (MKW).

+

With the grant for this project, we have resources for further development and would like to discuss with you our plans, especially regarding the use of SkoHub for reconciliation and the ActivityPub-based publish/subscribe approach (SkoHub PubSub). Having already defined some work packages within the Metadaten.nrw project we would like to align these with use cases and ideas the SkoHub community has.

+

Upcoming workshop

+

Therefore we are happy to invite you to a small workshop on Thursday, the 17th of November. We will start at 10:00h CET and split the workshop into two parts with each one lasting about two hours:

+

In the first part we will give an overview of the past and current developments of SkoHub as well as an introduction to the Metadaten.nrw project and its plans for SkoHub. At the end of the first part we want to discuss use cases for the publish/subscripe approach of SkoHub as well as for reconciliation. Our community member Andreas Wagner already developed a prototype for reconciliation with SkoHub, which he will present.

+

In the second part of the workshop we will then deep dive into the reconciliation topic. We will discuss Andreas’ approach and develop a roadmap for SkoHub to implement the desired reconciliation functionalities.

+

For more details, see the pad with the preliminary agenda.

+

If you are interested in the workshop, please send an email to skohub@hbz-nrw.de +and give us a note if you are joining the whole workshop or just the first part.

+

Please be aware that we won’t give a general introduction to SkoHub and expect you to be familiar with SKOS and the approach of SkoHub.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2022-12-02-new-look/index.html b/2022-12-02-new-look/index.html new file mode 100644 index 0000000..c76c34f --- /dev/null +++ b/2022-12-02-new-look/index.html @@ -0,0 +1,40 @@ +Have U Seen The New Look? | Skohub Blog

Have U Seen The New Look?

December 02, 2022 | Adrian PohlSteffen Rörtgen

We are happy to announce the new SkoHub logo and design we have deployed right in time for our SWIB22 workshop on Wednesday! In the last months, Kai Mertens and effective WEBWORK helped to work out this new look in the context of the project we have announced earlier. We have now updated the SkoHub website, this blog and the default SkoHub Vocabs setup to incorporate the new logo and design.

+

Here is an example of how a vocabulary built with SkoHub Vocabs will look now with this default design:

+

+ + + The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects + +
The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects
+

+

I looks much clearer and more modern than before. We also love the new logo. Kai did a great job creating the new logo and design while not totally breaking with the previous look. We created an extra repo at https://github.com/skohub-io/skohub-logo for the logo and related files. In the next days, we will add some more documentation, especially on how to configure a customized version for your own SkoHub Vocabs instance.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2022-12-19-workshop-summary/index.html b/2022-12-19-workshop-summary/index.html new file mode 100644 index 0000000..541dec9 --- /dev/null +++ b/2022-12-19-workshop-summary/index.html @@ -0,0 +1,58 @@ +Notes from the November workshop | Skohub Blog

Notes from the November workshop

December 19, 2022 | Adrian PohlSteffen Rörtgen

Due to new funding for SkoHub development we conducted – as previously announced – a workshop on the 17th of November. About 15 participants from three different countries joined updates and discussion around the following topics:

+
    +
  1. Current state of SkoHub
  2. +
  3. Introduction of Metadaten.nrw project
  4. +
  5. Collection of requirements from the community regarding PubSub and reconciliation
  6. +
  7. Presentation of SkoHub Reconcile prototype by Andreas Wagner
  8. +
+

We split the workshop in two parts. First, we gave a general overview about the current state of SkoHub and the renewed funding through the Metadaten.nrw project. Then we had a general discussion about SkoHub PubSub – the module to connect a SKOS vocab with the Fediverse – as well as Andreas Wagner’s Reconciliation prototype. See also the slides for the first part of the workshop.

+

In the second half Andreas gave us a technical deep dive into his reconciliation prototype, walked us through the code and we discussed the architecture as well as future development and integration into the SkoHub ecosystem.

+

In the following, we will go deeper into what happened in the different parts.

+

Current state of SkoHub

+

Currently, SkoHub Vocabs is by far the most used SkoHub module. It is used by the hbz, the metadata standardization groups around KIM, WirLernenOnline, The Institute for Educational Quality Improvement (IQB), in research projects in the area of digital humanities and by other people and institutes to publish their controlled vocabularies.

+

The browser plugin SkoHub Editor as well as the PubSub module haven’t been used in production yet and have been shut down temporarily in March 2022 due to missing resources.

+

In 2022 the work on SkoHub started again when we partnered with effective WEBWORK (eWW) to redesign the web pages, create a new logo, improve UI configuration and address other issues as for example the support of skos:Collection. (See the project kanban for an overview.)

+

Decouple software and services

+

The general idea is to further decouple the software “SkoHub” from its running instances. Therefore we also wanted eWW to work on UI configuration possibilities, so other institutes or projects can easily brand their SkoHub instance.

+

In the future, we will move the hosted instance, currently running at skohub.io to metadaten.nrw, the project which grants the further development of SkoHub.

+

Metadaten.nrw

+

In the end of 2021 hbz secured some funding by the Ministry of Culture and Science of North Rhine-Westphalia (MKW) for a project called Metadaten.nrw. It consists of two sub-projects, with one called “Infrastructure Initiative Metadata Services” being located in the Open Infrastructure team (OI) at hbz, where SkoHub development will take place.

+

We got four positions funded from which two are already filled, amongst them Steffen for SkoHub development. The goal of the project is to expand the community of users for the existing metadata infrastructure provided by hbz/OI, with focus on libraries and scholars in North Rhine-Westphalia (NRW), and to establish hbz as a competence center for metadata in NRW.

+

Accordingly, we plan to develop SkoHub further regarding the following topics:

+
    +
  • Fediverse integration: Further development of SkoHub PubSub in the context of a concrete use case
  • +
  • Reconciliation: Bringing the SkoHub reconciliation module into production
  • +
  • Possibly support Annif integration in a later project phase
  • +
  • Offer SkoHub tutorials and workshops
  • +
+

Community, PubSub & Reconciliation

+

To further encourage contributions like the one from Andreas with the reconciliation prototype, we will set up contributing guidelines to have a clear and transparent definition of the development and deployment processes.

+

SkoHub PubSub

+

Afterwards we made a small (re)introduction to SkoHub PubSub and discussed possible use cases. We developed ideas about SkoHub PubSub serving as a communication hub between researchers for their research fields. Raphaëlle Lapotre came up with a conrete use case. They currently have some pains in the context of Timel Thesaurus, an indexing Thesaurus for huge amounts of digitized pictures of medieval iconography. Currently, there are problems with the task of storing the large amounts of images centrally in a repository. Researchers could hold the files locally in their NextCloud and publish the image metadata to inboxes of SKOS concepts. A central service could then listen to the data provided by each concept’s inbox and then display the metadata with a link pointing to the image in its storage location. There are actually two possible use cases : one with the digitized illuminations pictures of the Ahloma lab (EHESS, sample), the second one with painted ceilings pictures from all the mediterranean area, collected by an association of scholars and retired volunteers. Possibly, the support for ActivityPub in Nextcloud could help with such a project.

+

Another topic was the idea of community building around concepts. The Open Educational Resource Search Index (OERSI) as well as the WirLernenOnline project already use elaborated vocabularies to index their resources. Interested humans could easily follow these concepts and engage in discussions around them.

+

This is also applicable to researchers that will be able to build up a topic-specific data base and open discussions about their research in the fediverse. This also rose practical questions about what happens on the notification side with broader and narrower concepts. If I’m following a concept do I also want to get notifications about its narrower or broader concepts? These are questions that can be discussed further in our community.

+

SkoHub Reconciliation

+

Following the PubSub discussion Andreas presented his reconciliation prototype. The reconciliation prototype is based on the Reconciliation API spec developed by the W3C Entity Reconciliation Community Group, so it is interoperable and can be used in any kind of application that acts as a reconciliation client. Andreas implementation already worked in OpenRefine as well as in TEI Publisher’s annotation tool. After showing the implementation with some examples we went into a technical deep dive.

+

Andreas walked us through the code and we discussed the current implementation as well as the future architecture of the SkoHub modules. His current approach is based on the SkoHub Vocabs webhook part and lending code from SkoHub PubSub regarding the elasticsearch indexing.

+

The discussion resulted in the proposal to separate SkoHub Vocabs from the webhook module and by this further separate concerns of the respective modules. He integrated a doreconc query parameter to the webhook, which triggers a script that will populate the vocabulary to the reconcile prototype.

+

After the workshop we transferred the skohub-reconcile repository from Andreas to the SkoHub organization and are happy to start further developing it in 2023.

+

Final thoughts

+

The workshop was a great event to discuss with SkoHub users and those who want to be. We collected valuable feedback and ideas for development in the upcoming two years. +Especially the sudden rise in awareness for the Fediverse opens up interesting use cases for SkoHub PubSub, which we are happy to engage in. The highlight of the workshop was the presentation of Andreas’ reconciliation prototype and its transfer in the SkoHub organization. This is a good example for the benefits of open source and use case driven development.

+

We are looking forward to future community events, more use cases and even more modules to be developed in the SkoHub ecosystem.

+

More links:

+

A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2023-02-09-tests-updated/index.html b/2023-02-09-tests-updated/index.html new file mode 100644 index 0000000..87c7d75 --- /dev/null +++ b/2023-02-09-tests-updated/index.html @@ -0,0 +1,157 @@ +Moving to test-driven development and updating existing tests | Skohub Blog

Moving to test-driven development and updating existing tests

February 09, 2023 | Steffen Rörtgen

For quite some time we have been adding new features to SkoHub Vocabs like switching languages, display of all relevant properties on the concept page and support for skos:Collection. Unfortunately there were no tests added to actually test these new functionalities. This led to some surprises now and then, for example when we noticed that at one point language tags did not show up when visiting a Collection page directly.

+

Originally SkoHub Vocabs already contained some tests, so being the maintainer of SkoHub Vocabs I decided to follow up on that and got myself a little bit more familiar on the topic. Quickly I stumbled over the topic of Test Driven Development (TDD) and though I heard of it before, I decided to dive a little deeper and check, if that pattern might be appropriate for SkoHub Vocabs and the other SkoHub modules (and maybe my coding approaches in general).

+

The general idea of TDD is as follows (borrowed heavily from the Wikipedia article):

+
    +
  • Requirements of a new feature are first translated into test cases
  • +
  • Tests are written
  • +
  • Code is written
  • +
+

+ + + + Test-Driven-Development Cycle + + +
Test-Driven-Development Cycle
+

+

This leads to the following development cycle:

+
    +
  1. +

    Write tests: This ensures that the developer actually understands the user requirements. Usually this is done with the help of use cases and user stories.

    +
  2. +
  3. +

    Run tests: The tests should now fail. If not, it might be the case that the actual feature is already present in the code and no further code needs to be written. Maybe documentation has to be updated accordingly.

    +
  4. +
  5. +

    Write the simplest code that passes the new tests: The code can (and should) later be refactored, so it can be ugly at this point.

    +
  6. +
  7. +

    All tests should now pass: If the code is still failing it should be revised till all tests pass.

    +
  8. +
  9. +

    Refactor as needed: Your tests now verify that the new feature is working as expected. If any tests during refactoring fail, you now can and will immediately correct your code.

    +
  10. +
+

Consequences on SkoHub development

+

This approach has some consequences for the development of SkoHub modules. +These changes will also be reflected in the yet to be published CONTRIBUTING.md. +Issues for new features should contain use cases and user stories as well as some notes that indicate when the feature is actually correctly implemented. +Just when all of this is present, the issue can be marked as ready. +The use cases and notes can then be used to write the tests and follow the above mentioned development cycle.

+

Regarding code review, this approach also has some consequences. Code review should only be approved if tests were added for the new feature or the tests were adjusted in case of bug fixing.

+

Testing Strategies and Technologies in SkoHub Vocabs

+

At the end of this blog post I want to give you a short overview of currently used testing strategies and technologies used in SkoHub Vocabs development. We use unit tests, integration tests and end-to-end tests whereby we try to write more unit tests than integration tests than end-to-end tests. The reason for this is that end-to-end tests take long and are quite expensive regarding computing power and time. Unit and integration tests on the other hand are cheap and can also auto-run in the background on every save, thus giving you immediate feedback when something is broken.

+

For unit and integration tests we use Jest and the React-Testing-Library since Gatsby – with which SkoHub Vocabs is built – uses React. +Some of the older tests used Enzyme, but after upgrading to React 18 I noticed that Enzyme was no longer working, because the project is dead. +After some research I found the React-Testing-Library as the most recommended testing framework and migrated the old Enzyme tests. +After some initial training, writing tests became actually quite handy and fun.

+

Adding tests is by no way finished at this point, but a lot of the lately added features now have some proper testing. This already required a few changes to the code base from now and then when I noticed things weren’t working as expected.

+

+ + + + Test Coverage in SkoHub Vocabs + + +
Current test coverage in SkoHub Vocabs
+

+

For end-to-end tests I decided to go with cypress since it has an excellent documentation, is fully open source and runs tests in a real browser.

+

+ + + + Test in Cypress + + +
Example of Tests running in Cypress. On the left you see the test and can also jump forth and back between states, on the right you see the rendered HTML page
+

+

All of the tests are actually integrated in the SkoHub Vocabs CI pipeline and run before a new docker image gets build.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2023-11-22-shacl-shape/index.html b/2023-11-22-shacl-shape/index.html new file mode 100644 index 0000000..79f66ac --- /dev/null +++ b/2023-11-22-shacl-shape/index.html @@ -0,0 +1,85 @@ +Development of SKOS SHACL shape | Skohub Blog

Development of SKOS SHACL shape

November 22, 2023 | Steffen Rörtgen

To improve the error messages thrown by SkoHub Vocabs for invalid RDF Turtle files, we decided to implement a validation step, before the static site of a vocabulary gets built with the Gatsby framework. +This validation step should provide more meaningful error messages than the currently cryptic ones thrown by Gatsby. +While we could have gone with one of the existing SKOS validator tools like SKOS Play!, SKOSify or Poolparty (it’s pretty epensive) we decided to go with a more generic approach and define the shape rules not in code, but in data.

+
+ + + + SHACL logo + + +
SHACL logo
+
+

If you want to validate the shape of an RDF graph, you currently have two options to do that. You can either use Shape Expressions (ShEx) or the Shapes Constraint Language (SHACL). +We decided to go with SHACL for the following reasons:

+ +

Unfortunately the SKOS-XL shape did not work with our tooling (Apache Jena SHACL) out of the box. +Therefore we decided to build a SKOS shape from the ground up based on the SKOS Reference.

+

SKOS Reference Shape

+

The goal was to implement every consistency example from the SKOS Reference as a test case for the shape. +To accomplish this it was on the one hand needed to formalize the class and property definitions from the spec as well as the integrity conditions. +On the other hand we needed a triple store with reasoning capabilities to apply these rules to the very basic examples in the reference. +We used the Apache Jena tooling for this and built a jena-docker containers based on the docker containers of this repo. +The SKOS class and property definitions are defined in this file. +The workflow for validating the SKOS shape is as follows:

+
    +
  1. The fuseki container is started with the inference configuration.
  2. +
  3. The class and property definitions are appended to skos.shacl.ttl file which is mounted in the container.
  4. +
  5. The respective example is mounted in the container as a ttl file (e.g. example05 )
  6. +
  7. The validation result (which is itself a RDF graph) is temporarily stored
  8. +
  9. The validation result is queried with SPARQL for errors
  10. +
  11. Based on the query result an error message is put out
  12. +
+

This way we accomplished to validate all valid examples from the SKOS reference up to example 68 as valid and all the invalid examples as invalid (entailment vs non-entailment examples were left out).

+

SkoHub Shape

+

In SkoHub Vocabs we are a bit stricter regarding some aspects of the SKOS reference. +For example we want every skos:Concept to have at least one skos:prefLabel. +Therefore we developed a SkoHub specific shape with skohub.shacl.ttl. +In contrast to the generic SKOS shape this shape does not contain any SPARQL based SHACL constraints. +Though it is possible and especially for more elaborated queries useful to use SPARQL to check constraints, the available tools (at least for javascript rdf-validate-shacl) do not support such queries.

+

As a result, validation errors and warnings help SkoHub users to improve the quality of their vocabularies. See for example the validation warning for no provided license:

+
-----------Warning--------------
+Message:  [
+  Literal {
+    value: 'A provided license increases reusability of a vocabulary. Should be an URI.',
+    language: '',
+    datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' }
+  }
+]
+Path:  http://purl.org/dc/terms/license
+Node, where the error occured:  http://w3id.org/example-cs/
+Severity of error:  http://www.w3.org/ns/shacl#Warning
+

Or the validation error if the object of skos:hasTopConcept is not a skos:Concept:

+
-----------Violation--------------
+Message:  [
+  Literal {
+    value: 'The target class for hasTopConcept should be skos:Concept',
+    language: '',
+    datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' }
+  }
+]
+Path:  http://www.w3.org/2004/02/skos/core#hasTopConcept
+Node, where the error occured:  http://w3id.org/example-cs/
+Severity of error:  http://www.w3.org/ns/shacl#Violation
+

Community

+

Thanks to a lightning talk at SWIB23 (slides, recording) we got some attention to the shape. +Suggestions made by Jakob Voß, Osma Suominen and Antoine Isaac already greatly improved the shape. +Further suggestions and improvements as well as your use cases are highly welcome.

+

Outlook

+

We were quite a bit surprised that we did not find any usable existing SKOS SHACL shape. +Hopefully our work may help others validating their SKOS files and improve the overall quality of vocabularies. +There is currently still an open ticket for implementing the qSKOS best practice rules. +Any feedback and collaboration on the shapes is welcome!


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2024-01-18-reconcile/index.html b/2024-01-18-reconcile/index.html new file mode 100644 index 0000000..486de5f --- /dev/null +++ b/2024-01-18-reconcile/index.html @@ -0,0 +1,451 @@ +Supporting the Reconciliation Service API for SKOS vocabularies | Skohub Blog

Supporting the Reconciliation Service API for SKOS vocabularies

January 22, 2024 | Steffen Rörtgen

Reconciliation is the process of integrating data from sources which do not share common unique identifiers by identifying records which refer to the same entities. +This happens mostly by comparing the attributes of the entities. +For instance, two entries in a catalogue about persons that share the same date of birth, place of birth, name and death date, will probably be about the same person. +Linking these two entries by adding the identifier from another data source is the process of reconciliation. This allows for extension of your data by taking over information from a linked record.

+

To facilitate this process multiple tools exist with OpenRefine being the most prominent tool. +To align and standardize the way of providing data for these tools the Reconciliation Service API is drafted by the Entity Reconciliation Community Group within the World Wide Web Consortium (W3C). +The specification defines endpoints that data services can expose so that applications like OpenRefine can handle that data. +A number of other services have already implemented the specification, like TEI Publisher or Cocoda, or the Alma Refine plugin for the commercial Library Management System Alma.

+

Reconciliation and SKOS

+

Simple Knowledge Organization System (SKOS) is an established standard for modeling controlled vocabularies as Linked Data. Thus, SKOS vocabularies are often targets of reconciliation efforts as you can improve your local data by enrichting strings with identifiers of a controlled vocabulary. So SKOS and the Reconciliation Service API often go hand in hand. However, there has not existed an easy way to set up a reconcilation endpoint for an existing SKOS vocabulary. We decied to change that by developing the new SkoHub component SkoHub-Reconcile.

+

Andreas Wagner had already built a reconciliation prototype for SKOS vocabularies (see also our Workshop Blog Post. +We picked this prototype up, refactored it and moved it into a container based infrastructure. +We also added support for v0.2 of the reconciliation spec.

+

SkoHub Reconcile Publish

+

To make it easy to upload vocabularies to the reconciliation service a front-end was develped which you can try out at https://reconcile-publish.skohub.io/.

+

+ + + + The reconcile-publish upload UI + + +
The reconcile-publish upload UI
+

+

Every vocabulary that passes the SkoHub SHACL Shape (see our blog post) should work for uploading to the reconcile service. +The only additional requirement is to provide a vann:preferredNamespaceUri. +As you can see in the screenshot you also have to provide an account and a language. +As for the account you can currently choose whatever you want, just make sure it is unique enough, so your dataset (i.e. your vocabulary) does not get overwritten by someone else. +Since a lang parameter has only been available since the current draft version of the reconciliation specification and not yet implemented in SkoHub Reconcile, the current version of the SkoHub Reconcile service requires you to specify a language you want to use for reconciliation. We will improve this in the future along with the development of the specification.

+

Example: Usage in OpenRefine

+

Let’s see how we can use the service with OpenRefine.

+

First, we upload the vocabulary. +We will use a classification of subject groups.

+

+ + + + The filled in upload form with "test" as account name, "de" as language  and "systematik.ttl" as file to be uploaded + + +
The filled in upload form with "test" as account name, "de" as language and "systematik.ttl" as file to be uploaded
+

+

After a successful upload of the turtle file, we are presented with a URI that leads to the “Service Manifest” of our reconciliation service.

+

+ + + + The URL of the Service Manifest being returned by the upload UI + + +
The URL of the Service Manifest being returned by the upload UI
+

+

If we follow the URL https://reconcile.skohub.io/reconcile?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme we see some data that services will use for reconciliation against our vocabulary:

+
{
+    "versions": [
+        "0.2",
+        "0.3.0-alpha"
+    ],
+    "name": "SkoHub reconciliation service for account 'test', dataset 'https://w3id.org/kim/hochschulfaechersystematik/scheme'",
+    "identifierSpace": "https://w3id.org/kim/hochschulfaechersystematik/",
+    "schemaSpace": "http://www.w3.org/2004/02/skos/core#",
+    "defaultTypes": [
+        {
+            "id": "ConceptScheme",
+            "name": "ConceptScheme"
+        },
+        {
+            "id": "Concept",
+            "name": "Concept"
+        }
+    ],
+    "view": {
+        "url": "{{id}}"
+    },
+    "preview": {
+        "url": "https://reconcile.skohub.io/preview?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id={{id}}",
+        "width": 100,
+        "height": 320
+    },
+    "suggest": {
+        "entity": {
+            "service_url": "https://reconcile.skohub.io",
+            "service_path": "/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=entity",
+            "flyout_service_path": "/suggest/flyout?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}"
+        },
+        "property": {
+            "service_url": "https://reconcile.skohub.io",
+            "service_path": "/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=property",
+            "flyout_service_path": "/suggest/flyout?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}"
+        },
+        "type": {
+            "service_url": "https://reconcile.skohub.io",
+            "service_path": "/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=property",
+            "flyout_service_path": "/suggest/flyout&language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}"
+        }
+    }
+}
+

Now that the reconciliation service is set up with our data, let’s see how we can use it in OpenRefine.

+

For demo purposes we use a small vocabulary of a few discipline names:

+

+ + + + An OpenRefine tabe with the values "mathe", "bibliothek", "forst" + + +
An OpenRefine tabe with the values "mathe", "bibliothek", "forst"
+

+

By clicking on the dropdown button of the column we want to reconcile, we choose “Reconcile” -> “Start reconciling…“.

+

+ + + + OpenRefine dropdown menu to start a reconciliation process + + +
OpenRefine dropdown menu to start a reconciliation process
+

+

After clicking “Add standard service”, we can enter the url we were provided with by the upload service:

+

+ + + + Adding the Service Manifest URL in OpenRefine + + +
Adding the Service Manifest URL in OpenRefine
+

+

Then we just have to start the reconciliation by clicking “Start reconciling…” and our reconciliation service will be queried with the terms in our OpenRefine project. +We are then presented with the results:

+

+ + + + OpenRefine UI with lists of reconciliation candidates + + +
OpenRefine UI with lists of reconciliation candidates
+

+

This already looks good! +Now we can choose matches by clicking the checkmark or get additional information by hovering over the proposed entry from the reconcile service.

+

+ + + + Interative OpenRefine pop-up to define a match + + +
Interative OpenRefine pop-up to define a match
+

+

If we want we can also search through our vocabulary by clicking “Search for match”:

+

+ + + + Searching for a vocabulary term in OpenRefine + + +
Searching for a vocabulary term in OpenRefine
+

+

After selecting the appropritate matches we have successfully reconciled our data:

+

+ + + + Matched values in OpenRefine column + + +
Matched values in OpenRefine column
+

+

Further reads

+

Christel Annemieke Romein, Andreas Wagner and Joris J. van Zundert published a tutorial about building and deploying a classification schema using open standards and technology. +In this tutorial they make use of SKOS, SkoHub Vocabs and SkoHub Reconcile. +We recommend having a look to see the use of SkoHub services in action.

+

Next steps

+

The services are currently in an alpha phase and ready for testing. +You can test the service under https://reconcile-publish.skohub.io/.

+

Feedback is very much appreciated: via email (skohub@hbz-nrw.de), as an issue or – primarily for the German-speaking users – in the newly set up discourse forum metadaten.community.

+

Our next step will be integrating the above mentioned lang parameter to be able to serve all languages of a vocabulary without the need to specify it beforehand.

+

Repositories

+

A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2024-01-24-uris-without-language-tags/index.html b/2024-01-24-uris-without-language-tags/index.html new file mode 100644 index 0000000..6b23254 --- /dev/null +++ b/2024-01-24-uris-without-language-tags/index.html @@ -0,0 +1,60 @@ +Re-working SkoHub Vocabs internationalization features | Skohub Blog

Re-working SkoHub Vocabs internationalization features

January 31, 2024 | Steffen Rörtgen

In the past: Internationalization with drawbacks

+

If you have worked with SkoHub Vocabs before, you might have noticed that the URLs in the address bar had a little special feature that you don’t encounter very often, a language tag before the .html:

+

https://skohub.io/dini-ag-kim/hochschulfaechersystematik/heads/master/w3id.org/kim/hochschulfaechersystematik/scheme.de.html

+

Why did we need this?

+

We wanted Internationalization features to be able to navigate multiple languages. +Normally this is done via a subdomain or adding a language tag behind the domain name like https://w3id.org/kim/hochschulfaechersystematik/en/. +But this does not work for SkoHub Vocabs since the we use the URIs from the turtle files as IDs for the concept. +Changing the URI by adding a language tag somewhere would break the whole concept of SkoHub Vocabs.

+

So it was decided to add the language at the end of the URL by using Apache Multiviews features. +But this lead to some drawbacks:

+
    +
  • SkoHub Vocabs needed to be served by an Apache Webserver
  • +
  • The webserver needed special configuration
  • +
  • SkoHub Docker Vocabs, which is served via GitHub Pages, always needed a specific link to an index.{language}.html file, since GitHub Pages only looks for an index.html
  • +
  • The build directory grew quite a bit, since there were dedicated html pages built for every language
  • +
+

Switching to one page for all languages

+

In order to overcome these issues we decided to change this behaviour and just build one html page with a functionality to switch languages. The shown language is now chosen the following way:

+
    +
  • by using your browser language
  • +
  • if you switched languages in the application the chosen language is taken
  • +
  • if a language is not present, a default language present in the vocabulary is used
  • +
+

To point users to a specific language, you can use a query parameter lang= like:

+

https://w3id.org/kim/hcrt/scheme?lang=uk

+

Since SkoHub Vocabs also used the language tag of the URL internally to determine which language to serve a lot of changes had to be done in the codebase. +But overall this resulted in a much reduced size of the built vocabularies and more flexibility on serving the vocabularies.

+

Benefits of the new approach

+

This new internationalization approach brings lots of improvements:

+
    +
  • SkoHub Vocabs is now independent from the underlying webserver
  • +
  • The size of the vocabularies is drastically reduced, especially for vocabularies with lots of languages
  • +
  • SkoHub Docker Vocabs is now simpler to setup since we only have “normal” index.html files that it knows how to handle
  • +
+

What to do if I’m running my own webhook server?

+

If you are running your own webhook server, you should upgrade the following way:

+
    +
  • Follow the steps outlined in the webhook repository to rebuild vocabularies. This will rebuild all still existing branches you are currently serving.
  • +
  • Set up a redirect in your apache config, so that links that still have ...de.html will be redirected to ...html?lang=de:
  • +
+
# Redirect from ...filename.LANGCODE.html to ...filename.html?lang=LANGCODE
+        RewriteRule ^(.+)\.([a-z]{2})\.html$ $1.html?lang=$2 [L,R=301]
+
    +
  • After that you should be good!
  • +
+

Anything else?

+

During developing the script to rebuild all existing vocabularies, I noticed that we are serving a lot of branches that do not exist anymore. +SkoHub Webhook currently builds a vocabulary for every branch, you are setting up and pushing to. +But the webhook service does not get notified, when a branch is deleted. +This way we end up having lots of files for branches that no one needs anymore. +In order to clean this up a bit, we will soon add a script to clean the dist directory up and remove those no longer needed files.


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2024-03-21-skohub-pages/index.html b/2024-03-21-skohub-pages/index.html new file mode 100644 index 0000000..d6edbf4 --- /dev/null +++ b/2024-03-21-skohub-pages/index.html @@ -0,0 +1,240 @@ +Publishing SKOS the easy way | Skohub Blog

Publishing SKOS the easy way

March 21, 2024 | Steffen RörtgenAdrian Pohl

A simple workflow for publishing your vocabs

+

With SkoHub Pages we now provide a very simple way for publishing your SKOS vocabulary from a GitHub repository. It only involves 5-6 steps:

+

1. Fork the skohub-pages repo

+

Click the “Fork” button in the top-right corner of the SkoHub Pages repo. You can change the name of your fork to whatever you like, e.g. my-shiny-vocab. See also the GitHub fork documentation.

+

+ + + + Create fork, uncheck box ⚠️ to also fork the gh-pages branch + + +
Create fork, uncheck box ⚠️ to also fork the gh-pages branch
+

+

2. Activate GitHub Actions

+

+ + + + Go to "Actions" tab and if not already activated, activate GitHub Actions. + + +
Go to "Actions" tab and if not already activated, activate GitHub Actions.
+

+

3. Configure GitHub Pages branch

+

Go to “Settings”, navigate to the “Pages” setting and select gh-pages as the branch your site is being built from.

+

+ + + + Set gh-pages branch + + +
Set gh-pages branch
+

+

4. Update pages URL

+

Go back to the main page of your repo and click the little gear icon in the top right of the “About” section. Check the box at “Use your GitHub Pages website”.

+

+ + + + Edit "About" section of the repository + + +
Edit "About" section of the repository
+
+
+ + + + Set URL of repository + + +
Set URL of repository
+

+

5. Start committing

+

Now you can add a commit to the main branch adjusting the example vocabularies or adding a new turtle file. The changes will automatically be published to your GitHub pages website that is now linked at the top-right of your GitHub repo (sometimes it takes a little to see the changes, remember to do some hard refreshing).

+

6. Set your GitHub Pages URL as namespace (optional)

+

See section “Resolving custom domains” below ⬇️

+

Utilizing GitHub Actions & Pages

+

Not all projects or individuals involved in the creation of controlled vocabularies are able or have the resources to run their own infrastructure. Thus, we have been pursuing this approach – formerly under the name of “skohub-docker-vocabs” – to utilize Docker and GitHub infrastructure for publishing SKOS vocabularies with SkoHub Vocabs. Specifically, the workflow relies on ”GitHub Pages” and ”GitHub Actions”. With GitHub Pages it is possible to host websites on the GitHub infrastructure, GitHub Actions are used for automated tests and deployments.

+

We have written a GitHub Action that ensures that a process is started after each push to the repository which builds the vocabularies with SkoHub Vocabs. +The built vocabulary is then pushed to a separate git branch gh-pages. +As seen above, GitHub Pages is configured to deliver HTML pages from this gh-pages branch.

+

We have been using this approach in various introduction to SKOS and SkoHub workshops. +However, in the past the workflow required some adjustments in the GitHub action so that errors could quickly creep in. We are happy to having improved this considerably and made the process much less error-prone! 🎉

+

The relevant information is now set directly as environment variables and all other customizations can be changed via the GitHub GUI, so the workflow is now much more user-friendly. But that’s not all!

+

Resolving custom domains

+

Although with the presented approach the custom vocabulary could be provided without own infrastructure, the domains did not resolve to the GitHub pages. +This means that a concept scheme that uses URIs based on the GitHub Pages domain (e.g. https://myhandle.github.io/skohub-pages/) could not be resolved so far. In the past, in order to mitigate this we recommended setting up a redirect via w3id or purl.org. +Of course, it still makes sense to set up a redirect (in case the vocabulary moves somewhere else). However, it is now also possible to use the domain that is assigned via GitHub Pages and have quickly set up a fully working SKOS vocabulary with resolving concept URIs which can come handy for prototyping.

+

To do this, a config.yaml must be created in the repo. +The respective domain must then be entered under the custom_domain. +Example: Your GitHub Pages domain is https://myhandle.github.io/skohub-pages/. Then provide https://myhandle.github.io/skohub-pages/ as custom_domain in your config.yaml.

+

The base of your concept scheme could then be something like: https://myhandle.github.io/skohub-pages/myvocab/

+
#config.yaml
+---
+# [...]
+custom_domain: "https://myhandle.github.io/skohub-pages/"
+#[...]
+
# colors.ttl
+@prefix colour: <https://myhandle.github.io/skohub-pages/myColourVocab/> .
+@prefix dct: <http://purl.org/dc/terms/> .
+@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+colour: a skos:ConceptScheme ;
+    dct:title "Colour Vocabulary"@en, "Farbvokabular"@de ;
+    dct:creator "Hans Dampf"@de ;
+    dct:created "2021-11-02"^^xsd:date ;
+    dct:license <https://creativecommons.org/publicdomain/zero/1.0/> ;
+    skos:hasTopConcept colour:violet, colour:blue .
+
+colour:violet a skos:Concept ;
+    skos:prefLabel "Violett"@de, "violet"@en;
+    skos:altLabel "Lila"@de, "purple"@en ;
+    skos:topConceptOf colour: .
+
+colour:blue a skos:Concept ;
+    skos:prefLabel "Blau"@de, "blue"@en ;
+    skos:topConceptOf colour: .
+

Feel free to try out our simplified approach and let us know if something does not work: https://github.com/skohub-io/skohub-pages/issues/new

+

Outlook: Beyond GitHub

+

There are lots of reasons why people might not want to use the GitHub infrastructure owned by Microsoft for their SKOS publication workflows. That’s why we will be looking into replacing as much as possible of this workflow by generic git-based tooling for triggering the build. The goal is to support such an easy SKOS publishing workflow on other forges like GitLab or Forgejo. The work on this happens around this issue: https://github.com/skohub-io/skohub-pages/issues/19

+

Let us know if you have some good implementation ideas or more wishes for future development!


A blog for SkoHub. This blog is maintained by the SkoHub Community.

+ + \ No newline at end of file diff --git a/2cca2479-adaf2bdc94643feadca8.js b/2cca2479-adaf2bdc94643feadca8.js new file mode 100644 index 0000000..a77df5d --- /dev/null +++ b/2cca2479-adaf2bdc94643feadca8.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkskohub_blog=self.webpackChunkskohub_blog||[]).push([[948],{3024:function(c,n,o){o.d(n,{DRb:function(){return i},kyk:function(){return e},zhw:function(){return f}});var f={prefix:"fab",iconName:"github",icon:[496,512,[],"f09b","M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"]},i={prefix:"fab",iconName:"discourse",icon:[448,512,[],"f393","M225.9 32C103.3 32 0 130.5 0 252.1 0 256 .1 480 .1 480l225.8-.2c122.7 0 222.1-102.3 222.1-223.9C448 134.3 348.6 32 225.9 32zM224 384c-19.4 0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z"]},e={prefix:"fab",iconName:"mastodon",icon:[448,512,[],"f4f6","M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z"]}}}]); +//# sourceMappingURL=2cca2479-adaf2bdc94643feadca8.js.map \ No newline at end of file diff --git a/2cca2479-adaf2bdc94643feadca8.js.map b/2cca2479-adaf2bdc94643feadca8.js.map new file mode 100644 index 0000000..6beb190 --- /dev/null +++ b/2cca2479-adaf2bdc94643feadca8.js.map @@ -0,0 +1 @@ +{"version":3,"file":"2cca2479-adaf2bdc94643feadca8.js","mappings":"mMAAA,IAwgEIA,EAAW,CACbC,OAAQ,MACRC,SAAU,SACVC,KAAM,CAAC,IAAK,IAAK,GAAI,OAAQ,6xCA+L3BC,EAAc,CAChBH,OAAQ,MACRC,SAAU,YACVC,KAAM,CAAC,IAAK,IAAK,GAAI,OAAQ,4QAO3BE,EAAa,CACfJ,OAAQ,MACRC,SAAU,WACVC,KAAM,CAAC,IAAK,IAAK,GAAI,OAAQ,2mB","sources":["webpack://skohub-blog/./node_modules/@fortawesome/free-brands-svg-icons/index.mjs"],"sourcesContent":["var prefix = \"fab\";\nvar faMonero = {\n prefix: 'fab',\n iconName: 'monero',\n icon: [496, 512, [], \"f3d0\", \"M352 384h108.4C417 455.9 338.1 504 248 504S79 455.9 35.6 384H144V256.2L248 361l104-105v128zM88 336V128l159.4 159.4L408 128v208h74.8c8.5-25.1 13.2-52 13.2-80C496 119 385 8 248 8S0 119 0 256c0 28 4.6 54.9 13.2 80H88z\"]\n};\nvar faHooli = {\n prefix: 'fab',\n iconName: 'hooli',\n icon: [640, 512, [], \"f427\", \"M144.5 352l38.3.8c-13.2-4.6-26-10.2-38.3-16.8zm57.7-5.3v5.3l-19.4.8c36.5 12.5 69.9 14.2 94.7 7.2-19.9.2-45.8-2.6-75.3-13.3zm408.9-115.2c15.9 0 28.9-12.9 28.9-28.9s-12.9-24.5-28.9-24.5c-15.9 0-28.9 8.6-28.9 24.5s12.9 28.9 28.9 28.9zm-29 120.5H640V241.5h-57.9zm-73.7 0h57.9V156.7L508.4 184zm-31-119.4c-18.2-18.2-50.4-17.1-50.4-17.1s-32.3-1.1-50.4 17.1c-18.2 18.2-16.8 33.9-16.8 52.6s-1.4 34.3 16.8 52.5 50.4 17.1 50.4 17.1 32.3 1.1 50.4-17.1c18.2-18.2 16.8-33.8 16.8-52.5-.1-18.8 1.3-34.5-16.8-52.6zm-39.8 71.9c0 3.6-1.8 12.5-10.7 12.5s-10.7-8.9-10.7-12.5v-40.4c0-8.7 7.3-10.9 10.7-10.9s10.7 2.1 10.7 10.9zm-106.2-71.9c-18.2-18.2-50.4-17.1-50.4-17.1s-32.2-1.1-50.4 17.1c-1.9 1.9-3.7 3.9-5.3 6-38.2-29.6-72.5-46.5-102.1-61.1v-20.7l-22.5 10.6c-54.4-22.1-89-18.2-97.3.1 0 0-24.9 32.8 61.8 110.8V352h57.9v-28.6c-6.5-4.2-13-8.7-19.4-13.6-14.8-11.2-27.4-21.6-38.4-31.4v-31c13.1 14.7 30.5 31.4 53.4 50.3l4.5 3.6v-29.8c0-6.9 1.7-18.2 10.8-18.2s10.6 6.9 10.6 15V317c18 12.2 37.3 22.1 57.7 29.6v-93.9c0-18.7-13.4-37.4-40.6-37.4-15.8-.1-30.5 8.2-38.5 21.9v-54.3c41.9 20.9 83.9 46.5 99.9 58.3-10.2 14.6-9.3 28.1-9.3 43.7 0 18.7-1.4 34.3 16.8 52.5s50.4 17.1 50.4 17.1 32.3 1.1 50.4-17.1c18.2-18.2 16.7-33.8 16.7-52.5 0-18.5 1.5-34.2-16.7-52.3zM65.2 184v63.3c-48.7-54.5-38.9-76-35.2-79.1 13.5-11.4 37.5-8 64.4 2.1zm226.5 120.5c0 3.6-1.8 12.5-10.7 12.5s-10.7-8.9-10.7-12.5v-40.4c0-8.7 7.3-10.9 10.7-10.9s10.7 2.1 10.7 10.9z\"]\n};\nvar faYelp = {\n prefix: 'fab',\n iconName: 'yelp',\n icon: [384, 512, [], \"f1e9\", \"M42.9 240.32l99.62 48.61c19.2 9.4 16.2 37.51-4.5 42.71L30.5 358.45a22.79 22.79 0 0 1-28.21-19.6 197.16 197.16 0 0 1 9-85.32 22.8 22.8 0 0 1 31.61-13.21zm44 239.25a199.45 199.45 0 0 0 79.42 32.11A22.78 22.78 0 0 0 192.94 490l3.9-110.82c.7-21.3-25.5-31.91-39.81-16.1l-74.21 82.4a22.82 22.82 0 0 0 4.09 34.09zm145.34-109.92l58.81 94a22.93 22.93 0 0 0 34 5.5 198.36 198.36 0 0 0 52.71-67.61A23 23 0 0 0 364.17 370l-105.42-34.26c-20.31-6.5-37.81 15.8-26.51 33.91zm148.33-132.23a197.44 197.44 0 0 0-50.41-69.31 22.85 22.85 0 0 0-34 4.4l-62 91.92c-11.9 17.7 4.7 40.61 25.2 34.71L366 268.63a23 23 0 0 0 14.61-31.21zM62.11 30.18a22.86 22.86 0 0 0-9.9 32l104.12 180.44c11.7 20.2 42.61 11.9 42.61-11.4V22.88a22.67 22.67 0 0 0-24.5-22.8 320.37 320.37 0 0 0-112.33 30.1z\"]\n};\nvar faCcVisa = {\n prefix: 'fab',\n iconName: 'cc-visa',\n icon: [576, 512, [], \"f1f0\", \"M470.1 231.3s7.6 37.2 9.3 45H446c3.3-8.9 16-43.5 16-43.5-.2.3 3.3-9.1 5.3-14.9l2.8 13.4zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM152.5 331.2L215.7 176h-42.5l-39.3 106-4.3-21.5-14-71.4c-2.3-9.9-9.4-12.7-18.2-13.1H32.7l-.7 3.1c15.8 4 29.9 9.8 42.2 17.1l35.8 135h42.5zm94.4.2L272.1 176h-40.2l-25.1 155.4h40.1zm139.9-50.8c.2-17.7-10.6-31.2-33.7-42.3-14.1-7.1-22.7-11.9-22.7-19.2.2-6.6 7.3-13.4 23.1-13.4 13.1-.3 22.7 2.8 29.9 5.9l3.6 1.7 5.5-33.6c-7.9-3.1-20.5-6.6-36-6.6-39.7 0-67.6 21.2-67.8 51.4-.3 22.3 20 34.7 35.2 42.2 15.5 7.6 20.8 12.6 20.8 19.3-.2 10.4-12.6 15.2-24.1 15.2-16 0-24.6-2.5-37.7-8.3l-5.3-2.5-5.6 34.9c9.4 4.3 26.8 8.1 44.8 8.3 42.2.1 69.7-20.8 70-53zM528 331.4L495.6 176h-31.1c-9.6 0-16.9 2.8-21 12.9l-59.7 142.5H426s6.9-19.2 8.4-23.3H486c1.2 5.5 4.8 23.3 4.8 23.3H528z\"]\n};\nvar faLastfm = {\n prefix: 'fab',\n iconName: 'lastfm',\n icon: [512, 512, [], \"f202\", \"M225.8 367.1l-18.8-51s-30.5 34-76.2 34c-40.5 0-69.2-35.2-69.2-91.5 0-72.1 36.4-97.9 72.1-97.9 66.5 0 74.8 53.3 100.9 134.9 18.8 56.9 54 102.6 155.4 102.6 72.7 0 122-22.3 122-80.9 0-72.9-62.7-80.6-115-92.1-25.8-5.9-33.4-16.4-33.4-34 0-19.9 15.8-31.7 41.6-31.7 28.2 0 43.4 10.6 45.7 35.8l58.6-7c-4.7-52.8-41.1-74.5-100.9-74.5-52.8 0-104.4 19.9-104.4 83.9 0 39.9 19.4 65.1 68 76.8 44.9 10.6 79.8 13.8 79.8 45.7 0 21.7-21.1 30.5-61 30.5-59.2 0-83.9-31.1-97.9-73.9-32-96.8-43.6-163-161.3-163C45.7 113.8 0 168.3 0 261c0 89.1 45.7 137.2 127.9 137.2 66.2 0 97.9-31.1 97.9-31.1z\"]\n};\nvar faShopware = {\n prefix: 'fab',\n iconName: 'shopware',\n icon: [512, 512, [], \"f5b5\", \"M403.5 455.41A246.17 246.17 0 0 1 256 504C118.81 504 8 393 8 256 8 118.81 119 8 256 8a247.39 247.39 0 0 1 165.7 63.5 3.57 3.57 0 0 1-2.86 6.18A418.62 418.62 0 0 0 362.13 74c-129.36 0-222.4 53.47-222.4 155.35 0 109 92.13 145.88 176.83 178.73 33.64 13 65.4 25.36 87 41.59a3.58 3.58 0 0 1 0 5.72zM503 233.09a3.64 3.64 0 0 0-1.27-2.44c-51.76-43-93.62-60.48-144.48-60.48-84.13 0-80.25 52.17-80.25 53.63 0 42.6 52.06 62 112.34 84.49 31.07 11.59 63.19 23.57 92.68 39.93a3.57 3.57 0 0 0 5-1.82A249 249 0 0 0 503 233.09z\"]\n};\nvar faCreativeCommonsNc = {\n prefix: 'fab',\n iconName: 'creative-commons-nc',\n icon: [496, 512, [], \"f4e8\", \"M247.6 8C387.4 8 496 115.9 496 256c0 147.2-118.5 248-248.4 248C113.1 504 0 393.2 0 256 0 123.1 104.7 8 247.6 8zM55.8 189.1c-7.4 20.4-11.1 42.7-11.1 66.9 0 110.9 92.1 202.4 203.7 202.4 122.4 0 177.2-101.8 178.5-104.1l-93.4-41.6c-7.7 37.1-41.2 53-68.2 55.4v38.1h-28.8V368c-27.5-.3-52.6-10.2-75.3-29.7l34.1-34.5c31.7 29.4 86.4 31.8 86.4-2.2 0-6.2-2.2-11.2-6.6-15.1-14.2-6-1.8-.1-219.3-97.4zM248.4 52.3c-38.4 0-112.4 8.7-170.5 93l94.8 42.5c10-31.3 40.4-42.9 63.8-44.3v-38.1h28.8v38.1c22.7 1.2 43.4 8.9 62 23L295 199.7c-42.7-29.9-83.5-8-70 11.1 53.4 24.1 43.8 19.8 93 41.6l127.1 56.7c4.1-17.4 6.2-35.1 6.2-53.1 0-57-19.8-105-59.3-143.9-39.3-39.9-87.2-59.8-143.6-59.8z\"]\n};\nvar faAws = {\n prefix: 'fab',\n iconName: 'aws',\n icon: [640, 512, [], \"f375\", \"M180.41 203.01c-.72 22.65 10.6 32.68 10.88 39.05a8.164 8.164 0 0 1-4.1 6.27l-12.8 8.96a10.66 10.66 0 0 1-5.63 1.92c-.43-.02-8.19 1.83-20.48-25.61a78.608 78.608 0 0 1-62.61 29.45c-16.28.89-60.4-9.24-58.13-56.21-1.59-38.28 34.06-62.06 70.93-60.05 7.1.02 21.6.37 46.99 6.27v-15.62c2.69-26.46-14.7-46.99-44.81-43.91-2.4.01-19.4-.5-45.84 10.11-7.36 3.38-8.3 2.82-10.75 2.82-7.41 0-4.36-21.48-2.94-24.2 5.21-6.4 35.86-18.35 65.94-18.18a76.857 76.857 0 0 1 55.69 17.28 70.285 70.285 0 0 1 17.67 52.36l-.01 69.29zM93.99 235.4c32.43-.47 46.16-19.97 49.29-30.47 2.46-10.05 2.05-16.41 2.05-27.4-9.67-2.32-23.59-4.85-39.56-4.87-15.15-1.14-42.82 5.63-41.74 32.26-1.24 16.79 11.12 31.4 29.96 30.48zm170.92 23.05c-7.86.72-11.52-4.86-12.68-10.37l-49.8-164.65c-.97-2.78-1.61-5.65-1.92-8.58a4.61 4.61 0 0 1 3.86-5.25c.24-.04-2.13 0 22.25 0 8.78-.88 11.64 6.03 12.55 10.37l35.72 140.83 33.16-140.83c.53-3.22 2.94-11.07 12.8-10.24h17.16c2.17-.18 11.11-.5 12.68 10.37l33.42 142.63L420.98 80.1c.48-2.18 2.72-11.37 12.68-10.37h19.72c.85-.13 6.15-.81 5.25 8.58-.43 1.85 3.41-10.66-52.75 169.9-1.15 5.51-4.82 11.09-12.68 10.37h-18.69c-10.94 1.15-12.51-9.66-12.68-10.75L328.67 110.7l-32.78 136.99c-.16 1.09-1.73 11.9-12.68 10.75h-18.3zm273.48 5.63c-5.88.01-33.92-.3-57.36-12.29a12.802 12.802 0 0 1-7.81-11.91v-10.75c0-8.45 6.2-6.9 8.83-5.89 10.04 4.06 16.48 7.14 28.81 9.6 36.65 7.53 52.77-2.3 56.72-4.48 13.15-7.81 14.19-25.68 5.25-34.95-10.48-8.79-15.48-9.12-53.13-21-4.64-1.29-43.7-13.61-43.79-52.36-.61-28.24 25.05-56.18 69.52-55.95 12.67-.01 46.43 4.13 55.57 15.62 1.35 2.09 2.02 4.55 1.92 7.04v10.11c0 4.44-1.62 6.66-4.87 6.66-7.71-.86-21.39-11.17-49.16-10.75-6.89-.36-39.89.91-38.41 24.97-.43 18.96 26.61 26.07 29.7 26.89 36.46 10.97 48.65 12.79 63.12 29.58 17.14 22.25 7.9 48.3 4.35 55.44-19.08 37.49-68.42 34.44-69.26 34.42zm40.2 104.86c-70.03 51.72-171.69 79.25-258.49 79.25A469.127 469.127 0 0 1 2.83 327.46c-6.53-5.89-.77-13.96 7.17-9.47a637.37 637.37 0 0 0 316.88 84.12 630.22 630.22 0 0 0 241.59-49.55c11.78-5 21.77 7.8 10.12 16.38zm29.19-33.29c-8.96-11.52-59.28-5.38-81.81-2.69-6.79.77-7.94-5.12-1.79-9.47 40.07-28.17 105.88-20.1 113.44-10.63 7.55 9.47-2.05 75.41-39.56 106.91-5.76 4.87-11.27 2.3-8.71-4.1 8.44-21.25 27.39-68.49 18.43-80.02z\"]\n};\nvar faRedhat = {\n prefix: 'fab',\n iconName: 'redhat',\n icon: [512, 512, [], \"f7bc\", \"M341.52 285.56c33.65 0 82.34-6.94 82.34-47 .22-6.74.86-1.82-20.88-96.24-4.62-19.15-8.68-27.84-42.31-44.65-26.09-13.34-82.92-35.37-99.73-35.37-15.66 0-20.2 20.17-38.87 20.17-18 0-31.31-15.06-48.12-15.06-16.14 0-26.66 11-34.78 33.62-27.5 77.55-26.28 74.27-26.12 78.27 0 24.8 97.64 106.11 228.47 106.11M429 254.84c4.65 22 4.65 24.35 4.65 27.25 0 37.66-42.33 58.56-98 58.56-125.74.08-235.91-73.65-235.91-122.33a49.55 49.55 0 0 1 4.06-19.72C58.56 200.86 0 208.93 0 260.63c0 84.67 200.63 189 359.49 189 121.79 0 152.51-55.08 152.51-98.58 0-34.21-29.59-73.05-82.93-96.24\"]\n};\nvar faYoast = {\n prefix: 'fab',\n iconName: 'yoast',\n icon: [448, 512, [], \"f2b1\", \"M91.3 76h186l-7 18.9h-179c-39.7 0-71.9 31.6-71.9 70.3v205.4c0 35.4 24.9 70.3 84 70.3V460H91.3C41.2 460 0 419.8 0 370.5V165.2C0 115.9 40.7 76 91.3 76zm229.1-56h66.5C243.1 398.1 241.2 418.9 202.2 459.3c-20.8 21.6-49.3 31.7-78.3 32.7v-51.1c49.2-7.7 64.6-49.9 64.6-75.3 0-20.1.6-12.6-82.1-223.2h61.4L218.2 299 320.4 20zM448 161.5V460H234c6.6-9.6 10.7-16.3 12.1-19.4h182.5V161.5c0-32.5-17.1-51.9-48.2-62.9l6.7-17.6c41.7 13.6 60.9 43.1 60.9 80.5z\"]\n};\nvar faCloudflare = {\n prefix: 'fab',\n iconName: 'cloudflare',\n icon: [640, 512, [], \"e07d\", \"M407.906,319.913l-230.8-2.928a4.58,4.58,0,0,1-3.632-1.926,4.648,4.648,0,0,1-.494-4.147,6.143,6.143,0,0,1,5.361-4.076L411.281,303.9c27.631-1.26,57.546-23.574,68.022-50.784l13.286-34.542a7.944,7.944,0,0,0,.524-2.936,7.735,7.735,0,0,0-.164-1.631A151.91,151.91,0,0,0,201.257,198.4,68.12,68.12,0,0,0,94.2,269.59C41.924,271.106,0,313.728,0,366.12a96.054,96.054,0,0,0,1.029,13.958,4.508,4.508,0,0,0,4.445,3.871l426.1.051c.043,0,.08-.019.122-.02a5.606,5.606,0,0,0,5.271-4l3.273-11.265c3.9-13.4,2.448-25.8-4.1-34.9C430.124,325.423,420.09,320.487,407.906,319.913ZM513.856,221.1c-2.141,0-4.271.062-6.391.164a3.771,3.771,0,0,0-3.324,2.653l-9.077,31.193c-3.9,13.4-2.449,25.786,4.1,34.89,6.02,8.4,16.054,13.323,28.238,13.9l49.2,2.939a4.491,4.491,0,0,1,3.51,1.894,4.64,4.64,0,0,1,.514,4.169,6.153,6.153,0,0,1-5.351,4.075l-51.125,2.939c-27.754,1.27-57.669,23.574-68.145,50.784l-3.695,9.606a2.716,2.716,0,0,0,2.427,3.68c.046,0,.088.017.136.017h175.91a4.69,4.69,0,0,0,4.539-3.37,124.807,124.807,0,0,0,4.682-34C640,277.3,583.524,221.1,513.856,221.1Z\"]\n};\nvar faUps = {\n prefix: 'fab',\n iconName: 'ups',\n icon: [384, 512, [], \"f7e0\", \"M103.2 303c-5.2 3.6-32.6 13.1-32.6-19V180H37.9v102.6c0 74.9 80.2 51.1 97.9 39V180h-32.6zM4 74.82v220.9c0 103.7 74.9 135.2 187.7 184.1 112.4-48.9 187.7-80.2 187.7-184.1V74.82c-116.3-61.6-281.8-49.6-375.4 0zm358.1 220.9c0 86.6-53.2 113.6-170.4 165.3-117.5-51.8-170.5-78.7-170.5-165.3v-126.4c102.3-93.8 231.6-100 340.9-89.8zm-209.6-107.4v212.8h32.7v-68.7c24.4 7.3 71.7-2.6 71.7-78.5 0-97.4-80.7-80.92-104.4-65.6zm32.7 117.3v-100.3c8.4-4.2 38.4-12.7 38.4 49.3 0 67.9-36.4 51.8-38.4 51zm79.1-86.4c.1 47.3 51.6 42.5 52.2 70.4.6 23.5-30.4 23-50.8 4.9v30.1c36.2 21.5 81.9 8.1 83.2-33.5 1.7-51.5-54.1-46.6-53.4-73.2.6-20.3 30.6-20.5 48.5-2.2v-28.4c-28.5-22-79.9-9.2-79.7 31.9z\"]\n};\nvar faWpexplorer = {\n prefix: 'fab',\n iconName: 'wpexplorer',\n icon: [512, 512, [], \"f2de\", \"M512 256c0 141.2-114.7 256-256 256C114.8 512 0 397.3 0 256S114.7 0 256 0s256 114.7 256 256zm-32 0c0-123.2-100.3-224-224-224C132.5 32 32 132.5 32 256s100.5 224 224 224 224-100.5 224-224zM160.9 124.6l86.9 37.1-37.1 86.9-86.9-37.1 37.1-86.9zm110 169.1l46.6 94h-14.6l-50-100-48.9 100h-14l51.1-106.9-22.3-9.4 6-14 68.6 29.1-6 14.3-16.5-7.1zm-11.8-116.3l68.6 29.4-29.4 68.3L230 246l29.1-68.6zm80.3 42.9l54.6 23.1-23.4 54.3-54.3-23.1 23.1-54.3z\"]\n};\nvar faDyalog = {\n prefix: 'fab',\n iconName: 'dyalog',\n icon: [416, 512, [], \"f399\", \"M0 32v119.2h64V96h107.2C284.6 96 352 176.2 352 255.9 352 332 293.4 416 171.2 416H0v64h171.2C331.9 480 416 367.3 416 255.9c0-58.7-22.1-113.4-62.3-154.3C308.9 56 245.7 32 171.2 32H0z\"]\n};\nvar faBity = {\n prefix: 'fab',\n iconName: 'bity',\n icon: [496, 512, [], \"f37a\", \"M78.4 67.2C173.8-22 324.5-24 421.5 71c14.3 14.1-6.4 37.1-22.4 21.5-84.8-82.4-215.8-80.3-298.9-3.2-16.3 15.1-36.5-8.3-21.8-22.1zm98.9 418.6c19.3 5.7 29.3-23.6 7.9-30C73 421.9 9.4 306.1 37.7 194.8c5-19.6-24.9-28.1-30.2-7.1-32.1 127.4 41.1 259.8 169.8 298.1zm148.1-2c121.9-40.2 192.9-166.9 164.4-291-4.5-19.7-34.9-13.8-30 7.9 24.2 107.7-37.1 217.9-143.2 253.4-21.2 7-10.4 36 8.8 29.7zm-62.9-79l.2-71.8c0-8.2-6.6-14.8-14.8-14.8-8.2 0-14.8 6.7-14.8 14.8l-.2 71.8c0 8.2 6.6 14.8 14.8 14.8s14.8-6.6 14.8-14.8zm71-269c2.1 90.9 4.7 131.9-85.5 132.5-92.5-.7-86.9-44.3-85.5-132.5 0-21.8-32.5-19.6-32.5 0v71.6c0 69.3 60.7 90.9 118 90.1 57.3.8 118-20.8 118-90.1v-71.6c0-19.6-32.5-21.8-32.5 0z\"]\n};\nvar faStackpath = {\n prefix: 'fab',\n iconName: 'stackpath',\n icon: [448, 512, [], \"f842\", \"M244.6 232.4c0 8.5-4.26 20.49-21.34 20.49h-19.61v-41.47h19.61c17.13 0 21.34 12.36 21.34 20.98zM448 32v448H0V32zM151.3 287.84c0-21.24-12.12-34.54-46.72-44.85-20.57-7.41-26-10.91-26-18.63s7-14.61 20.41-14.61c14.09 0 20.79 8.45 20.79 18.35h30.7l.19-.57c.5-19.57-15.06-41.65-51.12-41.65-23.37 0-52.55 10.75-52.55 38.29 0 19.4 9.25 31.29 50.74 44.37 17.26 6.15 21.91 10.4 21.91 19.48 0 15.2-19.13 14.23-19.47 14.23-20.4 0-25.65-9.1-25.65-21.9h-30.8l-.18.56c-.68 31.32 28.38 45.22 56.63 45.22 29.98 0 51.12-13.55 51.12-38.29zm125.38-55.63c0-25.3-18.43-45.46-53.42-45.46h-51.78v138.18h32.17v-47.36h19.61c30.25 0 53.42-15.95 53.42-45.36zM297.94 325L347 186.78h-31.09L268 325zm106.52-138.22h-31.09L325.46 325h29.94z\"]\n};\nvar faBuysellads = {\n prefix: 'fab',\n iconName: 'buysellads',\n icon: [448, 512, [], \"f20d\", \"M224 150.7l42.9 160.7h-85.8L224 150.7zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-65.3 325.3l-94.5-298.7H159.8L65.3 405.3H156l111.7-91.6 24.2 91.6h90.8z\"]\n};\nvar faFirstOrder = {\n prefix: 'fab',\n iconName: 'first-order',\n icon: [448, 512, [], \"f2b0\", \"M12.9 229.2c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4h-.2zM224 96.6c-7.1 0-14.6.6-21.4 1.7l3.7 67.4-22-64c-14.3 3.7-27.7 9.4-40 16.6l29.4 61.4-45.1-50.9c-11.4 8.9-21.7 19.1-30.6 30.9l50.6 45.4-61.1-29.7c-7.1 12.3-12.9 25.7-16.6 40l64.3 22.6-68-4c-.9 7.1-1.4 14.6-1.4 22s.6 14.6 1.4 21.7l67.7-4-64 22.6c3.7 14.3 9.4 27.7 16.6 40.3l61.1-29.7L97.7 352c8.9 11.7 19.1 22.3 30.9 30.9l44.9-50.9-29.5 61.4c12.3 7.4 25.7 13.1 40 16.9l22.3-64.6-4 68c7.1 1.1 14.6 1.7 21.7 1.7 7.4 0 14.6-.6 21.7-1.7l-4-68.6 22.6 65.1c14.3-4 27.7-9.4 40-16.9L274.9 332l44.9 50.9c11.7-8.9 22-19.1 30.6-30.9l-50.6-45.1 61.1 29.4c7.1-12.3 12.9-25.7 16.6-40.3l-64-22.3 67.4 4c1.1-7.1 1.4-14.3 1.4-21.7s-.3-14.9-1.4-22l-67.7 4 64-22.3c-3.7-14.3-9.1-28-16.6-40.3l-60.9 29.7 50.6-45.4c-8.9-11.7-19.1-22-30.6-30.9l-45.1 50.9 29.4-61.1c-12.3-7.4-25.7-13.1-40-16.9L241.7 166l4-67.7c-7.1-1.2-14.3-1.7-21.7-1.7zM443.4 128v256L224 512 4.6 384V128L224 0l219.4 128zm-17.1 10.3L224 20.9 21.7 138.3v235.1L224 491.1l202.3-117.7V138.3zM224 37.1l187.7 109.4v218.9L224 474.9 36.3 365.4V146.6L224 37.1zm0 50.9c-92.3 0-166.9 75.1-166.9 168 0 92.6 74.6 167.7 166.9 167.7 92 0 166.9-75.1 166.9-167.7 0-92.9-74.9-168-166.9-168z\"]\n};\nvar faModx = {\n prefix: 'fab',\n iconName: 'modx',\n icon: [448, 512, [], \"f285\", \"M356 241.8l36.7 23.7V480l-133-83.8L356 241.8zM440 75H226.3l-23 37.8 153.5 96.5L440 75zm-89 142.8L55.2 32v214.5l46 29L351 217.8zM97 294.2L8 437h213.7l125-200.5L97 294.2z\"]\n};\nvar faGuilded = {\n prefix: 'fab',\n iconName: 'guilded',\n icon: [448, 512, [], \"e07e\", \"M443.427,64H4.571c0,103.26,22.192,180.06,43.418,222.358C112.046,414.135,224,448,225.256,448a312.824,312.824,0,0,0,140.55-103.477c25.907-33.923,53.1-87.19,65.916-145.761H171.833c4.14,36.429,22.177,67.946,45.1,86.944h88.589c-17.012,28.213-48.186,54.4-80.456,69.482-31.232-13.259-69.09-46.544-96.548-98.362-26.726-53.833-27.092-105.883-27.092-105.883H437.573A625.91,625.91,0,0,0,443.427,64Z\"]\n};\nvar faVnv = {\n prefix: 'fab',\n iconName: 'vnv',\n icon: [640, 512, [], \"f40b\", \"M104.9 352c-34.1 0-46.4-30.4-46.4-30.4L2.6 210.1S-7.8 192 13 192h32.8c10.4 0 13.2 8.7 18.8 18.1l36.7 74.5s5.2 13.1 21.1 13.1 21.1-13.1 21.1-13.1l36.7-74.5c5.6-9.5 8.4-18.1 18.8-18.1h32.8c20.8 0 10.4 18.1 10.4 18.1l-55.8 111.5S174.2 352 140 352h-35.1zm395 0c-34.1 0-46.4-30.4-46.4-30.4l-55.9-111.5S387.2 192 408 192h32.8c10.4 0 13.2 8.7 18.8 18.1l36.7 74.5s5.2 13.1 21.1 13.1 21.1-13.1 21.1-13.1l36.8-74.5c5.6-9.5 8.4-18.1 18.8-18.1H627c20.8 0 10.4 18.1 10.4 18.1l-55.9 111.5S569.3 352 535.1 352h-35.2zM337.6 192c34.1 0 46.4 30.4 46.4 30.4l55.9 111.5s10.4 18.1-10.4 18.1h-32.8c-10.4 0-13.2-8.7-18.8-18.1l-36.7-74.5s-5.2-13.1-21.1-13.1c-15.9 0-21.1 13.1-21.1 13.1l-36.7 74.5c-5.6 9.4-8.4 18.1-18.8 18.1h-32.9c-20.8 0-10.4-18.1-10.4-18.1l55.9-111.5s12.2-30.4 46.4-30.4h35.1z\"]\n};\nvar faSquareJs = {\n prefix: 'fab',\n iconName: 'square-js',\n icon: [448, 512, [\"js-square\"], \"f3b9\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM243.8 381.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L368 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z\"]\n};\nvar faJsSquare = faSquareJs;\nvar faMicrosoft = {\n prefix: 'fab',\n iconName: 'microsoft',\n icon: [448, 512, [], \"f3ca\", \"M0 32h214.6v214.6H0V32zm233.4 0H448v214.6H233.4V32zM0 265.4h214.6V480H0V265.4zm233.4 0H448V480H233.4V265.4z\"]\n};\nvar faQq = {\n prefix: 'fab',\n iconName: 'qq',\n icon: [448, 512, [], \"f1d6\", \"M433.754 420.445c-11.526 1.393-44.86-52.741-44.86-52.741 0 31.345-16.136 72.247-51.051 101.786 16.842 5.192 54.843 19.167 45.803 34.421-7.316 12.343-125.51 7.881-159.632 4.037-34.122 3.844-152.316 8.306-159.632-4.037-9.045-15.25 28.918-29.214 45.783-34.415-34.92-29.539-51.059-70.445-51.059-101.792 0 0-33.334 54.134-44.859 52.741-5.37-.65-12.424-29.644 9.347-99.704 10.261-33.024 21.995-60.478 40.144-105.779C60.683 98.063 108.982.006 224 0c113.737.006 163.156 96.133 160.264 214.963 18.118 45.223 29.912 72.85 40.144 105.778 21.768 70.06 14.716 99.053 9.346 99.704z\"]\n};\nvar faOrcid = {\n prefix: 'fab',\n iconName: 'orcid',\n icon: [512, 512, [], \"f8d2\", \"M294.75 188.19h-45.92V342h47.47c67.62 0 83.12-51.34 83.12-76.91 0-41.64-26.54-76.9-84.67-76.9zM256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm-80.79 360.76h-29.84v-207.5h29.84zm-14.92-231.14a19.57 19.57 0 1 1 19.57-19.57 19.64 19.64 0 0 1-19.57 19.57zM300 369h-81V161.26h80.6c76.73 0 110.44 54.83 110.44 103.85C410 318.39 368.38 369 300 369z\"]\n};\nvar faJava = {\n prefix: 'fab',\n iconName: 'java',\n icon: [384, 512, [], \"f4e4\", \"M277.74 312.9c9.8-6.7 23.4-12.5 23.4-12.5s-38.7 7-77.2 10.2c-47.1 3.9-97.7 4.7-123.1 1.3-60.1-8 33-30.1 33-30.1s-36.1-2.4-80.6 19c-52.5 25.4 130 37 224.5 12.1zm-85.4-32.1c-19-42.7-83.1-80.2 0-145.8C296 53.2 242.84 0 242.84 0c21.5 84.5-75.6 110.1-110.7 162.6-23.9 35.9 11.7 74.4 60.2 118.2zm114.6-176.2c.1 0-175.2 43.8-91.5 140.2 24.7 28.4-6.5 54-6.5 54s62.7-32.4 33.9-72.9c-26.9-37.8-47.5-56.6 64.1-121.3zm-6.1 270.5a12.19 12.19 0 0 1-2 2.6c128.3-33.7 81.1-118.9 19.8-97.3a17.33 17.33 0 0 0-8.2 6.3 70.45 70.45 0 0 1 11-3c31-6.5 75.5 41.5-20.6 91.4zM348 437.4s14.5 11.9-15.9 21.2c-57.9 17.5-240.8 22.8-291.6.7-18.3-7.9 16-19 26.8-21.3 11.2-2.4 17.7-2 17.7-2-20.3-14.3-131.3 28.1-56.4 40.2C232.84 509.4 401 461.3 348 437.4zM124.44 396c-78.7 22 47.9 67.4 148.1 24.5a185.89 185.89 0 0 1-28.2-13.8c-44.7 8.5-65.4 9.1-106 4.5-33.5-3.8-13.9-15.2-13.9-15.2zm179.8 97.2c-78.7 14.8-175.8 13.1-233.3 3.6 0-.1 11.8 9.7 72.4 13.6 92.2 5.9 233.8-3.3 237.1-46.9 0 0-6.4 16.5-76.2 29.7zM260.64 353c-59.2 11.4-93.5 11.1-136.8 6.6-33.5-3.5-11.6-19.7-11.6-19.7-86.8 28.8 48.2 61.4 169.5 25.9a60.37 60.37 0 0 1-21.1-12.8z\"]\n};\nvar faInvision = {\n prefix: 'fab',\n iconName: 'invision',\n icon: [448, 512, [], \"f7b0\", \"M407.4 32H40.6C18.2 32 0 50.2 0 72.6v366.8C0 461.8 18.2 480 40.6 480h366.8c22.4 0 40.6-18.2 40.6-40.6V72.6c0-22.4-18.2-40.6-40.6-40.6zM176.1 145.6c.4 23.4-22.4 27.3-26.6 27.4-14.9 0-27.1-12-27.1-27 .1-35.2 53.1-35.5 53.7-.4zM332.8 377c-65.6 0-34.1-74-25-106.6 14.1-46.4-45.2-59-59.9.7l-25.8 103.3H177l8.1-32.5c-31.5 51.8-94.6 44.4-94.6-4.3.1-14.3.9-14 23-104.1H81.7l9.7-35.6h76.4c-33.6 133.7-32.6 126.9-32.9 138.2 0 20.9 40.9 13.5 57.4-23.2l19.8-79.4h-32.3l9.7-35.6h68.8l-8.9 40.5c40.5-75.5 127.9-47.8 101.8 38-14.2 51.1-14.6 50.7-14.9 58.8 0 15.5 17.5 22.6 31.8-16.9L386 325c-10.5 36.7-29.4 52-53.2 52z\"]\n};\nvar faCreativeCommonsPdAlt = {\n prefix: 'fab',\n iconName: 'creative-commons-pd-alt',\n icon: [496, 512, [], \"f4ed\", \"M247.6 8C104.7 8 0 123.1 0 256c0 138.5 113.6 248 247.6 248C377.5 504 496 403.1 496 256 496 118.1 389.4 8 247.6 8zm.8 450.8c-112.5 0-203.7-93-203.7-202.8 0-105.4 85.5-203.3 203.7-203.3 112.6 0 202.9 89.5 202.8 203.3 0 121.7-99.6 202.8-202.8 202.8zM316.7 186h-53.2v137.2h53.2c21.4 0 70-5.1 70-68.6 0-63.4-48.6-68.6-70-68.6zm.8 108.5h-19.9v-79.7l19.4-.1c3.8 0 35-2.1 35 39.9 0 24.6-10.5 39.9-34.5 39.9zM203.7 186h-68.2v137.3h34.6V279h27c54.1 0 57.1-37.5 57.1-46.5 0-31-16.8-46.5-50.5-46.5zm-4.9 67.3h-29.2v-41.6h28.3c30.9 0 28.8 41.6.9 41.6z\"]\n};\nvar faCentercode = {\n prefix: 'fab',\n iconName: 'centercode',\n icon: [512, 512, [], \"f380\", \"M329.2 268.6c-3.8 35.2-35.4 60.6-70.6 56.8-35.2-3.8-60.6-35.4-56.8-70.6 3.8-35.2 35.4-60.6 70.6-56.8 35.1 3.8 60.6 35.4 56.8 70.6zm-85.8 235.1C96.7 496-8.2 365.5 10.1 224.3c11.2-86.6 65.8-156.9 139.1-192 161-77.1 349.7 37.4 354.7 216.6 4.1 147-118.4 262.2-260.5 254.8zm179.9-180c27.9-118-160.5-205.9-237.2-234.2-57.5 56.3-69.1 188.6-33.8 344.4 68.8 15.8 169.1-26.4 271-110.2z\"]\n};\nvar faGlideG = {\n prefix: 'fab',\n iconName: 'glide-g',\n icon: [448, 512, [], \"f2a6\", \"M407.1 211.2c-3.5-1.4-11.6-3.8-15.4-3.8-37.1 0-62.2 16.8-93.5 34.5l-.9-.9c7-47.3 23.5-91.9 23.5-140.4C320.8 29.1 282.6 0 212.4 0 97.3 0 39 113.7 39 198.4 39 286.3 90.3 335 177.6 335c12 0 11-1 11 3.8-16.9 128.9-90.8 133.1-90.8 94.6 0-39.2 45-58.6 45.5-61-.3-12.2-47-27.6-58.9-27.6-33.9.1-52.4 51.2-52.4 79.3C32 476 64.8 512 117.5 512c77.4 0 134-77.8 151.4-145.4 15.1-60.5 11.2-63.3 19.7-67.6 32.2-16.2 57.5-27 93.8-27 17.8 0 30.5 3.7 58.9 8.4 2.9 0 6.7-2.9 6.7-5.8 0-8-33.4-60.5-40.9-63.4zm-175.3-84.4c-9.3 44.7-18.6 89.6-27.8 134.3-2.3 10.2-13.3 7.8-22 7.8-38.3 0-49-41.8-49-73.1 0-47 18-109.3 61.8-133.4 7-4.1 14.8-6.7 22.6-6.7 18.6 0 20 13.3 20 28.7-.1 14.3-2.7 28.5-5.6 42.4z\"]\n};\nvar faDrupal = {\n prefix: 'fab',\n iconName: 'drupal',\n icon: [448, 512, [], \"f1a9\", \"M303.973,108.136C268.2,72.459,234.187,38.35,224.047,0c-9.957,38.35-44.25,72.459-80.019,108.136C90.467,161.7,29.716,222.356,29.716,313.436c-2.337,107.3,82.752,196.18,190.053,198.517S415.948,429.2,418.285,321.9q.091-4.231,0-8.464C418.285,222.356,357.534,161.7,303.973,108.136Zm-174.326,223a130.282,130.282,0,0,0-15.211,24.153,4.978,4.978,0,0,1-3.319,2.766h-1.659c-4.333,0-9.219-8.481-9.219-8.481h0c-1.29-2.028-2.489-4.149-3.687-6.361l-.83-1.752c-11.247-25.72-1.475-62.318-1.475-62.318h0a160.585,160.585,0,0,1,23.231-49.873A290.8,290.8,0,0,1,138.5,201.613l9.219,9.219,43.512,44.434a4.979,4.979,0,0,1,0,6.638L145.78,312.33h0Zm96.612,127.311a67.2,67.2,0,0,1-49.781-111.915c14.2-16.871,31.528-33.464,50.334-55.313,22.309,23.785,36.875,40.1,51.164,57.986a28.413,28.413,0,0,1,2.95,4.425,65.905,65.905,0,0,1,11.984,37.981,66.651,66.651,0,0,1-66.466,66.836ZM352.371,351.6h0a7.743,7.743,0,0,1-6.176,5.347H344.9a11.249,11.249,0,0,1-6.269-5.07h0a348.21,348.21,0,0,0-39.456-48.952L281.387,284.49,222.3,223.185a497.888,497.888,0,0,1-35.4-36.322,12.033,12.033,0,0,0-.922-1.382,35.4,35.4,0,0,1-4.7-9.219V174.51a31.346,31.346,0,0,1,9.218-27.656c11.432-11.431,22.955-22.954,33.833-34.939,11.984,13.275,24.8,26,37.428,38.627h0a530.991,530.991,0,0,1,69.6,79.1,147.494,147.494,0,0,1,27.011,83.8A134.109,134.109,0,0,1,352.371,351.6Z\"]\n};\nvar faHireAHelper = {\n prefix: 'fab',\n iconName: 'hire-a-helper',\n icon: [512, 512, [], \"f3b0\", \"M443.1 0H71.9C67.9 37.3 37.4 67.8 0 71.7v371.5c37.4 4.9 66 32.4 71.9 68.8h372.2c3-36.4 32.5-65.8 67.9-69.8V71.7c-36.4-5.9-65-35.3-68.9-71.7zm-37 404.9c-36.3 0-18.8-2-55.1-2-35.8 0-21 2-56.1 2-5.9 0-4.9-8.2 0-9.8 22.8-7.6 22.9-10.2 24.6-12.8 10.4-15.6 5.9-83 5.9-113 0-5.3-6.4-12.8-13.8-12.8H200.4c-7.4 0-13.8 7.5-13.8 12.8 0 30-4.5 97.4 5.9 113 1.7 2.5 1.8 5.2 24.6 12.8 4.9 1.6 6 9.8 0 9.8-35.1 0-20.3-2-56.1-2-36.3 0-18.8 2-55.1 2-7.9 0-5.8-10.8 0-10.8 10.2-3.4 13.5-3.5 21.7-13.8 7.7-12.9 7.9-44.4 7.9-127.8V151.3c0-22.2-12.2-28.3-28.6-32.4-8.8-2.2-4-11.8 1-11.8 36.5 0 20.6 2 57.1 2 32.7 0 16.5-2 49.2-2 3.3 0 8.5 8.3 1 10.8-4.9 1.6-27.6 3.7-27.6 39.3 0 45.6-.2 55.8 1 68.8 0 1.3 2.3 12.8 12.8 12.8h109.2c10.5 0 12.8-11.5 12.8-12.8 1.2-13 1-23.2 1-68.8 0-35.6-22.7-37.7-27.6-39.3-7.5-2.5-2.3-10.8 1-10.8 32.7 0 16.5 2 49.2 2 36.5 0 20.6-2 57.1-2 4.9 0 9.9 9.6 1 11.8-16.4 4.1-28.6 10.3-28.6 32.4v101.2c0 83.4.1 114.9 7.9 127.8 8.2 10.2 11.4 10.4 21.7 13.8 5.8 0 7.8 10.8 0 10.8z\"]\n};\nvar faCreativeCommonsBy = {\n prefix: 'fab',\n iconName: 'creative-commons-by',\n icon: [496, 512, [], \"f4e7\", \"M314.9 194.4v101.4h-28.3v120.5h-77.1V295.9h-28.3V194.4c0-4.4 1.6-8.2 4.6-11.3 3.1-3.1 6.9-4.7 11.3-4.7H299c4.1 0 7.8 1.6 11.1 4.7 3.1 3.2 4.8 6.9 4.8 11.3zm-101.5-63.7c0-23.3 11.5-35 34.5-35s34.5 11.7 34.5 35c0 23-11.5 34.5-34.5 34.5s-34.5-11.5-34.5-34.5zM247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3z\"]\n};\nvar faUnity = {\n prefix: 'fab',\n iconName: 'unity',\n icon: [448, 512, [], \"e049\", \"M243.583 91.6027L323.695 138.384C326.575 140.026 326.68 144.583 323.695 146.225L228.503 201.854C225.623 203.55 222.22 203.444 219.549 201.854L124.357 146.225C121.425 144.636 121.373 139.973 124.357 138.384L204.417 91.6027V0L0 119.417V358.252L78.3843 312.477V218.914C78.3319 215.576 82.2066 213.192 85.0865 214.993L180.279 270.622C183.159 272.318 184.782 275.338 184.782 278.464V389.669C184.834 393.007 180.959 395.391 178.079 393.589L97.9673 346.808L19.583 392.583L224 512L428.417 392.583L350.033 346.808L269.921 393.589C267.093 395.338 263.114 393.06 263.218 389.669V278.464C263.218 275.126 265.051 272.159 267.721 270.622L362.914 214.993C365.741 213.245 369.72 215.47 369.616 218.914V312.477L448 358.252V119.417L243.583 0V91.6027Z\"]\n};\nvar faWhmcs = {\n prefix: 'fab',\n iconName: 'whmcs',\n icon: [448, 512, [], \"f40d\", \"M448 161v-21.3l-28.5-8.8-2.2-10.4 20.1-20.7L427 80.4l-29 7.5-7.2-7.5 7.5-28.2-19.1-11.6-21.3 21-10.7-3.2-7-26.4h-22.6l-6.2 26.4-12.1 3.2-19.7-21-19.4 11 8.1 27.7-8.1 8.4-28.5-7.5-11 19.1 20.7 21-2.9 10.4-28.5 7.8-.3 21.7 28.8 7.5 2.4 12.1-20.1 19.9 10.4 18.5 29.6-7.5 7.2 8.6-8.1 26.9 19.9 11.6 19.4-20.4 11.6 2.9 6.7 28.5 22.6.3 6.7-28.8 11.6-3.5 20.7 21.6 20.4-12.1-8.8-28 7.8-8.1 28.8 8.8 10.3-20.1-20.9-18.8 2.2-12.1 29.1-7zm-119.2 45.2c-31.3 0-56.8-25.4-56.8-56.8s25.4-56.8 56.8-56.8 56.8 25.4 56.8 56.8c0 31.5-25.4 56.8-56.8 56.8zm72.3 16.4l46.9 14.5V277l-55.1 13.4-4.1 22.7 38.9 35.3-19.2 37.9-54-16.7-14.6 15.2 16.7 52.5-38.3 22.7-38.9-40.5-21.7 6.6-12.6 54-42.4-.5-12.6-53.6-21.7-5.6-36.4 38.4-37.4-21.7 15.2-50.5-13.7-16.1-55.5 14.1-19.7-34.8 37.9-37.4-4.8-22.8-54-14.1.5-40.9L54 219.9l5.7-19.7-38.9-39.4L41.5 125l53.6 14.1 15.2-15.7-15.2-52 36.4-20.7 36.8 39.4L191 84l11.6-52H245l11.6 45.9L234 72l-6.3-1.7-3.3 5.7-11 19.1-3.3 5.6 4.6 4.6 17.2 17.4-.3 1-23.8 6.5-6.2 1.7-.1 6.4-.2 12.9C153.8 161.6 118 204 118 254.7c0 58.3 47.3 105.7 105.7 105.7 50.5 0 92.7-35.4 103.2-82.8l13.2.2 6.9.1 1.6-6.7 5.6-24 1.9-.6 17.1 17.8 4.7 4.9 5.8-3.4 20.4-12.1 5.8-3.5-2-6.5-6.8-21.2z\"]\n};\nvar faRocketchat = {\n prefix: 'fab',\n iconName: 'rocketchat',\n icon: [576, 512, [], \"f3e8\", \"M284.046,224.8a34.114,34.114,0,1,0,34.317,34.113A34.217,34.217,0,0,0,284.046,224.8Zm-110.45,0a34.114,34.114,0,1,0,34.317,34.113A34.217,34.217,0,0,0,173.6,224.8Zm220.923,0a34.114,34.114,0,1,0,34.317,34.113A34.215,34.215,0,0,0,394.519,224.8Zm153.807-55.319c-15.535-24.172-37.31-45.57-64.681-63.618-52.886-34.817-122.374-54-195.666-54a405.975,405.975,0,0,0-72.032,6.357,238.524,238.524,0,0,0-49.51-36.588C99.684-11.7,40.859.711,11.135,11.421A14.291,14.291,0,0,0,5.58,34.782C26.542,56.458,61.222,99.3,52.7,138.252c-33.142,33.9-51.112,74.776-51.112,117.337,0,43.372,17.97,84.248,51.112,118.148,8.526,38.956-26.154,81.816-47.116,103.491a14.284,14.284,0,0,0,5.555,23.34c29.724,10.709,88.549,23.147,155.324-10.2a238.679,238.679,0,0,0,49.51-36.589A405.972,405.972,0,0,0,288,460.14c73.313,0,142.8-19.159,195.667-53.975,27.371-18.049,49.145-39.426,64.679-63.619,17.309-26.923,26.07-55.916,26.07-86.125C574.394,225.4,565.634,196.43,548.326,169.485ZM284.987,409.9a345.65,345.65,0,0,1-89.446-11.5l-20.129,19.393a184.366,184.366,0,0,1-37.138,27.585,145.767,145.767,0,0,1-52.522,14.87c.983-1.771,1.881-3.563,2.842-5.356q30.258-55.68,16.325-100.078c-32.992-25.962-52.778-59.2-52.778-95.4,0-83.1,104.254-150.469,232.846-150.469s232.867,67.373,232.867,150.469C517.854,342.525,413.6,409.9,284.987,409.9Z\"]\n};\nvar faVk = {\n prefix: 'fab',\n iconName: 'vk',\n icon: [448, 512, [], \"f189\", \"M31.4907 63.4907C0 94.9813 0 145.671 0 247.04V264.96C0 366.329 0 417.019 31.4907 448.509C62.9813 480 113.671 480 215.04 480H232.96C334.329 480 385.019 480 416.509 448.509C448 417.019 448 366.329 448 264.96V247.04C448 145.671 448 94.9813 416.509 63.4907C385.019 32 334.329 32 232.96 32H215.04C113.671 32 62.9813 32 31.4907 63.4907ZM75.6 168.267H126.747C128.427 253.76 166.133 289.973 196 297.44V168.267H244.16V242C273.653 238.827 304.64 205.227 315.093 168.267H363.253C359.313 187.435 351.46 205.583 340.186 221.579C328.913 237.574 314.461 251.071 297.733 261.227C316.41 270.499 332.907 283.63 346.132 299.751C359.357 315.873 369.01 334.618 374.453 354.747H321.44C316.555 337.262 306.614 321.61 292.865 309.754C279.117 297.899 262.173 290.368 244.16 288.107V354.747H238.373C136.267 354.747 78.0267 284.747 75.6 168.267Z\"]\n};\nvar faUntappd = {\n prefix: 'fab',\n iconName: 'untappd',\n icon: [640, 512, [], \"f405\", \"M401.3 49.9c-79.8 160.1-84.6 152.5-87.9 173.2l-5.2 32.8c-1.9 12-6.6 23.5-13.7 33.4L145.6 497.1c-7.6 10.6-20.4 16.2-33.4 14.6-40.3-5-77.8-32.2-95.3-68.5-5.7-11.8-4.5-25.8 3.1-36.4l148.9-207.9c7.1-9.9 16.4-18 27.2-23.7l29.3-15.5c18.5-9.8 9.7-11.9 135.6-138.9 1-4.8 1-7.3 3.6-8 3-.7 6.6-1 6.3-4.6l-.4-4.6c-.2-1.9 1.3-3.6 3.2-3.6 4.5-.1 13.2 1.2 25.6 10 12.3 8.9 16.4 16.8 17.7 21.1.6 1.8-.6 3.7-2.4 4.2l-4.5 1.1c-3.4.9-2.5 4.4-2.3 7.4.1 2.8-2.3 3.6-6.5 6.1zM230.1 36.4c3.4.9 2.5 4.4 2.3 7.4-.2 2.7 2.1 3.5 6.4 6 7.9 15.9 15.3 30.5 22.2 44 .7 1.3 2.3 1.5 3.3.5 11.2-12 24.6-26.2 40.5-42.6 1.3-1.4 1.4-3.5.1-4.9-8-8.2-16.5-16.9-25.6-26.1-1-4.7-1-7.3-3.6-8-3-.8-6.6-1-6.3-4.6.3-3.3 1.4-8.1-2.8-8.2-4.5-.1-13.2 1.1-25.6 10-12.3 8.9-16.4 16.8-17.7 21.1-1.4 4.2 3.6 4.6 6.8 5.4zM620 406.7L471.2 198.8c-13.2-18.5-26.6-23.4-56.4-39.1-11.2-5.9-14.2-10.9-30.5-28.9-1-1.1-2.9-.9-3.6.5-46.3 88.8-47.1 82.8-49 94.8-1.7 10.7-1.3 20 .3 29.8 1.9 12 6.6 23.5 13.7 33.4l148.9 207.9c7.6 10.6 20.2 16.2 33.1 14.7 40.3-4.9 78-32 95.7-68.6 5.4-11.9 4.3-25.9-3.4-36.6z\"]\n};\nvar faMailchimp = {\n prefix: 'fab',\n iconName: 'mailchimp',\n icon: [448, 512, [], \"f59e\", \"M330.61 243.52a36.15 36.15 0 0 1 9.3 0c1.66-3.83 1.95-10.43.45-17.61-2.23-10.67-5.25-17.14-11.48-16.13s-6.47 8.74-4.24 19.42c1.26 6 3.49 11.14 6 14.32zM277.05 252c4.47 2 7.2 3.26 8.28 2.13 1.89-1.94-3.48-9.39-12.12-13.09a31.44 31.44 0 0 0-30.61 3.68c-3 2.18-5.81 5.22-5.41 7.06.85 3.74 10-2.71 22.6-3.48 7-.44 12.8 1.75 17.26 3.71zm-9 5.13c-9.07 1.42-15 6.53-13.47 10.1.9.34 1.17.81 5.21-.81a37 37 0 0 1 18.72-1.95c2.92.34 4.31.52 4.94-.49 1.46-2.22-5.71-8-15.39-6.85zm54.17 17.1c3.38-6.87-10.9-13.93-14.3-7s10.92 13.88 14.32 6.97zm15.66-20.47c-7.66-.13-7.95 15.8-.26 15.93s7.98-15.81.28-15.96zm-218.79 78.9c-1.32.31-6 1.45-8.47-2.35-5.2-8 11.11-20.38 3-35.77-9.1-17.47-27.82-13.54-35.05-5.54-8.71 9.6-8.72 23.54-5 24.08 4.27.57 4.08-6.47 7.38-11.63a12.83 12.83 0 0 1 17.85-3.72c11.59 7.59 1.37 17.76 2.28 28.62 1.39 16.68 18.42 16.37 21.58 9a2.08 2.08 0 0 0-.2-2.33c.03.89.68-1.3-3.35-.39zm299.72-17.07c-3.35-11.73-2.57-9.22-6.78-20.52 2.45-3.67 15.29-24-3.07-43.25-10.4-10.92-33.9-16.54-41.1-18.54-1.5-11.39 4.65-58.7-21.52-83 20.79-21.55 33.76-45.29 33.73-65.65-.06-39.16-48.15-51-107.42-26.47l-12.55 5.33c-.06-.05-22.71-22.27-23.05-22.57C169.5-18-41.77 216.81 25.78 273.85l14.76 12.51a72.49 72.49 0 0 0-4.1 33.5c3.36 33.4 36 60.42 67.53 60.38 57.73 133.06 267.9 133.28 322.29 3 1.74-4.47 9.11-24.61 9.11-42.38s-10.09-25.27-16.53-25.27zm-316 48.16c-22.82-.61-47.46-21.15-49.91-45.51-6.17-61.31 74.26-75.27 84-12.33 4.54 29.64-4.67 58.49-34.12 57.81zM84.3 249.55C69.14 252.5 55.78 261.09 47.6 273c-4.88-4.07-14-12-15.59-15-13.01-24.85 14.24-73 33.3-100.21C112.42 90.56 186.19 39.68 220.36 48.91c5.55 1.57 23.94 22.89 23.94 22.89s-34.15 18.94-65.8 45.35c-42.66 32.85-74.89 80.59-94.2 132.4zM323.18 350.7s-35.74 5.3-69.51-7.07c6.21-20.16 27 6.1 96.4-13.81 15.29-4.38 35.37-13 51-25.35a102.85 102.85 0 0 1 7.12 24.28c3.66-.66 14.25-.52 11.44 18.1-3.29 19.87-11.73 36-25.93 50.84A106.86 106.86 0 0 1 362.55 421a132.45 132.45 0 0 1-20.34 8.58c-53.51 17.48-108.3-1.74-126-43a66.33 66.33 0 0 1-3.55-9.74c-7.53-27.2-1.14-59.83 18.84-80.37 1.23-1.31 2.48-2.85 2.48-4.79a8.45 8.45 0 0 0-1.92-4.54c-7-10.13-31.19-27.4-26.33-60.83 3.5-24 24.49-40.91 44.07-39.91l5 .29c8.48.5 15.89 1.59 22.88 1.88 11.69.5 22.2-1.19 34.64-11.56 4.2-3.5 7.57-6.54 13.26-7.51a17.45 17.45 0 0 1 13.6 2.24c10 6.64 11.4 22.73 11.92 34.49.29 6.72 1.1 23 1.38 27.63.63 10.67 3.43 12.17 9.11 14 3.19 1.05 6.15 1.83 10.51 3.06 13.21 3.71 21 7.48 26 12.31a16.38 16.38 0 0 1 4.74 9.29c1.56 11.37-8.82 25.4-36.31 38.16-46.71 21.68-93.68 14.45-100.48 13.68-20.15-2.71-31.63 23.32-19.55 41.15 22.64 33.41 122.4 20 151.37-21.35.69-1 .12-1.59-.73-1-41.77 28.58-97.06 38.21-128.46 26-4.77-1.85-14.73-6.44-15.94-16.67 43.6 13.49 71 .74 71 .74s2.03-2.79-.56-2.53zm-68.47-5.7zm-83.4-187.5c16.74-19.35 37.36-36.18 55.83-45.63a.73.73 0 0 1 1 1c-1.46 2.66-4.29 8.34-5.19 12.65a.75.75 0 0 0 1.16.79c11.49-7.83 31.48-16.22 49-17.3a.77.77 0 0 1 .52 1.38 41.86 41.86 0 0 0-7.71 7.74.75.75 0 0 0 .59 1.19c12.31.09 29.66 4.4 41 10.74.76.43.22 1.91-.64 1.72-69.55-15.94-123.08 18.53-134.5 26.83a.76.76 0 0 1-1-1.12z\"]\n};\nvar faCss3Alt = {\n prefix: 'fab',\n iconName: 'css3-alt',\n icon: [384, 512, [], \"f38b\", \"M0 32l34.9 395.8L192 480l157.1-52.2L384 32H0zm313.1 80l-4.8 47.3L193 208.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L193.1 162l6.5-2.7H76.7L70.9 112h242.2z\"]\n};\nvar faSquareReddit = {\n prefix: 'fab',\n iconName: 'square-reddit',\n icon: [448, 512, [\"reddit-square\"], \"f1a2\", \"M283.2 345.5c2.7 2.7 2.7 6.8 0 9.2-24.5 24.5-93.8 24.6-118.4 0-2.7-2.4-2.7-6.5 0-9.2 2.4-2.4 6.5-2.4 8.9 0 18.7 19.2 81 19.6 100.5 0 2.4-2.3 6.6-2.3 9 0zm-91.3-53.8c0-14.9-11.9-26.8-26.5-26.8-14.9 0-26.8 11.9-26.8 26.8 0 14.6 11.9 26.5 26.8 26.5 14.6 0 26.5-11.9 26.5-26.5zm90.7-26.8c-14.6 0-26.5 11.9-26.5 26.8 0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-11.9 26.8-26.5 0-14.9-11.9-26.8-26.8-26.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-99.7 140.6c-10.1 0-19 4.2-25.6 10.7-24.1-16.7-56.5-27.4-92.5-28.6l18.7-84.2 59.5 13.4c0 14.6 11.9 26.5 26.5 26.5 14.9 0 26.8-12.2 26.8-26.8 0-14.6-11.9-26.8-26.8-26.8-10.4 0-19.3 6.2-23.8 14.9l-65.7-14.6c-3.3-.9-6.5 1.5-7.4 4.8l-20.5 92.8c-35.7 1.5-67.8 12.2-91.9 28.9-6.5-6.8-15.8-11-25.9-11-37.5 0-49.8 50.4-15.5 67.5-1.2 5.4-1.8 11-1.8 16.7 0 56.5 63.7 102.3 141.9 102.3 78.5 0 142.2-45.8 142.2-102.3 0-5.7-.6-11.6-2.1-17 33.6-17.2 21.2-67.2-16.1-67.2z\"]\n};\nvar faRedditSquare = faSquareReddit;\nvar faVimeoV = {\n prefix: 'fab',\n iconName: 'vimeo-v',\n icon: [448, 512, [], \"f27d\", \"M447.8 153.6c-2 43.6-32.4 103.3-91.4 179.1-60.9 79.2-112.4 118.8-154.6 118.8-26.1 0-48.2-24.1-66.3-72.3C100.3 250 85.3 174.3 56.2 174.3c-3.4 0-15.1 7.1-35.2 21.1L0 168.2c51.6-45.3 100.9-95.7 131.8-98.5 34.9-3.4 56.3 20.5 64.4 71.5 28.7 181.5 41.4 208.9 93.6 126.7 18.7-29.6 28.8-52.1 30.2-67.6 4.8-45.9-35.8-42.8-63.3-31 22-72.1 64.1-107.1 126.2-105.1 45.8 1.2 67.5 31.1 64.9 89.4z\"]\n};\nvar faContao = {\n prefix: 'fab',\n iconName: 'contao',\n icon: [512, 512, [], \"f26d\", \"M45.4 305c14.4 67.1 26.4 129 68.2 175H34c-18.7 0-34-15.2-34-34V66c0-18.7 15.2-34 34-34h57.7C77.9 44.6 65.6 59.2 54.8 75.6c-45.4 70-27 146.8-9.4 229.4zM478 32h-90.2c21.4 21.4 39.2 49.5 52.7 84.1l-137.1 29.3c-14.9-29-37.8-53.3-82.6-43.9-24.6 5.3-41 19.3-48.3 34.6-8.8 18.7-13.2 39.8 8.2 140.3 21.1 100.2 33.7 117.7 49.5 131.2 12.9 11.1 33.4 17 58.3 11.7 44.5-9.4 55.7-40.7 57.4-73.2l137.4-29.6c3.2 71.5-18.7 125.2-57.4 163.6H478c18.7 0 34-15.2 34-34V66c0-18.8-15.2-34-34-34z\"]\n};\nvar faSquareFontAwesome = {\n prefix: 'fab',\n iconName: 'square-font-awesome',\n icon: [448, 512, [], \"e5ad\", \"M384.5,32.5h-320c-35.3,0-64,28.7-64,64v320c0,35.3,28.7,64,64,64h320c35.3,0,64-28.7,64-64v-320 C448.5,61.2,419.8,32.5,384.5,32.5z M336.5,312.5c-31.6,11.2-41.2,16-59.8,16c-31.4,0-43.2-16-74.6-16c-10.2,0-18.2,1.6-25.6,4v-32 c7.4-2.2,15.4-4,25.6-4c31.2,0,43.2,16,74.6,16c10.2,0,17.8-1.4,27.8-4.6v-96c-10,3.2-17.6,4.6-27.8,4.6c-31.4,0-43.2-16-74.6-16 c-25.4,0-37.4,10.4-57.6,14.4v153.6c0,8.8-7.2,16-16,16c-8.8,0-16-7.2-16-16v-192c0-8.8,7.2-16,16-16c8.8,0,16,7.2,16,16v6.4 c20.2-4,32.2-14.4,57.6-14.4c31.2,0,43.2,16,74.6,16c18.6,0,28.2-4.8,59.8-16V312.5z\"]\n};\nvar faDeskpro = {\n prefix: 'fab',\n iconName: 'deskpro',\n icon: [480, 512, [], \"f38f\", \"M205.9 512l31.1-38.4c12.3-.2 25.6-1.4 36.5-6.6 38.9-18.6 38.4-61.9 38.3-63.8-.1-5-.8-4.4-28.9-37.4H362c-.2 50.1-7.3 68.5-10.2 75.7-9.4 23.7-43.9 62.8-95.2 69.4-8.7 1.1-32.8 1.2-50.7 1.1zm200.4-167.7c38.6 0 58.5-13.6 73.7-30.9l-175.5-.3-17.4 31.3 119.2-.1zm-43.6-223.9v168.3h-73.5l-32.7 55.5H250c-52.3 0-58.1-56.5-58.3-58.9-1.2-13.2-21.3-11.6-20.1 1.8 1.4 15.8 8.8 40 26.4 57.1h-91c-25.5 0-110.8-26.8-107-114V16.9C0 .9 9.7.3 15 .1h82c.2 0 .3.1.5.1 4.3-.4 50.1-2.1 50.1 43.7 0 13.3 20.2 13.4 20.2 0 0-18.2-5.5-32.8-15.8-43.7h84.2c108.7-.4 126.5 79.4 126.5 120.2zm-132.5 56l64 29.3c13.3-45.5-42.2-71.7-64-29.3z\"]\n};\nvar faSistrix = {\n prefix: 'fab',\n iconName: 'sistrix',\n icon: [448, 512, [], \"f3ee\", \"M448 449L301.2 300.2c20-27.9 31.9-62.2 31.9-99.2 0-93.1-74.7-168.9-166.5-168.9C74.7 32 0 107.8 0 200.9s74.7 168.9 166.5 168.9c39.8 0 76.3-14.2 105-37.9l146 148.1 30.5-31zM166.5 330.8c-70.6 0-128.1-58.3-128.1-129.9S95.9 71 166.5 71s128.1 58.3 128.1 129.9-57.4 129.9-128.1 129.9z\"]\n};\nvar faSquareInstagram = {\n prefix: 'fab',\n iconName: 'square-instagram',\n icon: [448, 512, [\"instagram-square\"], \"e055\", \"M224,202.66A53.34,53.34,0,1,0,277.36,256,53.38,53.38,0,0,0,224,202.66Zm124.71-41a54,54,0,0,0-30.41-30.41c-21-8.29-71-6.43-94.3-6.43s-73.25-1.93-94.31,6.43a54,54,0,0,0-30.41,30.41c-8.28,21-6.43,71.05-6.43,94.33S91,329.26,99.32,350.33a54,54,0,0,0,30.41,30.41c21,8.29,71,6.43,94.31,6.43s73.24,1.93,94.3-6.43a54,54,0,0,0,30.41-30.41c8.35-21,6.43-71.05,6.43-94.33S357.1,182.74,348.75,161.67ZM224,338a82,82,0,1,1,82-82A81.9,81.9,0,0,1,224,338Zm85.38-148.3a19.14,19.14,0,1,1,19.13-19.14A19.1,19.1,0,0,1,309.42,189.74ZM400,32H48A48,48,0,0,0,0,80V432a48,48,0,0,0,48,48H400a48,48,0,0,0,48-48V80A48,48,0,0,0,400,32ZM382.88,322c-1.29,25.63-7.14,48.34-25.85,67s-41.4,24.63-67,25.85c-26.41,1.49-105.59,1.49-132,0-25.63-1.29-48.26-7.15-67-25.85s-24.63-41.42-25.85-67c-1.49-26.42-1.49-105.61,0-132,1.29-25.63,7.07-48.34,25.85-67s41.47-24.56,67-25.78c26.41-1.49,105.59-1.49,132,0,25.63,1.29,48.33,7.15,67,25.85s24.63,41.42,25.85,67.05C384.37,216.44,384.37,295.56,382.88,322Z\"]\n};\nvar faInstagramSquare = faSquareInstagram;\nvar faBattleNet = {\n prefix: 'fab',\n iconName: 'battle-net',\n icon: [512, 512, [], \"f835\", \"M448.61 225.62c26.87.18 35.57-7.43 38.92-12.37 12.47-16.32-7.06-47.6-52.85-71.33 17.76-33.58 30.11-63.68 36.34-85.3 3.38-11.83 1.09-19 .45-20.25-1.72 10.52-15.85 48.46-48.2 100.05-25-11.22-56.52-20.1-93.77-23.8-8.94-16.94-34.88-63.86-60.48-88.93C252.18 7.14 238.7 1.07 228.18.22h-.05c-13.83-1.55-22.67 5.85-27.4 11-17.2 18.53-24.33 48.87-25 84.07-7.24-12.35-17.17-24.63-28.5-25.93h-.18c-20.66-3.48-38.39 29.22-36 81.29-38.36 1.38-71 5.75-93 11.23-9.9 2.45-16.22 7.27-17.76 9.72 1-.38 22.4-9.22 111.56-9.22 5.22 53 29.75 101.82 26 93.19-9.73 15.4-38.24 62.36-47.31 97.7-5.87 22.88-4.37 37.61.15 47.14 5.57 12.75 16.41 16.72 23.2 18.26 25 5.71 55.38-3.63 86.7-21.14-7.53 12.84-13.9 28.51-9.06 39.34 7.31 19.65 44.49 18.66 88.44-9.45 20.18 32.18 40.07 57.94 55.7 74.12a39.79 39.79 0 0 0 8.75 7.09c5.14 3.21 8.58 3.37 8.58 3.37-8.24-6.75-34-38-62.54-91.78 22.22-16 45.65-38.87 67.47-69.27 122.82 4.6 143.29-24.76 148-31.64 14.67-19.88 3.43-57.44-57.32-93.69zm-77.85 106.22c23.81-37.71 30.34-67.77 29.45-92.33 27.86 17.57 47.18 37.58 49.06 58.83 1.14 12.93-8.1 29.12-78.51 33.5zM216.9 387.69c9.76-6.23 19.53-13.12 29.2-20.49 6.68 13.33 13.6 26.1 20.6 38.19-40.6 21.86-68.84 12.76-49.8-17.7zm215-171.35c-10.29-5.34-21.16-10.34-32.38-15.05a722.459 722.459 0 0 0 22.74-36.9c39.06 24.1 45.9 53.18 9.64 51.95zM279.18 398c-5.51-11.35-11-23.5-16.5-36.44 43.25 1.27 62.42-18.73 63.28-20.41 0 .07-25 15.64-62.53 12.25a718.78 718.78 0 0 0 85.06-84q13.06-15.31 24.93-31.11c-.36-.29-1.54-3-16.51-12-51.7 60.27-102.34 98-132.75 115.92-20.59-11.18-40.84-31.78-55.71-61.49-20-39.92-30-82.39-31.57-116.07 12.3.91 25.27 2.17 38.85 3.88-22.29 36.8-14.39 63-13.47 64.23 0-.07-.95-29.17 20.14-59.57a695.23 695.23 0 0 0 44.67 152.84c.93-.38 1.84.88 18.67-8.25-26.33-74.47-33.76-138.17-34-173.43 20-12.42 48.18-19.8 81.63-17.81 44.57 2.67 86.36 15.25 116.32 30.71q-10.69 15.66-23.33 32.47C365.63 152 339.1 145.84 337.5 146c.11 0 25.9 14.07 41.52 47.22a717.63 717.63 0 0 0-115.34-31.71 646.608 646.608 0 0 0-39.39-6.05c-.07.45-1.81 1.85-2.16 20.33C300 190.28 358.78 215.68 389.36 233c.74 23.55-6.95 51.61-25.41 79.57-24.6 37.31-56.39 67.23-84.77 85.43zm27.4-287c-44.56-1.66-73.58 7.43-94.69 20.67 2-52.3 21.31-76.38 38.21-75.28C267 52.15 305 108.55 306.58 111zm-130.65 3.1c.48 12.11 1.59 24.62 3.21 37.28-14.55-.85-28.74-1.25-42.4-1.26-.08 3.24-.12-51 24.67-49.59h.09c5.76 1.09 10.63 6.88 14.43 13.57zm-28.06 162c20.76 39.7 43.3 60.57 65.25 72.31-46.79 24.76-77.53 20-84.92 4.51-.2-.21-11.13-15.3 19.67-76.81zm210.06 74.8\"]\n};\nvar faTheRedYeti = {\n prefix: 'fab',\n iconName: 'the-red-yeti',\n icon: [512, 512, [], \"f69d\", \"M488.23 241.7l20.7 7.1c-9.6-23.9-23.9-37-31.7-44.8l7.1-18.2c.2 0 12.3-27.8-2.5-30.7-.6-11.3-6.6-27-18.4-27-7.6-10.6-17.7-12.3-30.7-5.9a122.2 122.2 0 0 0-25.3 16.5c-5.3-6.4-3 .4-3-29.8-37.1-24.3-45.4-11.7-74.8 3l.5.5a239.36 239.36 0 0 0-68.4-13.3c-5.5-8.7-18.6-19.1-25.1-25.1l24.8 7.1c-5.5-5.5-26.8-12.9-34.2-15.2 18.2-4.1 29.8-20.8 42.5-33-34.9-10.1-67.9-5.9-97.9 11.8l12-44.2L182 0c-31.6 24.2-33 41.9-33.7 45.5-.9-2.4-6.3-19.6-15.2-27a35.12 35.12 0 0 0-.5 25.3c3 8.4 5.9 14.8 8.4 18.9-16-3.3-28.3-4.9-49.2 0h-3.7l33 14.3a194.26 194.26 0 0 0-46.7 67.4l-1.7 8.4 1.7 1.7 7.6-4.7c-3.3 11.6-5.3 19.4-6.6 25.8a200.18 200.18 0 0 0-27.8 40.3c-15 1-31.8 10.8-40.3 14.3l3 3.4 28.8 1c-.5 1-.7 2.2-1.2 3.2-7.3 6.4-39.8 37.7-33 80.7l20.2-22.4c.5 1.7.7 3.4 1.2 5.2 0 25.5.4 89.6 64.9 150.5 43.6 40 96 60.2 157.5 60.2 121.7 0 223-87.3 223-211.5 6.8-9.7-1.2 3 16.7-25.1l13 14.3 2.5-.5A181.84 181.84 0 0 0 495 255a44.74 44.74 0 0 0-6.8-13.3zM398 111.2l-.5 21.9c5.5 18.1 16.9 17.2 22.4 17.2l-3.4-4.7 22.4-5.4a242.44 242.44 0 0 1-27 0c12.8-2.1 33.3-29 43-11.3 3.4 7.6 6.4 17.2 9.3 27.8l1.7-5.9a56.38 56.38 0 0 1-1.7-15.2c5.4.5 8.8 3.4 9.3 10.1.5 6.4 1.7 14.8 3.4 25.3l4.7-11.3c4.6 0 4.5-3.6-2.5 20.7-20.9-8.7-35.1-8.4-46.5-8.4l18.2-16c-25.3 8.2-33 10.8-54.8 20.9-1.1-5.4-5-13.5-16-19.9-3.2 3.8-2.8.9-.7 14.8h-2.5a62.32 62.32 0 0 0-8.4-23.1l4.2-3.4c8.4-7.1 11.8-14.3 10.6-21.9-.5-6.4-5.4-13.5-13.5-20.7 5.6-3.4 15.2-.4 28.3 8.5zm-39.6-10.1c2.7 1.9 11.4 5.4 18.9 17.2 4.2 8.4 4 9.8 3.4 11.1-.5 2.4-.5 4.3-3 7.1-1.7 2.5-5.4 4.7-11.8 7.6-7.6-13-16.5-23.6-27.8-31.2zM91 143.1l1.2-1.7c1.2-2.9 4.2-7.6 9.3-15.2l2.5-3.4-13 12.3 5.4-4.7-10.1 9.3-4.2 1.2c12.3-24.1 23.1-41.3 32.5-50.2 9.3-9.3 16-16 20.2-19.4l-6.4 1.2c-11.3-4.2-19.4-7.1-24.8-8.4 2.5-.5 3.7-.5 3.2-.5 10.3 0 17.5.5 20.9 1.2a52.35 52.35 0 0 0 16 2.5l.5-1.7-8.4-35.8 13.5 29a42.89 42.89 0 0 0 5.9-14.3c1.7-6.4 5.4-13 10.1-19.4s7.6-10.6 9.3-11.3a234.68 234.68 0 0 0-6.4 25.3l-1.7 7.1-.5 4.7 2.5 2.5C190.4 39.9 214 34 239.8 34.5l21.1.5c-11.8 13.5-27.8 21.9-48.5 24.8a201.26 201.26 0 0 1-23.4 2.9l-.2-.5-2.5-1.2a20.75 20.75 0 0 0-14 2c-2.5-.2-4.9-.5-7.1-.7l-2.5 1.7.5 1.2c2 .2 3.9.5 6.2.7l-2 3.4 3.4-.5-10.6 11.3c-4.2 3-5.4 6.4-4.2 9.3l5.4-3.4h1.2a39.4 39.4 0 0 1 25.3-15.2v-3c6.4.5 13 1 19.4 1.2 6.4 0 8.4.5 5.4 1.2a189.6 189.6 0 0 1 20.7 13.5c13.5 10.1 23.6 21.9 30 35.4 8.8 18.2 13.5 37.1 13.5 56.6a141.13 141.13 0 0 1-3 28.3 209.91 209.91 0 0 1-16 46l2.5.5c18.2-19.7 41.9-16 49.2-16l-6.4 5.9 22.4 17.7-1.7 30.7c-5.4-12.3-16.5-21.1-33-27.8 16.5 14.8 23.6 21.1 21.9 20.2-4.8-2.8-3.5-1.9-10.8-3.7 4.1 4.1 17.5 18.8 18.2 20.7l.2.2-.2.2c0 1.8 1.6-1.2-14 22.9-75.2-15.3-106.27-42.7-141.2-63.2l11.8 1.2c-11.8-18.5-15.6-17.7-38.4-26.1L149 225c-8.8-3-18.2-3-28.3.5l7.6-10.6-1.2-1.7c-14.9 4.3-19.8 9.2-22.6 11.3-1.1-5.5-2.8-12.4-12.3-28.8l-1.2 27-13.2-5c1.5-25.2 5.4-50.5 13.2-74.6zm276.5 330c-49.9 25-56.1 22.4-59 23.9-29.8-11.8-50.9-31.7-63.5-58.8l30 16.5c-9.8-9.3-18.3-16.5-38.4-44.3l11.8 23.1-17.7-7.6c14.2 21.1 23.5 51.7 66.6 73.5-120.8 24.2-199-72.1-200.9-74.3a262.57 262.57 0 0 0 35.4 24.8c3.4 1.7 7.1 2.5 10.1 1.2l-16-20.7c9.2 4.2 9.5 4.5 69.1 29-42.5-20.7-73.8-40.8-93.2-60.2-.5 6.4-1.2 10.1-1.2 10.1a80.25 80.25 0 0 1 20.7 26.6c-39-18.9-57.6-47.6-71.3-82.6 49.9 55.1 118.9 37.5 120.5 37.1 34.8 16.4 69.9 23.6 113.9 10.6 3.3 0 20.3 17 25.3 39.1l4.2-3-2.5-23.6c9 9 24.9 22.6 34.4 13-15.6-5.3-23.5-9.5-29.5-31.7 4.6 4.2 7.6 9 27.8 15l1.2-1.2-10.5-14.2c11.7-4.8-3.5 1 32-10.8 4.3 34.3 9 49.2.7 89.5zm115.3-214.4l-2.5.5 3 9.3c-3.5 5.9-23.7 44.3-71.6 79.7-39.5 29.8-76.6 39.1-80.9 40.3l-7.6-7.1-1.2 3 14.3 16-7.1-4.7 3.4 4.2h-1.2l-21.9-13.5 9.3 26.6-19-27.9-1.2 2.5 7.6 29c-6.1-8.2-21-32.6-56.8-39.6l32.5 21.2a214.82 214.82 0 0 1-93.2-6.4c-4.2-1.2-8.9-2.5-13.5-4.2l1.2-3-44.8-22.4 26.1 22.4c-57.7 9.1-113-25.4-126.4-83.4l-2.5-16.4-22.27 22.3c19.5-57.5 25.6-57.9 51.4-70.1-9.1-5.3-1.6-3.3-38.4-9.3 15.8-5.8 33-15.4 73 5.2a18.5 18.5 0 0 1 3.7-1.7c.6-3.2.4-.8 1-11.8 3.9 10 3.6 8.7 3 9.3l1.7.5c12.7-6.5 8.9-4.5 17-8.9l-5.4 13.5 22.3-5.8-8.4 8.4 2.5 2.5c4.5-1.8 30.3 3.4 40.8 16l-23.6-2.5c39.4 23 51.5 54 55.8 69.6l1.7-1.2c-2.8-22.3-12.4-33.9-16-40.1 4.2 5 39.2 34.6 110.4 46-11.3-.5-23.1 5.4-34.9 18.9l46.7-20.2-9.3 21.9c7.6-10.1 14.8-23.6 21.2-39.6v-.5l1.2-3-1.2 16c13.5-41.8 25.3-78.5 35.4-109.7l13.5-27.8v-2l-5.4-4.2h10.1l5.9 4.2 2.5-1.2-3.4-16 12.3 18.9 41.8-20.2-14.8 13 .5 2.9 17.7-.5a184 184 0 0 1 33 4.2l-23.6 2.5-1.2 3 26.6 23.1a254.21 254.21 0 0 1 27 32c-11.2-3.3-10.3-3.4-21.2-3.4l12.3 32.5zm-6.1-71.3l-3.9 13-14.3-11.8zm-254.8 7.1c1.7 10.6 4.7 17.7 8.8 21.9-9.3 6.6-27.5 13.9-46.5 16l.5 1.2a50.22 50.22 0 0 0 24.8-2.5l-7.1 13c4.2-1.7 10.1-7.1 17.7-14.8 11.9-5.5 12.7-5.1 20.2-16-12.7-6.4-15.7-13.7-18.4-18.8zm3.7-102.3c-6.4-3.4-10.6 3-12.3 18.9s2.5 29.5 11.8 39.6 18.2 10.6 26.1 3 3.4-23.6-11.3-47.7a39.57 39.57 0 0 0-14.27-13.8zm-4.7 46.3c5.4 2.2 10.5 1.9 12.3-10.6v-4.7l-1.2.5c-4.3-3.1-2.5-4.5-1.7-6.2l.5-.5c-.9-1.2-5-8.1-12.5 4.7-.5-13.5.5-21.9 3-24.8 1.2-2.5 4.7-1.2 11.3 4.2 6.4 5.4 11.3 16 15.2 32.5 6.5 28-19.8 26.2-26.9 4.9zm-45-5.5c1.6.3 9.3-1.1 9.3-14.8h-.5c-5.4-1.1-2.2-5.5-.7-5.9-1.7-3-3.4-4.2-5.4-4.7-8.1 0-11.6 12.7-8.1 21.2a7.51 7.51 0 0 0 5.43 4.2zM216 82.9l-2.5.5.5 3a48.94 48.94 0 0 1 26.1 5.9c-2.5-5.5-10-14.3-28.3-14.3l.5 2.5zm-71.8 49.4c21.7 16.8 16.5 21.4 46.5 23.6l-2.9-4.7a42.67 42.67 0 0 0 14.8-28.3c1.7-16-1.2-29.5-8.8-41.3l13-7.6a2.26 2.26 0 0 0-.5-1.7 14.21 14.21 0 0 0-13.5 1.7c-12.7 6.7-28 20.9-29 22.4-1.7 1.7-3.4 5.9-5.4 13.5a99.61 99.61 0 0 0-2.9 23.6c-4.7-8-10.5-6.4-19.9-5.9l7.1 7.6c-16.5 0-23.3 15.4-23.6 16 6.8 0 4.6-7.6 30-12.3-4.3-6.3-3.3-5-4.9-6.6zm18.7-18.7c1.2-7.6 3.4-13 6.4-17.2 5.4-6.4 10.6-10.1 16-11.8 4.2-1.7 7.1 1.2 10.1 9.3a72.14 72.14 0 0 1 3 25.3c-.5 9.3-3.4 17.2-8.4 23.1-2.9 3.4-5.4 5.9-6.4 7.6a39.21 39.21 0 0 1-11.3-.5l-7.1-3.4-5.4-6.4c.8-10 1.3-18.8 3.1-26zm42 56.1c-34.8 14.4-34.7 14-36.1 14.3-20.8 4.7-19-24.4-18.9-24.8l5.9-1.2-.5-2.5c-20.2-2.6-31 4.2-32.5 4.9.5.5 3 3.4 5.9 9.3 4.2-6.4 8.8-10.1 15.2-10.6a83.47 83.47 0 0 0 1.7 33.7c.1.5 2.6 17.4 27.5 24.1 11.3 3 27 1.2 48.9-5.4l-9.2.5c-4.2-14.8-6.4-24.8-5.9-29.5 11.3-8.8 21.9-11.3 30.7-7.6h2.5l-11.8-7.6-7.1.5c-5.9 1.2-12.3 4.2-19.4 8.4z\"]\n};\nvar faSquareHackerNews = {\n prefix: 'fab',\n iconName: 'square-hacker-news',\n icon: [448, 512, [\"hacker-news-square\"], \"f3af\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM21.2 229.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z\"]\n};\nvar faHackerNewsSquare = faSquareHackerNews;\nvar faEdge = {\n prefix: 'fab',\n iconName: 'edge',\n icon: [512, 512, [], \"f282\", \"M120.1 37.44C161.1 12.23 207.7-.7753 255 .0016C423 .0016 512 123.8 512 219.5C511.9 252.2 499 283.4 476.1 306.7C453.2 329.9 422.1 343.2 389.4 343.7C314.2 343.7 297.9 320.6 297.9 311.7C297.9 307.9 299.1 305.5 302.7 302.3L303.7 301.1L304.1 299.5C314.6 288 320 273.3 320 257.9C320 179.2 237.8 115.2 136 115.2C98.46 114.9 61.46 124.1 28.48 142.1C55.48 84.58 111.2 44.5 119.8 38.28C120.6 37.73 120.1 37.44 120.1 37.44V37.44zM135.7 355.5C134.3 385.5 140.3 415.5 152.1 442.7C165.7 469.1 184.8 493.7 208.6 512C149.1 500.5 97.11 468.1 59.2 422.7C21.12 376.3 0 318.4 0 257.9C0 206.7 62.4 163.5 136 163.5C172.6 162.9 208.4 174.4 237.8 196.2L234.2 197.4C182.7 215 135.7 288.1 135.7 355.5V355.5zM469.8 400L469.1 400.1C457.3 418.9 443.2 435.2 426.9 449.6C396.1 477.6 358.8 495.1 318.1 499.5C299.5 499.8 281.3 496.3 264.3 488.1C238.7 477.8 217.2 458.1 202.7 435.1C188.3 411.2 181.6 383.4 183.7 355.5C183.1 335.4 189.1 315.2 198.7 297.3C212.6 330.4 236.2 358.6 266.3 378.1C296.4 397.6 331.8 407.6 367.7 406.7C398.7 407 429.8 400 457.9 386.2L459.8 385.3C463.7 383 467.5 381.4 471.4 385.3C475.9 390.2 473.2 394.5 470.2 399.3C470 399.5 469.9 399.8 469.8 400V400z\"]\n};\nvar faNapster = {\n prefix: 'fab',\n iconName: 'napster',\n icon: [496, 512, [], \"f3d2\", \"M298.3 373.6c-14.2 13.6-31.3 24.1-50.4 30.5-19-6.4-36.2-16.9-50.3-30.5h100.7zm44-199.6c20-16.9 43.6-29.2 69.6-36.2V299c0 219.4-328 217.6-328 .3V137.7c25.9 6.9 49.6 19.6 69.5 36.4 56.8-40 132.5-39.9 188.9-.1zm-208.8-58.5c64.4-60 164.3-60.1 228.9-.2-7.1 3.5-13.9 7.3-20.6 11.5-58.7-30.5-129.2-30.4-187.9.1-6.3-4-13.9-8.2-20.4-11.4zM43.8 93.2v69.3c-58.4 36.5-58.4 121.1.1 158.3 26.4 245.1 381.7 240.3 407.6 1.5l.3-1.7c58.7-36.3 58.9-121.7.2-158.2V93.2c-17.3.5-34 3-50.1 7.4-82-91.5-225.5-91.5-307.5.1-16.3-4.4-33.1-7-50.6-7.5zM259.2 352s36-.3 61.3-1.5c10.2-.5 21.1-4 25.5-6.5 26.3-15.1 25.4-39.2 26.2-47.4-79.5-.6-99.9-3.9-113 55.4zm-135.5-55.3c.8 8.2-.1 32.3 26.2 47.4 4.4 2.5 15.2 6 25.5 6.5 25.3 1.1 61.3 1.5 61.3 1.5-13.2-59.4-33.7-56.1-113-55.4zm169.1 123.4c-3.2-5.3-6.9-7.3-6.9-7.3-24.8 7.3-52.2 6.9-75.9 0 0 0-2.9 1.5-6.4 6.6-2.8 4.1-3.7 9.6-3.7 9.6 29.1 17.6 67.1 17.6 96.2 0-.1-.1-.3-4-3.3-8.9z\"]\n};\nvar faSquareSnapchat = {\n prefix: 'fab',\n iconName: 'square-snapchat',\n icon: [448, 512, [\"snapchat-square\"], \"f2ad\", \"M384,32H64A64,64,0,0,0,0,96V416a64,64,0,0,0,64,64H384a64,64,0,0,0,64-64V96A64,64,0,0,0,384,32Zm-3.907,319.309-.083.1a32.364,32.364,0,0,1-8.717,6.823,90.26,90.26,0,0,1-20.586,8.2,12.694,12.694,0,0,0-3.852,1.76c-2.158,1.909-2.1,4.64-4.4,8.55a23.137,23.137,0,0,1-6.84,7.471c-6.707,4.632-14.244,4.923-22.23,5.23-7.214.274-15.39.581-24.729,3.669-3.761,1.245-7.753,3.694-12.377,6.533-11.265,6.9-26.68,16.353-52.3,16.353s-40.925-9.4-52.106-16.279c-4.657-2.888-8.675-5.362-12.543-6.64-9.339-3.08-17.516-3.4-24.729-3.67-7.986-.307-15.523-.6-22.231-5.229a23.085,23.085,0,0,1-6.01-6.11c-3.2-4.632-2.855-7.8-5.254-9.895a13.428,13.428,0,0,0-4.1-1.834,89.986,89.986,0,0,1-20.313-8.127,32.905,32.905,0,0,1-8.3-6.284c-6.583-6.757-8.276-14.776-5.686-21.824,3.436-9.338,11.571-12.111,19.4-16.262,14.776-8.027,26.348-18.055,34.433-29.884a68.236,68.236,0,0,0,5.985-10.567c.789-2.158.772-3.329.241-4.416a7.386,7.386,0,0,0-2.208-2.217c-2.532-1.676-5.113-3.353-6.882-4.5-3.27-2.141-5.868-3.818-7.529-4.98-6.267-4.383-10.65-9.04-13.4-14.245a28.4,28.4,0,0,1-1.369-23.584c4.134-10.924,14.469-17.706,26.978-17.706a37.141,37.141,0,0,1,7.845.83c.689.15,1.37.307,2.042.482-.108-7.43.058-15.357.722-23.119,2.358-27.261,11.912-41.589,21.874-52.994a86.836,86.836,0,0,1,22.28-17.931C188.254,100.383,205.312,96,224,96s35.828,4.383,50.944,13.016a87.169,87.169,0,0,1,22.239,17.9c9.961,11.406,19.516,25.709,21.874,52.995a231.194,231.194,0,0,1,.713,23.118c.673-.174,1.362-.332,2.051-.481a37.131,37.131,0,0,1,7.844-.83c12.5,0,22.82,6.782,26.971,17.706a28.37,28.37,0,0,1-1.4,23.559c-2.74,5.2-7.123,9.861-13.39,14.244-1.668,1.187-4.258,2.864-7.529,4.981-1.835,1.187-4.541,2.947-7.164,4.682a6.856,6.856,0,0,0-1.951,2.034c-.506,1.046-.539,2.191.166,4.208a69.015,69.015,0,0,0,6.085,10.792c8.268,12.1,20.188,22.313,35.454,30.407,1.486.772,2.98,1.5,4.441,2.258.722.332,1.569.763,2.491,1.3,4.9,2.723,9.2,6.01,11.455,12.153C387.821,336.915,386.269,344.7,380.093,351.309Zm-16.719-18.461c-50.313-24.314-58.332-61.918-58.689-64.749-.431-3.379-.921-6.035,2.806-9.472,3.594-3.328,19.541-13.19,23.965-16.278,7.33-5.114,10.534-10.219,8.16-16.495-1.66-4.316-5.686-5.976-9.961-5.976a18.5,18.5,0,0,0-3.993.448c-8.035,1.743-15.838,5.769-20.354,6.857a7.1,7.1,0,0,1-1.66.224c-2.408,0-3.279-1.071-3.088-3.968.564-8.783,1.759-25.925.373-41.937-1.884-22.032-8.99-32.948-17.432-42.6-4.051-4.624-23.135-24.654-59.536-24.654S168.53,134.359,164.479,139c-8.434,9.654-15.531,20.57-17.432,42.6-1.386,16.013-.141,33.147.373,41.937.166,2.756-.68,3.968-3.088,3.968a7.1,7.1,0,0,1-1.66-.224c-4.507-1.087-12.31-5.113-20.346-6.856a18.494,18.494,0,0,0-3.993-.449c-4.25,0-8.3,1.636-9.961,5.977-2.374,6.276.847,11.381,8.168,16.494,4.425,3.088,20.371,12.958,23.966,16.279,3.719,3.437,3.237,6.093,2.805,9.471-.356,2.79-8.384,40.394-58.689,64.749-2.946,1.428-7.96,4.45.88,9.331,13.88,7.628,23.111,6.807,30.3,11.43,6.093,3.927,2.5,12.394,6.923,15.449,5.454,3.76,21.583-.266,42.335,6.6,17.433,5.744,28.116,22.015,58.963,22.015s41.788-16.3,58.938-21.973c20.795-6.865,36.89-2.839,42.336-6.6,4.433-3.055.822-11.522,6.923-15.448,7.181-4.624,16.411-3.8,30.3-11.472C371.36,337.355,366.346,334.333,363.374,332.848Z\"]\n};\nvar faSnapchatSquare = faSquareSnapchat;\nvar faGooglePlusG = {\n prefix: 'fab',\n iconName: 'google-plus-g',\n icon: [640, 512, [], \"f0d5\", \"M386.061 228.496c1.834 9.692 3.143 19.384 3.143 31.956C389.204 370.205 315.599 448 204.8 448c-106.084 0-192-85.915-192-192s85.916-192 192-192c51.864 0 95.083 18.859 128.611 50.292l-52.126 50.03c-14.145-13.621-39.028-29.599-76.485-29.599-65.484 0-118.92 54.221-118.92 121.277 0 67.056 53.436 121.277 118.92 121.277 75.961 0 104.513-54.745 108.965-82.773H204.8v-66.009h181.261zm185.406 6.437V179.2h-56.001v55.733h-55.733v56.001h55.733v55.733h56.001v-55.733H627.2v-56.001h-55.733z\"]\n};\nvar faArtstation = {\n prefix: 'fab',\n iconName: 'artstation',\n icon: [512, 512, [], \"f77a\", \"M2 377.4l43 74.3A51.35 51.35 0 0 0 90.9 480h285.4l-59.2-102.6zM501.8 350L335.6 59.3A51.38 51.38 0 0 0 290.2 32h-88.4l257.3 447.6 40.7-70.5c1.9-3.2 21-29.7 2-59.1zM275 304.5l-115.5-200L44 304.5z\"]\n};\nvar faMarkdown = {\n prefix: 'fab',\n iconName: 'markdown',\n icon: [640, 512, [], \"f60f\", \"M593.8 59.1H46.2C20.7 59.1 0 79.8 0 105.2v301.5c0 25.5 20.7 46.2 46.2 46.2h547.7c25.5 0 46.2-20.7 46.1-46.1V105.2c0-25.4-20.7-46.1-46.2-46.1zM338.5 360.6H277v-120l-61.5 76.9-61.5-76.9v120H92.3V151.4h61.5l61.5 76.9 61.5-76.9h61.5v209.2zm135.3 3.1L381.5 256H443V151.4h61.5V256H566z\"]\n};\nvar faSourcetree = {\n prefix: 'fab',\n iconName: 'sourcetree',\n icon: [448, 512, [], \"f7d3\", \"M427.2 203c0-112.1-90.9-203-203-203C112.1-.2 21.2 90.6 21 202.6A202.86 202.86 0 0 0 161.5 396v101.7a14.3 14.3 0 0 0 14.3 14.3h96.4a14.3 14.3 0 0 0 14.3-14.3V396.1A203.18 203.18 0 0 0 427.2 203zm-271.6 0c0-90.8 137.3-90.8 137.3 0-.1 89.9-137.3 91-137.3 0z\"]\n};\nvar faGooglePlus = {\n prefix: 'fab',\n iconName: 'google-plus',\n icon: [512, 512, [], \"f2b3\", \"M256,8C119.1,8,8,119.1,8,256S119.1,504,256,504,504,392.9,504,256,392.9,8,256,8ZM185.3,380a124,124,0,0,1,0-248c31.3,0,60.1,11,83,32.3l-33.6,32.6c-13.2-12.9-31.3-19.1-49.4-19.1-42.9,0-77.2,35.5-77.2,78.1S142.3,334,185.3,334c32.6,0,64.9-19.1,70.1-53.3H185.3V238.1H302.2a109.2,109.2,0,0,1,1.9,20.7c0,70.8-47.5,121.2-118.8,121.2ZM415.5,273.8v35.5H380V273.8H344.5V238.3H380V202.8h35.5v35.5h35.2v35.5Z\"]\n};\nvar faDiaspora = {\n prefix: 'fab',\n iconName: 'diaspora',\n icon: [512, 512, [], \"f791\", \"M251.64 354.55c-1.4 0-88 119.9-88.7 119.9S76.34 414 76 413.25s86.6-125.7 86.6-127.4c0-2.2-129.6-44-137.6-47.1-1.3-.5 31.4-101.8 31.7-102.1.6-.7 144.4 47 145.5 47 .4 0 .9-.6 1-1.3.4-2 1-148.6 1.7-149.6.8-1.2 104.5-.7 105.1-.3 1.5 1 3.5 156.1 6.1 156.1 1.4 0 138.7-47 139.3-46.3.8.9 31.9 102.2 31.5 102.6-.9.9-140.2 47.1-140.6 48.8-.3 1.4 82.8 122.1 82.5 122.9s-85.5 63.5-86.3 63.5c-1-.2-89-125.5-90.9-125.5z\"]\n};\nvar faFoursquare = {\n prefix: 'fab',\n iconName: 'foursquare',\n icon: [368, 512, [], \"f180\", \"M323.1 3H49.9C12.4 3 0 31.3 0 49.1v433.8c0 20.3 12.1 27.7 18.2 30.1 6.2 2.5 22.8 4.6 32.9-7.1C180 356.5 182.2 354 182.2 354c3.1-3.4 3.4-3.1 6.8-3.1h83.4c35.1 0 40.6-25.2 44.3-39.7l48.6-243C373.8 25.8 363.1 3 323.1 3zm-16.3 73.8l-11.4 59.7c-1.2 6.5-9.5 13.2-16.9 13.2H172.1c-12 0-20.6 8.3-20.6 20.3v13c0 12 8.6 20.6 20.6 20.6h90.4c8.3 0 16.6 9.2 14.8 18.2-1.8 8.9-10.5 53.8-11.4 58.8-.9 4.9-6.8 13.5-16.9 13.5h-73.5c-13.5 0-17.2 1.8-26.5 12.6 0 0-8.9 11.4-89.5 108.3-.9.9-1.8.6-1.8-.3V75.9c0-7.7 6.8-16.6 16.6-16.6h219c8.2 0 15.6 7.7 13.5 17.5z\"]\n};\nvar faStackOverflow = {\n prefix: 'fab',\n iconName: 'stack-overflow',\n icon: [384, 512, [], \"f16c\", \"M290.7 311L95 269.7 86.8 309l195.7 41zm51-87L188.2 95.7l-25.5 30.8 153.5 128.3zm-31.2 39.7L129.2 179l-16.7 36.5L293.7 300zM262 32l-32 24 119.3 160.3 32-24zm20.5 328h-200v39.7h200zm39.7 80H42.7V320h-40v160h359.5V320h-40z\"]\n};\nvar faGithubAlt = {\n prefix: 'fab',\n iconName: 'github-alt',\n icon: [480, 512, [], \"f113\", \"M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z\"]\n};\nvar faPhoenixSquadron = {\n prefix: 'fab',\n iconName: 'phoenix-squadron',\n icon: [512, 512, [], \"f511\", \"M96 63.38C142.49 27.25 201.55 7.31 260.51 8.81c29.58-.38 59.11 5.37 86.91 15.33-24.13-4.63-49-6.34-73.38-2.45C231.17 27 191 48.84 162.21 80.87c5.67-1 10.78-3.67 16-5.86 18.14-7.87 37.49-13.26 57.23-14.83 19.74-2.13 39.64-.43 59.28 1.92-14.42 2.79-29.12 4.57-43 9.59-34.43 11.07-65.27 33.16-86.3 62.63-13.8 19.71-23.63 42.86-24.67 67.13-.35 16.49 5.22 34.81 19.83 44a53.27 53.27 0 0 0 37.52 6.74c15.45-2.46 30.07-8.64 43.6-16.33 11.52-6.82 22.67-14.55 32-24.25 3.79-3.22 2.53-8.45 2.62-12.79-2.12-.34-4.38-1.11-6.3.3a203 203 0 0 1-35.82 15.37c-20 6.17-42.16 8.46-62.1.78 12.79 1.73 26.06.31 37.74-5.44 20.23-9.72 36.81-25.2 54.44-38.77a526.57 526.57 0 0 1 88.9-55.31c25.71-12 52.94-22.78 81.57-24.12-15.63 13.72-32.15 26.52-46.78 41.38-14.51 14-27.46 29.5-40.11 45.18-3.52 4.6-8.95 6.94-13.58 10.16a150.7 150.7 0 0 0-51.89 60.1c-9.33 19.68-14.5 41.85-11.77 63.65 1.94 13.69 8.71 27.59 20.9 34.91 12.9 8 29.05 8.07 43.48 5.1 32.8-7.45 61.43-28.89 81-55.84 20.44-27.52 30.52-62.2 29.16-96.35-.52-7.5-1.57-15-1.66-22.49 8 19.48 14.82 39.71 16.65 60.83 2 14.28.75 28.76-1.62 42.9-1.91 11-5.67 21.51-7.78 32.43a165 165 0 0 0 39.34-81.07 183.64 183.64 0 0 0-14.21-104.64c20.78 32 32.34 69.58 35.71 107.48.49 12.73.49 25.51 0 38.23A243.21 243.21 0 0 1 482 371.34c-26.12 47.34-68 85.63-117.19 108-78.29 36.23-174.68 31.32-248-14.68A248.34 248.34 0 0 1 25.36 366 238.34 238.34 0 0 1 0 273.08v-31.34C3.93 172 40.87 105.82 96 63.38m222 80.33a79.13 79.13 0 0 0 16-4.48c5-1.77 9.24-5.94 10.32-11.22-8.96 4.99-17.98 9.92-26.32 15.7z\"]\n};\nvar faPagelines = {\n prefix: 'fab',\n iconName: 'pagelines',\n icon: [384, 512, [], \"f18c\", \"M384 312.7c-55.1 136.7-187.1 54-187.1 54-40.5 81.8-107.4 134.4-184.6 134.7-16.1 0-16.6-24.4 0-24.4 64.4-.3 120.5-42.7 157.2-110.1-41.1 15.9-118.6 27.9-161.6-82.2 109-44.9 159.1 11.2 178.3 45.5 9.9-24.4 17-50.9 21.6-79.7 0 0-139.7 21.9-149.5-98.1 119.1-47.9 152.6 76.7 152.6 76.7 1.6-16.7 3.3-52.6 3.3-53.4 0 0-106.3-73.7-38.1-165.2 124.6 43 61.4 162.4 61.4 162.4.5 1.6.5 23.8 0 33.4 0 0 45.2-89 136.4-57.5-4.2 134-141.9 106.4-141.9 106.4-4.4 27.4-11.2 53.4-20 77.5 0 0 83-91.8 172-20z\"]\n};\nvar faAlgolia = {\n prefix: 'fab',\n iconName: 'algolia',\n icon: [448, 512, [], \"f36c\", \"M229.3 182.6c-49.3 0-89.2 39.9-89.2 89.2 0 49.3 39.9 89.2 89.2 89.2s89.2-39.9 89.2-89.2c0-49.3-40-89.2-89.2-89.2zm62.7 56.6l-58.9 30.6c-1.8.9-3.8-.4-3.8-2.3V201c0-1.5 1.3-2.7 2.7-2.6 26.2 1 48.9 15.7 61.1 37.1.7 1.3.2 3-1.1 3.7zM389.1 32H58.9C26.4 32 0 58.4 0 90.9V421c0 32.6 26.4 59 58.9 59H389c32.6 0 58.9-26.4 58.9-58.9V90.9C448 58.4 421.6 32 389.1 32zm-202.6 84.7c0-10.8 8.7-19.5 19.5-19.5h45.3c10.8 0 19.5 8.7 19.5 19.5v15.4c0 1.8-1.7 3-3.3 2.5-12.3-3.4-25.1-5.1-38.1-5.1-13.5 0-26.7 1.8-39.4 5.5-1.7.5-3.4-.8-3.4-2.5v-15.8zm-84.4 37l9.2-9.2c7.6-7.6 19.9-7.6 27.5 0l7.7 7.7c1.1 1.1 1 3-.3 4-6.2 4.5-12.1 9.4-17.6 14.9-5.4 5.4-10.4 11.3-14.8 17.4-1 1.3-2.9 1.5-4 .3l-7.7-7.7c-7.6-7.5-7.6-19.8 0-27.4zm127.2 244.8c-70 0-126.6-56.7-126.6-126.6s56.7-126.6 126.6-126.6c70 0 126.6 56.6 126.6 126.6 0 69.8-56.7 126.6-126.6 126.6z\"]\n};\nvar faRedRiver = {\n prefix: 'fab',\n iconName: 'red-river',\n icon: [448, 512, [], \"f3e3\", \"M353.2 32H94.8C42.4 32 0 74.4 0 126.8v258.4C0 437.6 42.4 480 94.8 480h258.4c52.4 0 94.8-42.4 94.8-94.8V126.8c0-52.4-42.4-94.8-94.8-94.8zM144.9 200.9v56.3c0 27-21.9 48.9-48.9 48.9V151.9c0-13.2 10.7-23.9 23.9-23.9h154.2c0 27-21.9 48.9-48.9 48.9h-56.3c-12.3-.6-24.6 11.6-24 24zm176.3 72h-56.3c-12.3-.6-24.6 11.6-24 24v56.3c0 27-21.9 48.9-48.9 48.9V247.9c0-13.2 10.7-23.9 23.9-23.9h154.2c0 27-21.9 48.9-48.9 48.9z\"]\n};\nvar faCreativeCommonsSa = {\n prefix: 'fab',\n iconName: 'creative-commons-sa',\n icon: [496, 512, [], \"f4ef\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zM137.7 221c13-83.9 80.5-95.7 108.9-95.7 99.8 0 127.5 82.5 127.5 134.2 0 63.6-41 132.9-128.9 132.9-38.9 0-99.1-20-109.4-97h62.5c1.5 30.1 19.6 45.2 54.5 45.2 23.3 0 58-18.2 58-82.8 0-82.5-49.1-80.6-56.7-80.6-33.1 0-51.7 14.6-55.8 43.8h18.2l-49.2 49.2-49-49.2h19.4z\"]\n};\nvar faSafari = {\n prefix: 'fab',\n iconName: 'safari',\n icon: [512, 512, [], \"f267\", \"M274.69,274.69l-37.38-37.38L166,346ZM256,8C119,8,8,119,8,256S119,504,256,504,504,393,504,256,393,8,256,8ZM411.85,182.79l14.78-6.13A8,8,0,0,1,437.08,181h0a8,8,0,0,1-4.33,10.46L418,197.57a8,8,0,0,1-10.45-4.33h0A8,8,0,0,1,411.85,182.79ZM314.43,94l6.12-14.78A8,8,0,0,1,331,74.92h0a8,8,0,0,1,4.33,10.45l-6.13,14.78a8,8,0,0,1-10.45,4.33h0A8,8,0,0,1,314.43,94ZM256,60h0a8,8,0,0,1,8,8V84a8,8,0,0,1-8,8h0a8,8,0,0,1-8-8V68A8,8,0,0,1,256,60ZM181,74.92a8,8,0,0,1,10.46,4.33L197.57,94a8,8,0,1,1-14.78,6.12l-6.13-14.78A8,8,0,0,1,181,74.92Zm-63.58,42.49h0a8,8,0,0,1,11.31,0L140,128.72A8,8,0,0,1,140,140h0a8,8,0,0,1-11.31,0l-11.31-11.31A8,8,0,0,1,117.41,117.41ZM60,256h0a8,8,0,0,1,8-8H84a8,8,0,0,1,8,8h0a8,8,0,0,1-8,8H68A8,8,0,0,1,60,256Zm40.15,73.21-14.78,6.13A8,8,0,0,1,74.92,331h0a8,8,0,0,1,4.33-10.46L94,314.43a8,8,0,0,1,10.45,4.33h0A8,8,0,0,1,100.15,329.21Zm4.33-136h0A8,8,0,0,1,94,197.57l-14.78-6.12A8,8,0,0,1,74.92,181h0a8,8,0,0,1,10.45-4.33l14.78,6.13A8,8,0,0,1,104.48,193.24ZM197.57,418l-6.12,14.78a8,8,0,0,1-14.79-6.12l6.13-14.78A8,8,0,1,1,197.57,418ZM264,444a8,8,0,0,1-8,8h0a8,8,0,0,1-8-8V428a8,8,0,0,1,8-8h0a8,8,0,0,1,8,8Zm67-6.92h0a8,8,0,0,1-10.46-4.33L314.43,418a8,8,0,0,1,4.33-10.45h0a8,8,0,0,1,10.45,4.33l6.13,14.78A8,8,0,0,1,331,437.08Zm63.58-42.49h0a8,8,0,0,1-11.31,0L372,383.28A8,8,0,0,1,372,372h0a8,8,0,0,1,11.31,0l11.31,11.31A8,8,0,0,1,394.59,394.59ZM286.25,286.25,110.34,401.66,225.75,225.75,401.66,110.34ZM437.08,331h0a8,8,0,0,1-10.45,4.33l-14.78-6.13a8,8,0,0,1-4.33-10.45h0A8,8,0,0,1,418,314.43l14.78,6.12A8,8,0,0,1,437.08,331ZM444,264H428a8,8,0,0,1-8-8h0a8,8,0,0,1,8-8h16a8,8,0,0,1,8,8h0A8,8,0,0,1,444,264Z\"]\n};\nvar faGoogle = {\n prefix: 'fab',\n iconName: 'google',\n icon: [488, 512, [], \"f1a0\", \"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z\"]\n};\nvar faSquareFontAwesomeStroke = {\n prefix: 'fab',\n iconName: 'square-font-awesome-stroke',\n icon: [448, 512, [\"font-awesome-alt\"], \"f35c\", \"M201.6,152c-25.4,0-37.4,10.4-57.6,14.4V160c0-8.8-7.2-16-16-16s-16,7.2-16,16v192c0,0.8,0.1,1.6,0.2,2.4 c0.1,0.4,0.1,0.8,0.2,1.2c1.6,7.1,8,12.4,15.6,12.4s14-5.3,15.6-12.4c0.1-0.4,0.2-0.8,0.2-1.2c0.1-0.8,0.2-1.6,0.2-2.4V198.4 c4-0.8,7.7-1.8,11.2-3c14.3-4.7,26-11.4,46.4-11.4c31.4,0,43.2,16,74.6,16c8.9,0,15.9-1.1,24.2-3.5c1.2-0.3,2.4-0.7,3.6-1.1v96 c-10,3.2-17.6,4.6-27.8,4.6c-31.4,0-43.4-16-74.6-16c-10.2,0-18.2,1.8-25.6,4v32c7.4-2.4,15.4-4,25.6-4c31.4,0,43.2,16,74.6,16 c18.6,0,28.2-4.8,59.8-16V152c-31.6,11.2-41.2,16-59.8,16C244.8,168,232.8,152,201.6,152z M384,32H64C28.7,32,0,60.7,0,96v320 c0,35.3,28.7,64,64,64h320c35.3,0,64-28.7,64-64V96C448,60.7,419.3,32,384,32z M416,416c0,17.6-14.4,32-32,32H64 c-17.6,0-32-14.4-32-32V96c0-17.6,14.4-32,32-32h320c17.6,0,32,14.4,32,32V416z\"]\n};\nvar faFontAwesomeAlt = faSquareFontAwesomeStroke;\nvar faAtlassian = {\n prefix: 'fab',\n iconName: 'atlassian',\n icon: [512, 512, [], \"f77b\", \"M152.2 236.4c-7.7-8.2-19.7-7.7-24.8 2.8L1.6 490.2c-5 10 2.4 21.7 13.4 21.7h175c5.8.1 11-3.2 13.4-8.4 37.9-77.8 15.1-196.3-51.2-267.1zM244.4 8.1c-122.3 193.4-8.5 348.6 65 495.5 2.5 5.1 7.7 8.4 13.4 8.4H497c11.2 0 18.4-11.8 13.4-21.7 0 0-234.5-470.6-240.4-482.3-5.3-10.6-18.8-10.8-25.6.1z\"]\n};\nvar faLinkedinIn = {\n prefix: 'fab',\n iconName: 'linkedin-in',\n icon: [448, 512, [], \"f0e1\", \"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z\"]\n};\nvar faDigitalOcean = {\n prefix: 'fab',\n iconName: 'digital-ocean',\n icon: [512, 512, [], \"f391\", \"M87 481.8h73.7v-73.6H87zM25.4 346.6v61.6H87v-61.6zm466.2-169.7c-23-74.2-82.4-133.3-156.6-156.6C164.9-32.8 8 93.7 8 255.9h95.8c0-101.8 101-180.5 208.1-141.7 39.7 14.3 71.5 46.1 85.8 85.7 39.1 107-39.7 207.8-141.4 208v.3h-.3V504c162.6 0 288.8-156.8 235.6-327.1zm-235.3 231v-95.3h-95.6v95.6H256v-.3z\"]\n};\nvar faNimblr = {\n prefix: 'fab',\n iconName: 'nimblr',\n icon: [384, 512, [], \"f5a8\", \"M246.6 299.29c15.57 0 27.15 11.46 27.15 27s-11.62 27-27.15 27c-15.7 0-27.15-11.57-27.15-27s11.55-27 27.15-27zM113 326.25c0-15.61 11.68-27 27.15-27s27.15 11.46 27.15 27-11.47 27-27.15 27c-15.44 0-27.15-11.31-27.15-27M191.76 159C157 159 89.45 178.77 59.25 227L14 0v335.48C14 433.13 93.61 512 191.76 512s177.76-78.95 177.76-176.52S290.13 159 191.76 159zm0 308.12c-73.27 0-132.51-58.9-132.51-131.59s59.24-131.59 132.51-131.59 132.51 58.86 132.51 131.54S265 467.07 191.76 467.07z\"]\n};\nvar faChromecast = {\n prefix: 'fab',\n iconName: 'chromecast',\n icon: [512, 512, [], \"f838\", \"M447.8,64H64c-23.6,0-42.7,19.1-42.7,42.7v63.9H64v-63.9h383.8v298.6H298.6V448H448c23.6,0,42.7-19.1,42.7-42.7V106.7 C490.7,83.1,471.4,64,447.8,64z M21.3,383.6L21.3,383.6l0,63.9h63.9C85.2,412.2,56.6,383.6,21.3,383.6L21.3,383.6z M21.3,298.6V341 c58.9,0,106.6,48.1,106.6,107h42.7C170.7,365.6,103.7,298.7,21.3,298.6z M213.4,448h42.7c-0.5-129.5-105.3-234.3-234.8-234.6l0,42.4 C127.3,255.6,213.3,342,213.4,448z\"]\n};\nvar faEvernote = {\n prefix: 'fab',\n iconName: 'evernote',\n icon: [384, 512, [], \"f839\", \"M120.82 132.21c1.6 22.31-17.55 21.59-21.61 21.59-68.93 0-73.64-1-83.58 3.34-.56.22-.74 0-.37-.37L123.79 46.45c.38-.37.6-.22.38.37-4.35 9.99-3.35 15.09-3.35 85.39zm79 308c-14.68-37.08 13-76.93 52.52-76.62 17.49 0 22.6 23.21 7.95 31.42-6.19 3.3-24.95 1.74-25.14 19.2-.05 17.09 19.67 25 31.2 24.89A45.64 45.64 0 0 0 312 393.45v-.08c0-11.63-7.79-47.22-47.54-55.34-7.72-1.54-65-6.35-68.35-50.52-3.74 16.93-17.4 63.49-43.11 69.09-8.74 1.94-69.68 7.64-112.92-36.77 0 0-18.57-15.23-28.23-57.95-3.38-15.75-9.28-39.7-11.14-62 0-18 11.14-30.45 25.07-32.2 81 0 90 2.32 101-7.8 9.82-9.24 7.8-15.5 7.8-102.78 1-8.3 7.79-30.81 53.41-24.14 6 .86 31.91 4.18 37.48 30.64l64.26 11.15c20.43 3.71 70.94 7 80.6 57.94 22.66 121.09 8.91 238.46 7.8 238.46C362.15 485.53 267.06 480 267.06 480c-18.95-.23-54.25-9.4-67.27-39.83zm80.94-204.84c-1 1.92-2.2 6 .85 7 14.09 4.93 39.75 6.84 45.88 5.53 3.11-.25 3.05-4.43 2.48-6.65-3.53-21.85-40.83-26.5-49.24-5.92z\"]\n};\nvar faHackerNews = {\n prefix: 'fab',\n iconName: 'hacker-news',\n icon: [448, 512, [], \"f1d4\", \"M0 32v448h448V32H0zm21.2 197.2H21c.1-.1.2-.3.3-.4 0 .1 0 .3-.1.4zm218 53.9V384h-31.4V281.3L128 128h37.3c52.5 98.3 49.2 101.2 59.3 125.6 12.3-27 5.8-24.4 60.6-125.6H320l-80.8 155.1z\"]\n};\nvar faCreativeCommonsSampling = {\n prefix: 'fab',\n iconName: 'creative-commons-sampling',\n icon: [496, 512, [], \"f4f0\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm3.6 53.2c2.8-.3 11.5 1 11.5 11.5l6.6 107.2 4.9-59.3c0-6 4.7-10.6 10.6-10.6 5.9 0 10.6 4.7 10.6 10.6 0 2.5-.5-5.7 5.7 81.5l5.8-64.2c.3-2.9 2.9-9.3 10.2-9.3 3.8 0 9.9 2.3 10.6 8.9l11.5 96.5 5.3-12.8c1.8-4.4 5.2-6.6 10.2-6.6h58v21.3h-50.9l-18.2 44.3c-3.9 9.9-19.5 9.1-20.8-3.1l-4-31.9-7.5 92.6c-.3 3-3 9.3-10.2 9.3-3 0-9.8-2.1-10.6-9.3 0-1.9.6 5.8-6.2-77.9l-5.3 72.2c-1.1 4.8-4.8 9.3-10.6 9.3-2.9 0-9.8-2-10.6-9.3 0-1.9.5 6.7-5.8-87.7l-5.8 94.8c0 6.3-3.6 12.4-10.6 12.4-5.2 0-10.6-4.1-10.6-12l-5.8-87.7c-5.8 92.5-5.3 84-5.3 85.9-1.1 4.8-4.8 9.3-10.6 9.3-3 0-9.8-2.1-10.6-9.3 0-.7-.4-1.1-.4-2.6l-6.2-88.6L182 348c-.7 6.5-6.7 9.3-10.6 9.3-5.8 0-9.6-4.1-10.6-8.9L149.7 272c-2 4-3.5 8.4-11.1 8.4H87.2v-21.3H132l13.7-27.9c4.4-9.9 18.2-7.2 19.9 2.7l3.1 20.4 8.4-97.9c0-6 4.8-10.6 10.6-10.6.5 0 10.6-.2 10.6 12.4l4.9 69.1 6.6-92.6c0-10.1 9.5-10.6 10.2-10.6.6 0 10.6.7 10.6 10.6l5.3 80.6 6.2-97.9c.1-1.1-.6-10.3 9.9-11.5z\"]\n};\nvar faAdversal = {\n prefix: 'fab',\n iconName: 'adversal',\n icon: [512, 512, [], \"f36a\", \"M482.1 32H28.7C5.8 32 0 37.9 0 60.9v390.2C0 474.4 5.8 480 28.7 480h453.4c24.4 0 29.9-5.2 29.9-29.7V62.2c0-24.6-5.4-30.2-29.9-30.2zM178.4 220.3c-27.5-20.2-72.1-8.7-84.2 23.4-4.3 11.1-9.3 9.5-17.5 8.3-9.7-1.5-17.2-3.2-22.5-5.5-28.8-11.4 8.6-55.3 24.9-64.3 41.1-21.4 83.4-22.2 125.3-4.8 40.9 16.8 34.5 59.2 34.5 128.5 2.7 25.8-4.3 58.3 9.3 88.8 1.9 4.4.4 7.9-2.7 10.7-8.4 6.7-39.3 2.2-46.6-7.4-1.9-2.2-1.8-3.6-3.9-6.2-3.6-3.9-7.3-2.2-11.9 1-57.4 36.4-140.3 21.4-147-43.3-3.1-29.3 12.4-57.1 39.6-71 38.2-19.5 112.2-11.8 114-30.9 1.1-10.2-1.9-20.1-11.3-27.3zm286.7 222c0 15.1-11.1 9.9-17.8 9.9H52.4c-7.4 0-18.2 4.8-17.8-10.7.4-13.9 10.5-9.1 17.1-9.1 132.3-.4 264.5-.4 396.8 0 6.8 0 16.6-4.4 16.6 9.9zm3.8-340.5v291c0 5.7-.7 13.9-8.1 13.9-12.4-.4-27.5 7.1-36.1-5.6-5.8-8.7-7.8-4-12.4-1.2-53.4 29.7-128.1 7.1-144.4-85.2-6.1-33.4-.7-67.1 15.7-100 11.8-23.9 56.9-76.1 136.1-30.5v-71c0-26.2-.1-26.2 26-26.2 3.1 0 6.6.4 9.7 0 10.1-.8 13.6 4.4 13.6 14.3-.1.2-.1.3-.1.5zm-51.5 232.3c-19.5 47.6-72.9 43.3-90 5.2-15.1-33.3-15.5-68.2.4-101.5 16.3-34.1 59.7-35.7 81.5-4.8 20.6 28.8 14.9 84.6 8.1 101.1zm-294.8 35.3c-7.5-1.3-33-3.3-33.7-27.8-.4-13.9 7.8-23 19.8-25.8 24.4-5.9 49.3-9.9 73.7-14.7 8.9-2 7.4 4.4 7.8 9.5 1.4 33-26.1 59.2-67.6 58.8z\"]\n};\nvar faCreativeCommons = {\n prefix: 'fab',\n iconName: 'creative-commons',\n icon: [496, 512, [], \"f25e\", \"M245.83 214.87l-33.22 17.28c-9.43-19.58-25.24-19.93-27.46-19.93-22.13 0-33.22 14.61-33.22 43.84 0 23.57 9.21 43.84 33.22 43.84 14.47 0 24.65-7.09 30.57-21.26l30.55 15.5c-6.17 11.51-25.69 38.98-65.1 38.98-22.6 0-73.96-10.32-73.96-77.05 0-58.69 43-77.06 72.63-77.06 30.72-.01 52.7 11.95 65.99 35.86zm143.05 0l-32.78 17.28c-9.5-19.77-25.72-19.93-27.9-19.93-22.14 0-33.22 14.61-33.22 43.84 0 23.55 9.23 43.84 33.22 43.84 14.45 0 24.65-7.09 30.54-21.26l31 15.5c-2.1 3.75-21.39 38.98-65.09 38.98-22.69 0-73.96-9.87-73.96-77.05 0-58.67 42.97-77.06 72.63-77.06 30.71-.01 52.58 11.95 65.56 35.86zM247.56 8.05C104.74 8.05 0 123.11 0 256.05c0 138.49 113.6 248 247.56 248 129.93 0 248.44-100.87 248.44-248 0-137.87-106.62-248-248.44-248zm.87 450.81c-112.54 0-203.7-93.04-203.7-202.81 0-105.42 85.43-203.27 203.72-203.27 112.53 0 202.82 89.46 202.82 203.26-.01 121.69-99.68 202.82-202.84 202.82z\"]\n};\nvar faWatchmanMonitoring = {\n prefix: 'fab',\n iconName: 'watchman-monitoring',\n icon: [512, 512, [], \"e087\", \"M256,16C123.452,16,16,123.452,16,256S123.452,496,256,496,496,388.548,496,256,388.548,16,256,16ZM121.69,429.122C70.056,388.972,36.741,326.322,36.741,256a218.519,218.519,0,0,1,9.587-64.122l102.9-17.895-.121,10.967-13.943,2.013s-.144,12.5-.144,19.549a12.778,12.778,0,0,0,4.887,10.349l9.468,7.4Zm105.692-283.27,8.48-7.618s6.934-5.38-.143-9.344c-7.188-4.024-39.53-34.5-39.53-34.5-5.348-5.477-8.257-7.347-15.46,0,0,0-32.342,30.474-39.529,34.5-7.078,3.964-.144,9.344-.144,9.344l8.481,7.618-.048,4.369L75.982,131.045c39.644-56.938,105.532-94.3,180.018-94.3A218.754,218.754,0,0,1,420.934,111.77l-193.512,37.7Zm34.063,329.269-33.9-250.857,9.467-7.4a12.778,12.778,0,0,0,4.888-10.349c0-7.044-.144-19.549-.144-19.549l-13.943-2.013-.116-10.474,241.711,31.391A218.872,218.872,0,0,1,475.259,256C475.259,375.074,379.831,472.212,261.445,475.121Z\"]\n};\nvar faFonticons = {\n prefix: 'fab',\n iconName: 'fonticons',\n icon: [448, 512, [], \"f280\", \"M0 32v448h448V32zm187 140.9c-18.4 0-19 9.9-19 27.4v23.3c0 2.4-3.5 4.4-.6 4.4h67.4l-11.1 37.3H168v112.9c0 5.8-2 6.7 3.2 7.3l43.5 4.1v25.1H84V389l21.3-2c5.2-.6 6.7-2.3 6.7-7.9V267.7c0-2.3-2.9-2.3-5.8-2.3H84V228h28v-21c0-49.6 26.5-70 77.3-70 34.1 0 64.7 8.2 64.7 52.8l-50.7 6.1c.3-18.7-4.4-23-16.3-23zm74.3 241.8v-25.1l20.4-2.6c5.2-.6 7.6-1.7 7.6-7.3V271.8c0-4.1-2.9-6.7-6.7-7.9l-24.2-6.4 6.7-29.5h80.2v151.7c0 5.8-2.6 6.4 2.9 7.3l15.7 2.6v25.1zm80.8-255.5l9 33.2-7.3 7.3-31.2-16.6-31.2 16.6-7.3-7.3 9-33.2-21.8-24.2 3.5-9.6h27.7l15.5-28h9.3l15.5 28h27.7l3.5 9.6z\"]\n};\nvar faWeixin = {\n prefix: 'fab',\n iconName: 'weixin',\n icon: [576, 512, [], \"f1d7\", \"M385.2 167.6c6.4 0 12.6.3 18.8 1.1C387.4 90.3 303.3 32 207.7 32 100.5 32 13 104.8 13 197.4c0 53.4 29.3 97.5 77.9 131.6l-19.3 58.6 68-34.1c24.4 4.8 43.8 9.7 68.2 9.7 6.2 0 12.1-.3 18.3-.8-4-12.9-6.2-26.6-6.2-40.8-.1-84.9 72.9-154 165.3-154zm-104.5-52.9c14.5 0 24.2 9.7 24.2 24.4 0 14.5-9.7 24.2-24.2 24.2-14.8 0-29.3-9.7-29.3-24.2.1-14.7 14.6-24.4 29.3-24.4zm-136.4 48.6c-14.5 0-29.3-9.7-29.3-24.2 0-14.8 14.8-24.4 29.3-24.4 14.8 0 24.4 9.7 24.4 24.4 0 14.6-9.6 24.2-24.4 24.2zM563 319.4c0-77.9-77.9-141.3-165.4-141.3-92.7 0-165.4 63.4-165.4 141.3S305 460.7 397.6 460.7c19.3 0 38.9-5.1 58.6-9.9l53.4 29.3-14.8-48.6C534 402.1 563 363.2 563 319.4zm-219.1-24.5c-9.7 0-19.3-9.7-19.3-19.6 0-9.7 9.7-19.3 19.3-19.3 14.8 0 24.4 9.7 24.4 19.3 0 10-9.7 19.6-24.4 19.6zm107.1 0c-9.7 0-19.3-9.7-19.3-19.6 0-9.7 9.7-19.3 19.3-19.3 14.5 0 24.4 9.7 24.4 19.3.1 10-9.9 19.6-24.4 19.6z\"]\n};\nvar faShirtsinbulk = {\n prefix: 'fab',\n iconName: 'shirtsinbulk',\n icon: [448, 512, [], \"f214\", \"M100 410.3l30.6 13.4 4.4-9.9-30.6-13.4zm39.4 17.5l30.6 13.4 4.4-9.9-30.6-13.4zm172.1-14l4.4 9.9 30.6-13.4-4.4-9.9zM179.1 445l30.3 13.7 4.4-9.9-30.3-13.4zM60.4 392.8L91 406.2l4.4-9.6-30.6-13.7zm211.4 38.5l4.4 9.9 30.6-13.4-4.4-9.9zm-39.3 17.5l4.4 9.9 30.6-13.7-4.4-9.6zm118.4-52.2l4.4 9.6 30.6-13.4-4.4-9.9zM170 46.6h-33.5v10.5H170zm-47.2 0H89.2v10.5h33.5zm-47.3 0H42.3v10.5h33.3zm141.5 0h-33.2v10.5H217zm94.5 0H278v10.5h33.5zm47.3 0h-33.5v10.5h33.5zm-94.6 0H231v10.5h33.2zm141.5 0h-33.3v10.5h33.3zM52.8 351.1H42v33.5h10.8zm70-215.9H89.2v10.5h33.5zm-70 10.6h22.8v-10.5H42v33.5h10.8zm168.9 228.6c50.5 0 91.3-40.8 91.3-91.3 0-50.2-40.8-91.3-91.3-91.3-50.2 0-91.3 41.1-91.3 91.3 0 50.5 41.1 91.3 91.3 91.3zm-48.2-111.1c0-25.4 29.5-31.8 49.6-31.8 16.9 0 29.2 5.8 44.3 12l-8.8 16.9h-.9c-6.4-9.9-24.8-13.1-35.6-13.1-9 0-29.8 1.8-29.8 14.9 0 21.6 78.5-10.2 78.5 37.9 0 25.4-31.5 31.2-51 31.2-18.1 0-32.4-2.9-47.2-12.2l9-18.4h.9c6.1 12.2 23.6 14.9 35.9 14.9 8.7 0 32.7-1.2 32.7-14.3 0-26.1-77.6 6.3-77.6-38zM52.8 178.4H42V212h10.8zm342.4 206.2H406v-33.5h-10.8zM52.8 307.9H42v33.5h10.8zM0 3.7v406l221.7 98.6L448 409.7V3.7zm418.8 387.1L222 476.5 29.2 390.8V120.7h389.7v270.1zm0-299.3H29.2V32.9h389.7v58.6zm-366 130.1H42v33.5h10.8zm0 43.2H42v33.5h10.8zM170 135.2h-33.5v10.5H170zm225.2 163.1H406v-33.5h-10.8zm0-43.2H406v-33.5h-10.8zM217 135.2h-33.2v10.5H217zM395.2 212H406v-33.5h-10.8zm0 129.5H406V308h-10.8zm-131-206.3H231v10.5h33.2zm47.3 0H278v10.5h33.5zm83.7 33.6H406v-33.5h-33.5v10.5h22.8zm-36.4-33.6h-33.5v10.5h33.5z\"]\n};\nvar faCodepen = {\n prefix: 'fab',\n iconName: 'codepen',\n icon: [512, 512, [], \"f1cb\", \"M502.285 159.704l-234-156c-7.987-4.915-16.511-4.96-24.571 0l-234 156C3.714 163.703 0 170.847 0 177.989v155.999c0 7.143 3.714 14.286 9.715 18.286l234 156.022c7.987 4.915 16.511 4.96 24.571 0l234-156.022c6-3.999 9.715-11.143 9.715-18.286V177.989c-.001-7.142-3.715-14.286-9.716-18.285zM278 63.131l172.286 114.858-76.857 51.429L278 165.703V63.131zm-44 0v102.572l-95.429 63.715-76.857-51.429L234 63.131zM44 219.132l55.143 36.857L44 292.846v-73.714zm190 229.715L61.714 333.989l76.857-51.429L234 346.275v102.572zm22-140.858l-77.715-52 77.715-52 77.715 52-77.715 52zm22 140.858V346.275l95.429-63.715 76.857 51.429L278 448.847zm190-156.001l-55.143-36.857L468 219.132v73.714z\"]\n};\nvar faGitAlt = {\n prefix: 'fab',\n iconName: 'git-alt',\n icon: [448, 512, [], \"f841\", \"M439.55 236.05L244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z\"]\n};\nvar faLyft = {\n prefix: 'fab',\n iconName: 'lyft',\n icon: [512, 512, [], \"f3c3\", \"M0 81.1h77.8v208.7c0 33.1 15 52.8 27.2 61-12.7 11.1-51.2 20.9-80.2-2.8C7.8 334 0 310.7 0 289V81.1zm485.9 173.5v-22h23.8v-76.8h-26.1c-10.1-46.3-51.2-80.7-100.3-80.7-56.6 0-102.7 46-102.7 102.7V357c16 2.3 35.4-.3 51.7-14 17.1-14 24.8-37.2 24.8-59v-6.7h38.8v-76.8h-38.8v-23.3c0-34.6 52.2-34.6 52.2 0v77.1c0 56.6 46 102.7 102.7 102.7v-76.5c-14.5 0-26.1-11.7-26.1-25.9zm-294.3-99v113c0 15.4-23.8 15.4-23.8 0v-113H91v132.7c0 23.8 8 54 45 63.9 37 9.8 58.2-10.6 58.2-10.6-2.1 13.4-14.5 23.3-34.9 25.3-15.5 1.6-35.2-3.6-45-7.8v70.3c25.1 7.5 51.5 9.8 77.6 4.7 47.1-9.1 76.8-48.4 76.8-100.8V155.1h-77.1v.5z\"]\n};\nvar faRev = {\n prefix: 'fab',\n iconName: 'rev',\n icon: [448, 512, [], \"f5b2\", \"M289.67 274.89a65.57 65.57 0 1 1-65.56-65.56 65.64 65.64 0 0 1 65.56 65.56zm139.55-5.05h-.13a204.69 204.69 0 0 0-74.32-153l-45.38 26.2a157.07 157.07 0 0 1 71.81 131.84C381.2 361.5 310.73 432 224.11 432S67 361.5 67 274.88c0-81.88 63-149.27 143-156.43v39.12l108.77-62.79L210 32v38.32c-106.7 7.25-191 96-191 204.57 0 111.59 89.12 202.29 200.06 205v.11h210.16V269.84z\"]\n};\nvar faWindows = {\n prefix: 'fab',\n iconName: 'windows',\n icon: [448, 512, [], \"f17a\", \"M0 93.7l183.6-25.3v177.4H0V93.7zm0 324.6l183.6 25.3V268.4H0v149.9zm203.8 28L448 480V268.4H203.8v177.9zm0-380.6v180.1H448V32L203.8 65.7z\"]\n};\nvar faWizardsOfTheCoast = {\n prefix: 'fab',\n iconName: 'wizards-of-the-coast',\n icon: [640, 512, [], \"f730\", \"M219.19 345.69c-1.9 1.38-11.07 8.44-.26 23.57 4.64 6.42 14.11 12.79 21.73 6.55 6.5-4.88 7.35-12.92.26-23.04-5.47-7.76-14.28-12.88-21.73-7.08zm336.75 75.94c-.34 1.7-.55 1.67.79 0 2.09-4.19 4.19-10.21 4.98-19.9 3.14-38.49-40.33-71.49-101.34-78.03-54.73-6.02-124.38 9.17-188.8 60.49l-.26 1.57c2.62 4.98 4.98 10.74 3.4 21.21l.79.26c63.89-58.4 131.19-77.25 184.35-73.85 58.4 3.67 100.03 34.04 100.03 68.08-.01 9.96-2.63 15.72-3.94 20.17zM392.28 240.42c.79 7.07 4.19 10.21 9.17 10.47 5.5.26 9.43-2.62 10.47-6.55.79-3.4 2.09-29.85 2.09-29.85s-11.26 6.55-14.93 10.47c-3.66 3.68-7.33 8.39-6.8 15.46zm-50.02-151.1C137.75 89.32 13.1 226.8.79 241.2c-1.05.52-1.31.79.79 1.31 60.49 16.5 155.81 81.18 196.13 202.16l1.05.26c55.25-69.92 140.88-128.05 236.99-128.05 80.92 0 130.15 42.16 130.15 80.39 0 18.33-6.55 33.52-22.26 46.35 0 .96-.2.79.79.79 14.66-10.74 27.5-28.8 27.5-48.18 0-22.78-12.05-38.23-12.05-38.23 7.07 7.07 10.74 16.24 10.74 16.24 5.76-40.85 26.97-62.32 26.97-62.32-2.36-9.69-6.81-17.81-6.81-17.81 7.59 8.12 14.4 27.5 14.4 41.37 0 10.47-3.4 22.78-12.57 31.95l.26.52c8.12-4.98 16.5-16.76 16.5-37.97 0-15.71-4.71-25.92-4.71-25.92 5.76-5.24 11.26-9.17 15.97-11.78.79 3.4 2.09 9.69 2.36 14.93 0 1.05.79 1.83 1.05 0 .79-5.76-.26-16.24-.26-16.5 6.02-3.14 9.69-4.45 9.69-4.45C617.74 176 489.43 89.32 342.26 89.32zm-99.24 289.62c-11.06 8.99-24.2 4.08-30.64-4.19-7.45-9.58-6.76-24.09 4.19-32.47 14.85-11.35 27.08-.49 31.16 5.5.28.39 12.13 16.57-4.71 31.16zm2.09-136.43l9.43-17.81 11.78 70.96-12.57 6.02-24.62-28.8 14.14-26.71 3.67 4.45-1.83-8.11zm18.59 117.58l-.26-.26c2.05-4.1-2.5-6.61-17.54-31.69-1.31-2.36-3.14-2.88-4.45-2.62l-.26-.52c7.86-5.76 15.45-10.21 25.4-15.71l.52.26c1.31 1.83 2.09 2.88 3.4 4.71l-.26.52c-1.05-.26-2.36-.79-5.24.26-2.09.79-7.86 3.67-12.31 7.59v1.31c1.57 2.36 3.93 6.55 5.76 9.69h.26c10.05-6.28 7.56-4.55 11.52-7.86h.26c.52 1.83.52 1.83 1.83 5.5l-.26.26c-3.06.61-4.65.34-11.52 5.5v.26c9.46 17.02 11.01 16.75 12.57 15.97l.26.26c-2.34 1.59-6.27 4.21-9.68 6.57zm55.26-32.47c-3.14 1.57-6.02 2.88-9.95 4.98l-.26-.26c1.29-2.59 1.16-2.71-11.78-32.47l-.26-.26c-.15 0-8.9 3.65-9.95 7.33h-.52l-1.05-5.76.26-.52c7.29-4.56 25.53-11.64 27.76-12.57l.52.26 3.14 4.98-.26.52c-3.53-1.76-7.35.76-12.31 2.62v.26c12.31 32.01 12.67 30.64 14.66 30.64v.25zm44.77-16.5c-4.19 1.05-5.24 1.31-9.69 2.88l-.26-.26.52-4.45c-1.05-3.4-3.14-11.52-3.67-13.62l-.26-.26c-3.4.79-8.9 2.62-12.83 3.93l-.26.26c.79 2.62 3.14 9.95 4.19 13.88.79 2.36 1.83 2.88 2.88 3.14v.52c-3.67 1.05-7.07 2.62-10.21 3.93l-.26-.26c1.05-1.31 1.05-2.88.26-4.98-1.05-3.14-8.12-23.83-9.17-27.23-.52-1.83-1.57-3.14-2.62-3.14v-.52c3.14-1.05 6.02-2.09 10.74-3.4l.26.26-.26 4.71c1.31 3.93 2.36 7.59 3.14 9.69h.26c3.93-1.31 9.43-2.88 12.83-3.93l.26-.26-2.62-9.43c-.52-1.83-1.05-3.4-2.62-3.93v-.26c4.45-1.05 7.33-1.83 10.74-2.36l.26.26c-1.05 1.31-1.05 2.88-.52 4.45 1.57 6.28 4.71 20.43 6.28 26.45.54 2.62 1.85 3.41 2.63 3.93zm32.21-6.81l-.26.26c-4.71.52-14.14 2.36-22.52 4.19l-.26-.26.79-4.19c-1.57-7.86-3.4-18.59-4.98-26.19-.26-1.83-.79-2.88-2.62-3.67l.79-.52c9.17-1.57 20.16-2.36 24.88-2.62l.26.26c.52 2.36.79 3.14 1.57 5.5l-.26.26c-1.14-1.14-3.34-3.2-16.24-.79l-.26.26c.26 1.57 1.05 6.55 1.57 9.95l.26.26c9.52-1.68 4.76-.06 10.74-2.36h.26c0 1.57-.26 1.83-.26 5.24h-.26c-4.81-1.03-2.15-.9-10.21 0l-.26.26c.26 2.09 1.57 9.43 2.09 12.57l.26.26c1.15.38 14.21-.65 16.24-4.71h.26c-.53 2.38-1.05 4.21-1.58 6.04zm10.74-44.51c-4.45 2.36-8.12 2.88-11 2.88-.25.02-11.41 1.09-17.54-9.95-6.74-10.79-.98-25.2 5.5-31.69 8.8-8.12 23.35-10.1 28.54-17.02 8.03-10.33-13.04-22.31-29.59-5.76l-2.62-2.88 5.24-16.24c25.59-1.57 45.2-3.04 50.02 16.24.79 3.14 0 9.43-.26 12.05 0 2.62-1.83 18.85-2.09 23.04-.52 4.19-.79 18.33-.79 20.69.26 2.36.52 4.19 1.57 5.5 1.57 1.83 5.76 1.83 5.76 1.83l-.79 4.71c-11.82-1.07-10.28-.59-20.43-1.05-3.22-5.15-2.23-3.28-4.19-7.86 0 .01-4.19 3.94-7.33 5.51zm37.18 21.21c-6.35-10.58-19.82-7.16-21.73 5.5-2.63 17.08 14.3 19.79 20.69 10.21l.26.26c-.52 1.83-1.83 6.02-1.83 6.28l-.52.52c-10.3 6.87-28.5-2.5-25.66-18.59 1.94-10.87 14.44-18.93 28.8-9.95l.26.52c0 1.06-.27 3.41-.27 5.25zm5.77-87.73v-6.55c.69 0 19.65 3.28 27.76 7.33l-1.57 17.54s10.21-9.43 15.45-10.74c5.24-1.57 14.93 7.33 14.93 7.33l-11.26 11.26c-12.07-6.35-19.59-.08-20.69.79-5.29 38.72-8.6 42.17 4.45 46.09l-.52 4.71c-17.55-4.29-18.53-4.5-36.92-7.33l.79-4.71c7.25 0 7.48-5.32 7.59-6.81 0 0 4.98-53.16 4.98-55.25-.02-2.87-4.99-3.66-4.99-3.66zm10.99 114.44c-8.12-2.09-14.14-11-10.74-20.69 3.14-9.43 12.31-12.31 18.85-10.21 9.17 2.62 12.83 11.78 10.74 19.38-2.61 8.9-9.42 13.87-18.85 11.52zm42.16 9.69c-2.36-.52-7.07-2.36-8.64-2.88v-.26l1.57-1.83c.59-8.24.59-7.27.26-7.59-4.82-1.81-6.66-2.36-7.07-2.36-1.31 1.83-2.88 4.45-3.67 5.5l-.79 3.4v.26c-1.31-.26-3.93-1.31-6.02-1.57v-.26l2.62-1.83c3.4-4.71 9.95-14.14 13.88-20.16v-2.09l.52-.26c2.09.79 5.5 2.09 7.59 2.88.48.48.18-1.87-1.05 25.14-.24 1.81.02 2.6.8 3.91zm-4.71-89.82c11.25-18.27 30.76-16.19 34.04-3.4L539.7 198c2.34-6.25-2.82-9.9-4.45-11.26l1.83-3.67c12.22 10.37 16.38 13.97 22.52 20.43-25.91 73.07-30.76 80.81-24.62 84.32l-1.83 4.45c-6.37-3.35-8.9-4.42-17.81-8.64l2.09-6.81c-.26-.26-3.93 3.93-9.69 3.67-19.06-1.3-22.89-31.75-9.67-52.9zm29.33 79.34c0-5.71-6.34-7.89-7.86-5.24-1.31 2.09 1.05 4.98 2.88 8.38 1.57 2.62 2.62 6.28 1.05 9.43-2.64 6.34-12.4 5.31-15.45-.79 0-.7-.27.09 1.83-4.71l.79-.26c-.57 5.66 6.06 9.61 8.38 4.98 1.05-2.09-.52-5.5-2.09-8.38-1.57-2.62-3.67-6.28-1.83-9.69 2.72-5.06 11.25-4.47 14.66 2.36v.52l-2.36 3.4zm21.21 13.36c-1.96-3.27-.91-2.14-4.45-4.71h-.26c-2.36 4.19-5.76 10.47-8.64 16.24-1.31 2.36-1.05 3.4-.79 3.93l-.26.26-5.76-4.45.26-.26 2.09-1.31c3.14-5.76 6.55-12.05 9.17-17.02v-.26c-2.64-1.98-1.22-1.51-6.02-1.83v-.26l3.14-3.4h.26c3.67 2.36 9.95 6.81 12.31 8.9l.26.26-1.31 3.91zm27.23-44.26l-2.88-2.88c.79-2.36 1.83-4.98 2.09-7.59.75-9.74-11.52-11.84-11.52-4.98 0 4.98 7.86 19.38 7.86 27.76 0 10.21-5.76 15.71-13.88 16.5-8.38.79-20.16-10.47-20.16-10.47l4.98-14.4 2.88 2.09c-2.97 17.8 17.68 20.37 13.35 5.24-1.06-4.02-18.75-34.2 2.09-38.23 13.62-2.36 23.04 16.5 23.04 16.5l-7.85 10.46zm35.62-10.21c-11-30.38-60.49-127.53-191.95-129.62-53.42-1.05-94.27 15.45-132.76 37.97l85.63-9.17-91.39 20.69 25.14 19.64-3.93-16.5c7.5-1.71 39.15-8.45 66.77-8.9l-22.26 80.39c13.61-.7 18.97-8.98 19.64-22.78l4.98-1.05.26 26.71c-22.46 3.21-37.3 6.69-49.49 9.95l13.09-43.21-61.54-36.66 2.36 8.12 10.21 4.98c6.28 18.59 19.38 56.56 20.43 58.66 1.95 4.28 3.16 5.78 12.05 4.45l1.05 4.98c-16.08 4.86-23.66 7.61-39.02 14.4l-2.36-4.71c4.4-2.94 8.73-3.94 5.5-12.83-23.7-62.5-21.48-58.14-22.78-59.44l2.36-4.45 33.52 67.3c-3.84-11.87 1.68 1.69-32.99-78.82l-41.9 88.51 4.71-13.88-35.88-42.16 27.76 93.48-11.78 8.38C95 228.58 101.05 231.87 93.23 231.52c-5.5-.26-13.62 5.5-13.62 5.5L74.63 231c30.56-23.53 31.62-24.33 58.4-42.68l4.19 7.07s-5.76 4.19-7.86 7.07c-5.9 9.28 1.67 13.28 61.8 75.68l-18.85-58.92 39.8-10.21 25.66 30.64 4.45-12.31-4.98-24.62 13.09-3.4.52 3.14 3.67-10.47-94.27 29.33 11.26-4.98-13.62-42.42 17.28-9.17 30.11 36.14 28.54-13.09c-1.41-7.47-2.47-14.5-4.71-19.64l17.28 13.88 4.71-2.09-59.18-42.68 23.08 11.5c18.98-6.07 25.23-7.47 32.21-9.69l2.62 11c-12.55 12.55 1.43 16.82 6.55 19.38l-13.62-61.01 12.05 28.28c4.19-1.31 7.33-2.09 7.33-2.09l2.62 8.64s-3.14 1.05-6.28 2.09l8.9 20.95 33.78-65.73-20.69 61.01c42.42-24.09 81.44-36.66 131.98-35.88 67.04 1.05 167.33 40.85 199.8 139.83.78 2.1-.01 2.63-.79.27zM203.48 152.43s1.83-.52 4.19-1.31l9.43 7.59c-.4 0-3.44-.25-11.26 2.36l-2.36-8.64zm143.76 38.5c-1.57-.6-26.46-4.81-33.26 20.69l21.73 17.02 11.53-37.71zM318.43 67.07c-58.4 0-106.05 12.05-114.96 14.4v.79c8.38 2.09 14.4 4.19 21.21 11.78l1.57.26c6.55-1.83 48.97-13.88 110.24-13.88 180.16 0 301.67 116.79 301.67 223.37v9.95c0 1.31.79 2.62 1.05.52.52-2.09.79-8.64.79-19.64.26-83.79-96.63-227.55-321.57-227.55zm211.06 169.68c1.31-5.76 0-12.31-7.33-13.09-9.62-1.13-16.14 23.79-17.02 33.52-.79 5.5-1.31 14.93 6.02 14.93 4.68-.01 9.72-.91 18.33-35.36zm-61.53 42.95c-2.62-.79-9.43-.79-12.57 10.47-1.83 6.81.52 13.35 6.02 14.66 3.67 1.05 8.9.52 11.78-10.74 2.62-9.94-1.83-13.61-5.23-14.39zM491 300.65c1.83.52 3.14 1.05 5.76 1.83 0-1.83.52-8.38.79-12.05-1.05 1.31-5.5 8.12-6.55 9.95v.27z\"]\n};\nvar faSquareViadeo = {\n prefix: 'fab',\n iconName: 'square-viadeo',\n icon: [448, 512, [\"viadeo-square\"], \"f2aa\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM280.7 381.2c-42.4 46.2-120 46.6-162.4 0-68-73.6-19.8-196.1 81.2-196.1 13.3 0 26.6 2.1 39.1 6.7-4.3 8.4-7.3 17.6-8.4 27.1-9.7-4.1-20.2-6-30.7-6-48.8 0-84.6 41.7-84.6 88.9 0 43 28.5 78.7 69.5 85.9 61.5-24 72.9-117.6 72.9-175 0-7.3 0-14.8-.6-22.1-11.2-32.9-26.6-64.6-44.2-94.5 27.1 18.3 41.9 62.5 44.2 94.1v.4c7.7 22.5 11.8 46.2 11.8 70 0 54.1-21.9 99-68.3 128.2l-2.4.2c50 1 86.2-38.6 86.2-87.2 0-12.2-2.1-24.3-6.9-35.7 9.5-1.9 18.5-5.6 26.4-10.5 15.3 36.6 12.6 87.3-22.8 125.6zM309 233.7c-13.3 0-25.1-7.1-34.4-16.1 21.9-12 49.6-30.7 62.3-53 1.5-3 4.1-8.6 4.5-12-12.5 27.9-44.2 49.8-73.9 56.7-4.7-7.3-7.5-15.5-7.5-24.3 0-10.3 5.2-24.1 12.9-31.6 21.6-20.5 53-8.5 72.4-50 32.5 46.2 13.1 130.3-36.3 130.3z\"]\n};\nvar faViadeoSquare = faSquareViadeo;\nvar faMeetup = {\n prefix: 'fab',\n iconName: 'meetup',\n icon: [512, 512, [], \"f2e0\", \"M99 414.3c1.1 5.7-2.3 11.1-8 12.3-5.4 1.1-10.9-2.3-12-8-1.1-5.4 2.3-11.1 7.7-12.3 5.4-1.2 11.1 2.3 12.3 8zm143.1 71.4c-6.3 4.6-8 13.4-3.7 20 4.6 6.6 13.4 8.3 20 3.7 6.3-4.6 8-13.4 3.4-20-4.2-6.5-13.1-8.3-19.7-3.7zm-86-462.3c6.3-1.4 10.3-7.7 8.9-14-1.1-6.6-7.4-10.6-13.7-9.1-6.3 1.4-10.3 7.7-9.1 14 1.4 6.6 7.6 10.6 13.9 9.1zM34.4 226.3c-10-6.9-23.7-4.3-30.6 6-6.9 10-4.3 24 5.7 30.9 10 7.1 23.7 4.6 30.6-5.7 6.9-10.4 4.3-24.1-5.7-31.2zm272-170.9c10.6-6.3 13.7-20 7.7-30.3-6.3-10.6-19.7-14-30-7.7s-13.7 20-7.4 30.6c6 10.3 19.4 13.7 29.7 7.4zm-191.1 58c7.7-5.4 9.4-16 4.3-23.7s-15.7-9.4-23.1-4.3c-7.7 5.4-9.4 16-4.3 23.7 5.1 7.8 15.6 9.5 23.1 4.3zm372.3 156c-7.4 1.7-12.3 9.1-10.6 16.9 1.4 7.4 8.9 12.3 16.3 10.6 7.4-1.4 12.3-8.9 10.6-16.6-1.5-7.4-8.9-12.3-16.3-10.9zm39.7-56.8c-1.1-5.7-6.6-9.1-12-8-5.7 1.1-9.1 6.9-8 12.6 1.1 5.4 6.6 9.1 12.3 8 5.4-1.5 9.1-6.9 7.7-12.6zM447 138.9c-8.6 6-10.6 17.7-4.9 26.3 5.7 8.6 17.4 10.6 26 4.9 8.3-6 10.3-17.7 4.6-26.3-5.7-8.7-17.4-10.9-25.7-4.9zm-6.3 139.4c26.3 43.1 15.1 100-26.3 129.1-17.4 12.3-37.1 17.7-56.9 17.1-12 47.1-69.4 64.6-105.1 32.6-1.1.9-2.6 1.7-3.7 2.9-39.1 27.1-92.3 17.4-119.4-22.3-9.7-14.3-14.6-30.6-15.1-46.9-65.4-10.9-90-94-41.1-139.7-28.3-46.9.6-107.4 53.4-114.9C151.6 70 234.1 38.6 290.1 82c67.4-22.3 136.3 29.4 130.9 101.1 41.1 12.6 52.8 66.9 19.7 95.2zm-70 74.3c-3.1-20.6-40.9-4.6-43.1-27.1-3.1-32 43.7-101.1 40-128-3.4-24-19.4-29.1-33.4-29.4-13.4-.3-16.9 2-21.4 4.6-2.9 1.7-6.6 4.9-11.7-.3-6.3-6-11.1-11.7-19.4-12.9-12.3-2-17.7 2-26.6 9.7-3.4 2.9-12 12.9-20 9.1-3.4-1.7-15.4-7.7-24-11.4-16.3-7.1-40 4.6-48.6 20-12.9 22.9-38 113.1-41.7 125.1-8.6 26.6 10.9 48.6 36.9 47.1 11.1-.6 18.3-4.6 25.4-17.4 4-7.4 41.7-107.7 44.6-112.6 2-3.4 8.9-8 14.6-5.1 5.7 3.1 6.9 9.4 6 15.1-1.1 9.7-28 70.9-28.9 77.7-3.4 22.9 26.9 26.6 38.6 4 3.7-7.1 45.7-92.6 49.4-98.3 4.3-6.3 7.4-8.3 11.7-8 3.1 0 8.3.9 7.1 10.9-1.4 9.4-35.1 72.3-38.9 87.7-4.6 20.6 6.6 41.4 24.9 50.6 11.4 5.7 62.5 15.7 58.5-11.1zm5.7 92.3c-10.3 7.4-12.9 22-5.7 32.6 7.1 10.6 21.4 13.1 32 6 10.6-7.4 13.1-22 6-32.6-7.4-10.6-21.7-13.5-32.3-6z\"]\n};\nvar faCentos = {\n prefix: 'fab',\n iconName: 'centos',\n icon: [448, 512, [], \"f789\", \"M289.6 97.5l31.6 31.7-76.3 76.5V97.5zm-162.4 31.7l76.3 76.5V97.5h-44.7zm41.5-41.6h44.7v127.9l10.8 10.8 10.8-10.8V87.6h44.7L224.2 32zm26.2 168.1l-10.8-10.8H55.5v-44.8L0 255.7l55.5 55.6v-44.8h128.6l10.8-10.8zm79.3-20.7h107.9v-44.8l-31.6-31.7zm173.3 20.7L392 200.1v44.8H264.3l-10.8 10.8 10.8 10.8H392v44.8l55.5-55.6zM65.4 176.2l32.5-31.7 90.3 90.5h15.3v-15.3l-90.3-90.5 31.6-31.7H65.4zm316.7-78.7h-78.5l31.6 31.7-90.3 90.5V235h15.3l90.3-90.5 31.6 31.7zM203.5 413.9V305.8l-76.3 76.5 31.6 31.7h44.7zM65.4 235h108.8l-76.3-76.5-32.5 31.7zm316.7 100.2l-31.6 31.7-90.3-90.5h-15.3v15.3l90.3 90.5-31.6 31.7h78.5zm0-58.8H274.2l76.3 76.5 31.6-31.7zm-60.9 105.8l-76.3-76.5v108.1h44.7zM97.9 352.9l76.3-76.5H65.4v44.8zm181.8 70.9H235V295.9l-10.8-10.8-10.8 10.8v127.9h-44.7l55.5 55.6zm-166.5-41.6l90.3-90.5v-15.3h-15.3l-90.3 90.5-32.5-31.7v78.7h79.4z\"]\n};\nvar faAdn = {\n prefix: 'fab',\n iconName: 'adn',\n icon: [496, 512, [], \"f170\", \"M248 167.5l64.9 98.8H183.1l64.9-98.8zM496 256c0 136.9-111.1 248-248 248S0 392.9 0 256 111.1 8 248 8s248 111.1 248 248zm-99.8 82.7L248 115.5 99.8 338.7h30.4l33.6-51.7h168.6l33.6 51.7h30.2z\"]\n};\nvar faCloudsmith = {\n prefix: 'fab',\n iconName: 'cloudsmith',\n icon: [332, 512, [], \"f384\", \"M332.5 419.9c0 46.4-37.6 84.1-84 84.1s-84-37.7-84-84.1 37.6-84 84-84 84 37.6 84 84zm-84-243.9c46.4 0 80-37.6 80-84s-33.6-84-80-84-88 37.6-88 84-29.6 76-76 76-84 41.6-84 88 37.6 80 84 80 84-33.6 84-80 33.6-80 80-80z\"]\n};\nvar faPiedPiperAlt = {\n prefix: 'fab',\n iconName: 'pied-piper-alt',\n icon: [576, 512, [], \"f1a8\", \"M244 246c-3.2-2-6.3-2.9-10.1-2.9-6.6 0-12.6 3.2-19.3 3.7l1.7 4.9zm135.9 197.9c-19 0-64.1 9.5-79.9 19.8l6.9 45.1c35.7 6.1 70.1 3.6 106-9.8-4.8-10-23.5-55.1-33-55.1zM340.8 177c6.6 2.8 11.5 9.2 22.7 22.1 2-1.4 7.5-5.2 7.5-8.6 0-4.9-11.8-13.2-13.2-23 11.2-5.7 25.2-6 37.6-8.9 68.1-16.4 116.3-52.9 146.8-116.7C548.3 29.3 554 16.1 554.6 2l-2 2.6c-28.4 50-33 63.2-81.3 100-31.9 24.4-69.2 40.2-106.6 54.6l-6.3-.3v-21.8c-19.6 1.6-19.7-14.6-31.6-23-18.7 20.6-31.6 40.8-58.9 51.1-12.7 4.8-19.6 10-25.9 21.8 34.9-16.4 91.2-13.5 98.8-10zM555.5 0l-.6 1.1-.3.9.6-.6zm-59.2 382.1c-33.9-56.9-75.3-118.4-150-115.5l-.3-6c-1.1-13.5 32.8 3.2 35.1-31l-14.4 7.2c-19.8-45.7-8.6-54.3-65.5-54.3-14.7 0-26.7 1.7-41.4 4.6 2.9 18.6 2.2 36.7-10.9 50.3l19.5 5.5c-1.7 3.2-2.9 6.3-2.9 9.8 0 21 42.8 2.9 42.8 33.6 0 18.4-36.8 60.1-54.9 60.1-8 0-53.7-50-53.4-60.1l.3-4.6 52.3-11.5c13-2.6 12.3-22.7-2.9-22.7-3.7 0-43.1 9.2-49.4 10.6-2-5.2-7.5-14.1-13.8-14.1-3.2 0-6.3 3.2-9.5 4-9.2 2.6-31 2.9-21.5 20.1L15.9 298.5c-5.5 1.1-8.9 6.3-8.9 11.8 0 6 5.5 10.9 11.5 10.9 8 0 131.3-28.4 147.4-32.2 2.6 3.2 4.6 6.3 7.8 8.6 20.1 14.4 59.8 85.9 76.4 85.9 24.1 0 58-22.4 71.3-41.9 3.2-4.3 6.9-7.5 12.4-6.9.6 13.8-31.6 34.2-33 43.7-1.4 10.2-1 35.2-.3 41.1 26.7 8.1 52-3.6 77.9-2.9 4.3-21 10.6-41.9 9.8-63.5l-.3-9.5c-1.4-34.2-10.9-38.5-34.8-58.6-1.1-1.1-2.6-2.6-3.7-4 2.2-1.4 1.1-1 4.6-1.7 88.5 0 56.3 183.6 111.5 229.9 33.1-15 72.5-27.9 103.5-47.2-29-25.6-52.6-45.7-72.7-79.9zm-196.2 46.1v27.2l11.8-3.4-2.9-23.8zm-68.7-150.4l24.1 61.2 21-13.8-31.3-50.9zm84.4 154.9l2 12.4c9-1.5 58.4-6.6 58.4-14.1 0-1.4-.6-3.2-.9-4.6-26.8 0-36.9 3.8-59.5 6.3z\"]\n};\nvar faSquareDribbble = {\n prefix: 'fab',\n iconName: 'square-dribbble',\n icon: [448, 512, [\"dribbble-square\"], \"f397\", \"M90.2 228.2c8.9-42.4 37.4-77.7 75.7-95.7 3.6 4.9 28 38.8 50.7 79-64 17-120.3 16.8-126.4 16.7zM314.6 154c-33.6-29.8-79.3-41.1-122.6-30.6 3.8 5.1 28.6 38.9 51 80 48.6-18.3 69.1-45.9 71.6-49.4zM140.1 364c40.5 31.6 93.3 36.7 137.3 18-2-12-10-53.8-29.2-103.6-55.1 18.8-93.8 56.4-108.1 85.6zm98.8-108.2c-3.4-7.8-7.2-15.5-11.1-23.2C159.6 253 93.4 252.2 87.4 252c0 1.4-.1 2.8-.1 4.2 0 35.1 13.3 67.1 35.1 91.4 22.2-37.9 67.1-77.9 116.5-91.8zm34.9 16.3c17.9 49.1 25.1 89.1 26.5 97.4 30.7-20.7 52.5-53.6 58.6-91.6-4.6-1.5-42.3-12.7-85.1-5.8zm-20.3-48.4c4.8 9.8 8.3 17.8 12 26.8 45.5-5.7 90.7 3.4 95.2 4.4-.3-32.3-11.8-61.9-30.9-85.1-2.9 3.9-25.8 33.2-76.3 53.9zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-64 176c0-88.2-71.8-160-160-160S64 167.8 64 256s71.8 160 160 160 160-71.8 160-160z\"]\n};\nvar faDribbbleSquare = faSquareDribbble;\nvar faCodiepie = {\n prefix: 'fab',\n iconName: 'codiepie',\n icon: [472, 512, [], \"f284\", \"M422.5 202.9c30.7 0 33.5 53.1-.3 53.1h-10.8v44.3h-26.6v-97.4h37.7zM472 352.6C429.9 444.5 350.4 504 248 504 111 504 0 393 0 256S111 8 248 8c97.4 0 172.8 53.7 218.2 138.4l-186 108.8L472 352.6zm-38.5 12.5l-60.3-30.7c-27.1 44.3-70.4 71.4-122.4 71.4-82.5 0-149.2-66.7-149.2-148.9 0-82.5 66.7-149.2 149.2-149.2 48.4 0 88.9 23.5 116.9 63.4l59.5-34.6c-40.7-62.6-104.7-100-179.2-100-121.2 0-219.5 98.3-219.5 219.5S126.8 475.5 248 475.5c78.6 0 146.5-42.1 185.5-110.4z\"]\n};\nvar faNode = {\n prefix: 'fab',\n iconName: 'node',\n icon: [640, 512, [], \"f419\", \"M316.3 452c-2.1 0-4.2-.6-6.1-1.6L291 439c-2.9-1.6-1.5-2.2-.5-2.5 3.8-1.3 4.6-1.6 8.7-4 .4-.2 1-.1 1.4.1l14.8 8.8c.5.3 1.3.3 1.8 0L375 408c.5-.3.9-.9.9-1.6v-66.7c0-.7-.3-1.3-.9-1.6l-57.8-33.3c-.5-.3-1.2-.3-1.8 0l-57.8 33.3c-.6.3-.9 1-.9 1.6v66.7c0 .6.4 1.2.9 1.5l15.8 9.1c8.6 4.3 13.9-.8 13.9-5.8v-65.9c0-.9.7-1.7 1.7-1.7h7.3c.9 0 1.7.7 1.7 1.7v65.9c0 11.5-6.2 18-17.1 18-3.3 0-6 0-13.3-3.6l-15.2-8.7c-3.7-2.2-6.1-6.2-6.1-10.5v-66.7c0-4.3 2.3-8.4 6.1-10.5l57.8-33.4c3.7-2.1 8.5-2.1 12.1 0l57.8 33.4c3.7 2.2 6.1 6.2 6.1 10.5v66.7c0 4.3-2.3 8.4-6.1 10.5l-57.8 33.4c-1.7 1.1-3.8 1.7-6 1.7zm46.7-65.8c0-12.5-8.4-15.8-26.2-18.2-18-2.4-19.8-3.6-19.8-7.8 0-3.5 1.5-8.1 14.8-8.1 11.9 0 16.3 2.6 18.1 10.6.2.8.8 1.3 1.6 1.3h7.5c.5 0 .9-.2 1.2-.5.3-.4.5-.8.4-1.3-1.2-13.8-10.3-20.2-28.8-20.2-16.5 0-26.3 7-26.3 18.6 0 12.7 9.8 16.1 25.6 17.7 18.9 1.9 20.4 4.6 20.4 8.3 0 6.5-5.2 9.2-17.4 9.2-15.3 0-18.7-3.8-19.8-11.4-.1-.8-.8-1.4-1.7-1.4h-7.5c-.9 0-1.7.7-1.7 1.7 0 9.7 5.3 21.3 30.6 21.3 18.5 0 29-7.2 29-19.8zm54.5-50.1c0 6.1-5 11.1-11.1 11.1s-11.1-5-11.1-11.1c0-6.3 5.2-11.1 11.1-11.1 6-.1 11.1 4.8 11.1 11.1zm-1.8 0c0-5.2-4.2-9.3-9.4-9.3-5.1 0-9.3 4.1-9.3 9.3 0 5.2 4.2 9.4 9.3 9.4 5.2-.1 9.4-4.3 9.4-9.4zm-4.5 6.2h-2.6c-.1-.6-.5-3.8-.5-3.9-.2-.7-.4-1.1-1.3-1.1h-2.2v5h-2.4v-12.5h4.3c1.5 0 4.4 0 4.4 3.3 0 2.3-1.5 2.8-2.4 3.1 1.7.1 1.8 1.2 2.1 2.8.1 1 .3 2.7.6 3.3zm-2.8-8.8c0-1.7-1.2-1.7-1.8-1.7h-2v3.5h1.9c1.6 0 1.9-1.1 1.9-1.8zM137.3 191c0-2.7-1.4-5.1-3.7-6.4l-61.3-35.3c-1-.6-2.2-.9-3.4-1h-.6c-1.2 0-2.3.4-3.4 1L3.7 184.6C1.4 185.9 0 188.4 0 191l.1 95c0 1.3.7 2.5 1.8 3.2 1.1.7 2.5.7 3.7 0L42 268.3c2.3-1.4 3.7-3.8 3.7-6.4v-44.4c0-2.6 1.4-5.1 3.7-6.4l15.5-8.9c1.2-.7 2.4-1 3.7-1 1.3 0 2.6.3 3.7 1l15.5 8.9c2.3 1.3 3.7 3.8 3.7 6.4v44.4c0 2.6 1.4 5.1 3.7 6.4l36.4 20.9c1.1.7 2.6.7 3.7 0 1.1-.6 1.8-1.9 1.8-3.2l.2-95zM472.5 87.3v176.4c0 2.6-1.4 5.1-3.7 6.4l-61.3 35.4c-2.3 1.3-5.1 1.3-7.4 0l-61.3-35.4c-2.3-1.3-3.7-3.8-3.7-6.4v-70.8c0-2.6 1.4-5.1 3.7-6.4l61.3-35.4c2.3-1.3 5.1-1.3 7.4 0l15.3 8.8c1.7 1 3.9-.3 3.9-2.2v-94c0-2.8 3-4.6 5.5-3.2l36.5 20.4c2.3 1.2 3.8 3.7 3.8 6.4zm-46 128.9c0-.7-.4-1.3-.9-1.6l-21-12.2c-.6-.3-1.3-.3-1.9 0l-21 12.2c-.6.3-.9.9-.9 1.6v24.3c0 .7.4 1.3.9 1.6l21 12.1c.6.3 1.3.3 1.8 0l21-12.1c.6-.3.9-.9.9-1.6v-24.3zm209.8-.7c2.3-1.3 3.7-3.8 3.7-6.4V192c0-2.6-1.4-5.1-3.7-6.4l-60.9-35.4c-2.3-1.3-5.1-1.3-7.4 0l-61.3 35.4c-2.3 1.3-3.7 3.8-3.7 6.4v70.8c0 2.7 1.4 5.1 3.7 6.4l60.9 34.7c2.2 1.3 5 1.3 7.3 0l36.8-20.5c2.5-1.4 2.5-5 0-6.4L550 241.6c-1.2-.7-1.9-1.9-1.9-3.2v-22.2c0-1.3.7-2.5 1.9-3.2l19.2-11.1c1.1-.7 2.6-.7 3.7 0l19.2 11.1c1.1.7 1.9 1.9 1.9 3.2v17.4c0 2.8 3.1 4.6 5.6 3.2l36.7-21.3zM559 219c-.4.3-.7.7-.7 1.2v13.6c0 .5.3 1 .7 1.2l11.8 6.8c.4.3 1 .3 1.4 0L584 235c.4-.3.7-.7.7-1.2v-13.6c0-.5-.3-1-.7-1.2l-11.8-6.8c-.4-.3-1-.3-1.4 0L559 219zm-254.2 43.5v-70.4c0-2.6-1.6-5.1-3.9-6.4l-61.1-35.2c-2.1-1.2-5-1.4-7.4 0l-61.1 35.2c-2.3 1.3-3.9 3.7-3.9 6.4v70.4c0 2.8 1.9 5.2 4 6.4l61.2 35.2c2.4 1.4 5.2 1.3 7.4 0l61-35.2c1.8-1 3.1-2.7 3.6-4.7.1-.5.2-1.1.2-1.7zm-74.3-124.9l-.8.5h1.1l-.3-.5zm76.2 130.2l-.4-.7v.9l.4-.2z\"]\n};\nvar faMix = {\n prefix: 'fab',\n iconName: 'mix',\n icon: [448, 512, [], \"f3cb\", \"M0 64v348.9c0 56.2 88 58.1 88 0V174.3c7.9-52.9 88-50.4 88 6.5v175.3c0 57.9 96 58 96 0V240c5.3-54.7 88-52.5 88 4.3v23.8c0 59.9 88 56.6 88 0V64H0z\"]\n};\nvar faSteam = {\n prefix: 'fab',\n iconName: 'steam',\n icon: [496, 512, [], \"f1b6\", \"M496 256c0 137-111.2 248-248.4 248-113.8 0-209.6-76.3-239-180.4l95.2 39.3c6.4 32.1 34.9 56.4 68.9 56.4 39.2 0 71.9-32.4 70.2-73.5l84.5-60.2c52.1 1.3 95.8-40.9 95.8-93.5 0-51.6-42-93.5-93.7-93.5s-93.7 42-93.7 93.5v1.2L176.6 279c-15.5-.9-30.7 3.4-43.5 12.1L0 236.1C10.2 108.4 117.1 8 247.6 8 384.8 8 496 119 496 256zM155.7 384.3l-30.5-12.6a52.79 52.79 0 0 0 27.2 25.8c26.9 11.2 57.8-1.6 69-28.4 5.4-13 5.5-27.3.1-40.3-5.4-13-15.5-23.2-28.5-28.6-12.9-5.4-26.7-5.2-38.9-.6l31.5 13c19.8 8.2 29.2 30.9 20.9 50.7-8.3 19.9-31 29.2-50.8 21zm173.8-129.9c-34.4 0-62.4-28-62.4-62.3s28-62.3 62.4-62.3 62.4 28 62.4 62.3-27.9 62.3-62.4 62.3zm.1-15.6c25.9 0 46.9-21 46.9-46.8 0-25.9-21-46.8-46.9-46.8s-46.9 21-46.9 46.8c.1 25.8 21.1 46.8 46.9 46.8z\"]\n};\nvar faCcApplePay = {\n prefix: 'fab',\n iconName: 'cc-apple-pay',\n icon: [576, 512, [], \"f416\", \"M302.2 218.4c0 17.2-10.5 27.1-29 27.1h-24.3v-54.2h24.4c18.4 0 28.9 9.8 28.9 27.1zm47.5 62.6c0 8.3 7.2 13.7 18.5 13.7 14.4 0 25.2-9.1 25.2-21.9v-7.7l-23.5 1.5c-13.3.9-20.2 5.8-20.2 14.4zM576 79v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V79c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM127.8 197.2c8.4.7 16.8-4.2 22.1-10.4 5.2-6.4 8.6-15 7.7-23.7-7.4.3-16.6 4.9-21.9 11.3-4.8 5.5-8.9 14.4-7.9 22.8zm60.6 74.5c-.2-.2-19.6-7.6-19.8-30-.2-18.7 15.3-27.7 16-28.2-8.8-13-22.4-14.4-27.1-14.7-12.2-.7-22.6 6.9-28.4 6.9-5.9 0-14.7-6.6-24.3-6.4-12.5.2-24.2 7.3-30.5 18.6-13.1 22.6-3.4 56 9.3 74.4 6.2 9.1 13.7 19.1 23.5 18.7 9.3-.4 13-6 24.2-6 11.3 0 14.5 6 24.3 5.9 10.2-.2 16.5-9.1 22.8-18.2 6.9-10.4 9.8-20.4 10-21zm135.4-53.4c0-26.6-18.5-44.8-44.9-44.8h-51.2v136.4h21.2v-46.6h29.3c26.8 0 45.6-18.4 45.6-45zm90 23.7c0-19.7-15.8-32.4-40-32.4-22.5 0-39.1 12.9-39.7 30.5h19.1c1.6-8.4 9.4-13.9 20-13.9 13 0 20.2 6 20.2 17.2v7.5l-26.4 1.6c-24.6 1.5-37.9 11.6-37.9 29.1 0 17.7 13.7 29.4 33.4 29.4 13.3 0 25.6-6.7 31.2-17.4h.4V310h19.6v-68zM516 210.9h-21.5l-24.9 80.6h-.4l-24.9-80.6H422l35.9 99.3-1.9 6c-3.2 10.2-8.5 14.2-17.9 14.2-1.7 0-4.9-.2-6.2-.3v16.4c1.2.4 6.5.5 8.1.5 20.7 0 30.4-7.9 38.9-31.8L516 210.9z\"]\n};\nvar faScribd = {\n prefix: 'fab',\n iconName: 'scribd',\n icon: [384, 512, [], \"f28a\", \"M42.3 252.7c-16.1-19-24.7-45.9-24.8-79.9 0-100.4 75.2-153.1 167.2-153.1 98.6-1.6 156.8 49 184.3 70.6l-50.5 72.1-37.3-24.6 26.9-38.6c-36.5-24-79.4-36.5-123-35.8-50.7-.8-111.7 27.2-111.7 76.2 0 18.7 11.2 20.7 28.6 15.6 23.3-5.3 41.9.6 55.8 14 26.4 24.3 23.2 67.6-.7 91.9-29.2 29.5-85.2 27.3-114.8-8.4zm317.7 5.9c-15.5-18.8-38.9-29.4-63.2-28.6-38.1-2-71.1 28-70.5 67.2-.7 16.8 6 33 18.4 44.3 14.1 13.9 33 19.7 56.3 14.4 17.4-5.1 28.6-3.1 28.6 15.6 0 4.3-.5 8.5-1.4 12.7-16.7 40.9-59.5 64.4-121.4 64.4-51.9.2-102.4-16.4-144.1-47.3l33.7-39.4-35.6-27.4L0 406.3l15.4 13.8c52.5 46.8 120.4 72.5 190.7 72.2 51.4 0 94.4-10.5 133.6-44.1 57.1-51.4 54.2-149.2 20.3-189.6z\"]\n};\nvar faOpenid = {\n prefix: 'fab',\n iconName: 'openid',\n icon: [448, 512, [], \"f19b\", \"M271.5 432l-68 32C88.5 453.7 0 392.5 0 318.2c0-71.5 82.5-131 191.7-144.3v43c-71.5 12.5-124 53-124 101.3 0 51 58.5 93.3 135.7 103v-340l68-33.2v384zM448 291l-131.3-28.5 36.8-20.7c-19.5-11.5-43.5-20-70-24.8v-43c46.2 5.5 87.7 19.5 120.3 39.3l35-19.8L448 291z\"]\n};\nvar faInstalod = {\n prefix: 'fab',\n iconName: 'instalod',\n icon: [512, 512, [], \"e081\", \"M153.384,480H387.113L502.554,275.765,204.229,333.211ZM504.726,240.078,387.113,32H155.669L360.23,267.9ZM124.386,48.809,7.274,256,123.236,461.154,225.627,165.561Z\"]\n};\nvar faExpeditedssl = {\n prefix: 'fab',\n iconName: 'expeditedssl',\n icon: [496, 512, [], \"f23e\", \"M248 43.4C130.6 43.4 35.4 138.6 35.4 256S130.6 468.6 248 468.6 460.6 373.4 460.6 256 365.4 43.4 248 43.4zm-97.4 132.9c0-53.7 43.7-97.4 97.4-97.4s97.4 43.7 97.4 97.4v26.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-26.6c0-82.1-124-82.1-124 0v26.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-26.6zM389.7 380c0 9.7-8 17.7-17.7 17.7H124c-9.7 0-17.7-8-17.7-17.7V238.3c0-9.7 8-17.7 17.7-17.7h248c9.7 0 17.7 8 17.7 17.7V380zm-248-137.3v132.9c0 2.5-1.9 4.4-4.4 4.4h-8.9c-2.5 0-4.4-1.9-4.4-4.4V242.7c0-2.5 1.9-4.4 4.4-4.4h8.9c2.5 0 4.4 1.9 4.4 4.4zm141.7 48.7c0 13-7.2 24.4-17.7 30.4v31.6c0 5-3.9 8.9-8.9 8.9h-17.7c-5 0-8.9-3.9-8.9-8.9v-31.6c-10.5-6.1-17.7-17.4-17.7-30.4 0-19.7 15.8-35.4 35.4-35.4s35.5 15.8 35.5 35.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 478.3C121 486.3 17.7 383 17.7 256S121 25.7 248 25.7 478.3 129 478.3 256 375 486.3 248 486.3z\"]\n};\nvar faSellcast = {\n prefix: 'fab',\n iconName: 'sellcast',\n icon: [448, 512, [], \"f2da\", \"M353.4 32H94.7C42.6 32 0 74.6 0 126.6v258.7C0 437.4 42.6 480 94.7 480h258.7c52.1 0 94.7-42.6 94.7-94.6V126.6c0-52-42.6-94.6-94.7-94.6zm-50 316.4c-27.9 48.2-89.9 64.9-138.2 37.2-22.9 39.8-54.9 8.6-42.3-13.2l15.7-27.2c5.9-10.3 19.2-13.9 29.5-7.9 18.6 10.8-.1-.1 18.5 10.7 27.6 15.9 63.4 6.3 79.4-21.3 15.9-27.6 6.3-63.4-21.3-79.4-17.8-10.2-.6-.4-18.6-10.6-24.6-14.2-3.4-51.9 21.6-37.5 18.6 10.8-.1-.1 18.5 10.7 48.4 28 65.1 90.3 37.2 138.5zm21.8-208.8c-17 29.5-16.3 28.8-19 31.5-6.5 6.5-16.3 8.7-26.5 3.6-18.6-10.8.1.1-18.5-10.7-27.6-15.9-63.4-6.3-79.4 21.3s-6.3 63.4 21.3 79.4c0 0 18.5 10.6 18.6 10.6 24.6 14.2 3.4 51.9-21.6 37.5-18.6-10.8.1.1-18.5-10.7-48.2-27.8-64.9-90.1-37.1-138.4 27.9-48.2 89.9-64.9 138.2-37.2l4.8-8.4c14.3-24.9 52-3.3 37.7 21.5z\"]\n};\nvar faSquareTwitter = {\n prefix: 'fab',\n iconName: 'square-twitter',\n icon: [448, 512, [\"twitter-square\"], \"f081\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-48.9 158.8c.2 2.8.2 5.7.2 8.5 0 86.7-66 186.6-186.6 186.6-37.2 0-71.7-10.8-100.7-29.4 5.3.6 10.4.8 15.8.8 30.7 0 58.9-10.4 81.4-28-28.8-.6-53-19.5-61.3-45.5 10.1 1.5 19.2 1.5 29.6-1.2-30-6.1-52.5-32.5-52.5-64.4v-.8c8.7 4.9 18.9 7.9 29.6 8.3a65.447 65.447 0 0 1-29.2-54.6c0-12.2 3.2-23.4 8.9-33.1 32.3 39.8 80.8 65.8 135.2 68.6-9.3-44.5 24-80.6 64-80.6 18.9 0 35.9 7.9 47.9 20.7 14.8-2.8 29-8.3 41.6-15.8-4.9 15.2-15.2 28-28.8 36.1 13.2-1.4 26-5.1 37.8-10.2-8.9 13.1-20.1 24.7-32.9 34z\"]\n};\nvar faTwitterSquare = faSquareTwitter;\nvar faRProject = {\n prefix: 'fab',\n iconName: 'r-project',\n icon: [581, 512, [], \"f4f7\", \"M581 226.6C581 119.1 450.9 32 290.5 32S0 119.1 0 226.6C0 322.4 103.3 402 239.4 418.1V480h99.1v-61.5c24.3-2.7 47.6-7.4 69.4-13.9L448 480h112l-67.4-113.7c54.5-35.4 88.4-84.9 88.4-139.7zm-466.8 14.5c0-73.5 98.9-133 220.8-133s211.9 40.7 211.9 133c0 50.1-26.5 85-70.3 106.4-2.4-1.6-4.7-2.9-6.4-3.7-10.2-5.2-27.8-10.5-27.8-10.5s86.6-6.4 86.6-92.7-90.6-87.9-90.6-87.9h-199V361c-74.1-21.5-125.2-67.1-125.2-119.9zm225.1 38.3v-55.6c57.8 0 87.8-6.8 87.8 27.3 0 36.5-38.2 28.3-87.8 28.3zm-.9 72.5H365c10.8 0 18.9 11.7 24 19.2-16.1 1.9-33 2.8-50.6 2.9v-22.1z\"]\n};\nvar faDelicious = {\n prefix: 'fab',\n iconName: 'delicious',\n icon: [448, 512, [], \"f1a5\", \"M446.5 68c-.4-1.5-.9-3-1.4-4.5-.9-2.5-2-4.8-3.3-7.1-1.4-2.4-3-4.8-4.7-6.9-2.1-2.5-4.4-4.8-6.9-6.8-1.1-.9-2.2-1.7-3.3-2.5-1.3-.9-2.6-1.7-4-2.4-1.8-1-3.6-1.8-5.5-2.5-1.7-.7-3.5-1.3-5.4-1.7-3.8-1-7.9-1.5-12-1.5H48C21.5 32 0 53.5 0 80v352c0 4.1.5 8.2 1.5 12 2 7.7 5.8 14.6 11 20.3 1 1.1 2.1 2.2 3.3 3.3 5.7 5.2 12.6 9 20.3 11 3.8 1 7.9 1.5 12 1.5h352c26.5 0 48-21.5 48-48V80c-.1-4.1-.6-8.2-1.6-12zM416 432c0 8.8-7.2 16-16 16H224V256H32V80c0-8.8 7.2-16 16-16h176v192h192z\"]\n};\nvar faFreebsd = {\n prefix: 'fab',\n iconName: 'freebsd',\n icon: [448, 512, [], \"f3a4\", \"M303.7 96.2c11.1-11.1 115.5-77 139.2-53.2 23.7 23.7-42.1 128.1-53.2 139.2-11.1 11.1-39.4.9-63.1-22.9-23.8-23.7-34.1-52-22.9-63.1zM109.9 68.1C73.6 47.5 22 24.6 5.6 41.1c-16.6 16.6 7.1 69.4 27.9 105.7 18.5-32.2 44.8-59.3 76.4-78.7zM406.7 174c3.3 11.3 2.7 20.7-2.7 26.1-20.3 20.3-87.5-27-109.3-70.1-18-32.3-11.1-53.4 14.9-48.7 5.7-3.6 12.3-7.6 19.6-11.6-29.8-15.5-63.6-24.3-99.5-24.3-119.1 0-215.6 96.5-215.6 215.6 0 119 96.5 215.6 215.6 215.6S445.3 380.1 445.3 261c0-38.4-10.1-74.5-27.7-105.8-3.9 7-7.6 13.3-10.9 18.8z\"]\n};\nvar faVuejs = {\n prefix: 'fab',\n iconName: 'vuejs',\n icon: [448, 512, [], \"f41f\", \"M356.9 64.3H280l-56 88.6-48-88.6H0L224 448 448 64.3h-91.1zm-301.2 32h53.8L224 294.5 338.4 96.3h53.8L224 384.5 55.7 96.3z\"]\n};\nvar faAccusoft = {\n prefix: 'fab',\n iconName: 'accusoft',\n icon: [640, 512, [], \"f369\", \"M322.1 252v-1l-51.2-65.8s-12 1.6-25 15.1c-9 9.3-242.1 239.1-243.4 240.9-7 10 1.6 6.8 15.7 1.7.8 0 114.5-36.6 114.5-36.6.5-.6-.1-.1.6-.6-.4-5.1-.8-26.2-1-27.7-.6-5.2 2.2-6.9 7-8.9l92.6-33.8c.6-.8 88.5-81.7 90.2-83.3zm160.1 120.1c13.3 16.1 20.7 13.3 30.8 9.3 3.2-1.2 115.4-47.6 117.8-48.9 8-4.3-1.7-16.7-7.2-23.4-2.1-2.5-205.1-245.6-207.2-248.3-9.7-12.2-14.3-12.9-38.4-12.8-10.2 0-106.8.5-116.5.6-19.2.1-32.9-.3-19.2 16.9C250 75 476.5 365.2 482.2 372.1zm152.7 1.6c-2.3-.3-24.6-4.7-38-7.2 0 0-115 50.4-117.5 51.6-16 7.3-26.9-3.2-36.7-14.6l-57.1-74c-5.4-.9-60.4-9.6-65.3-9.3-3.1.2-9.6.8-14.4 2.9-4.9 2.1-145.2 52.8-150.2 54.7-5.1 2-11.4 3.6-11.1 7.6.2 2.5 2 2.6 4.6 3.5 2.7.8 300.9 67.6 308 69.1 15.6 3.3 38.5 10.5 53.6 1.7 2.1-1.2 123.8-76.4 125.8-77.8 5.4-4 4.3-6.8-1.7-8.2z\"]\n};\nvar faIoxhost = {\n prefix: 'fab',\n iconName: 'ioxhost',\n icon: [640, 512, [], \"f208\", \"M616 160h-67.3C511.2 70.7 422.9 8 320 8 183 8 72 119 72 256c0 16.4 1.6 32.5 4.7 48H24c-13.3 0-24 10.8-24 24 0 13.3 10.7 24 24 24h67.3c37.5 89.3 125.8 152 228.7 152 137 0 248-111 248-248 0-16.4-1.6-32.5-4.7-48H616c13.3 0 24-10.8 24-24 0-13.3-10.7-24-24-24zm-96 96c0 110.5-89.5 200-200 200-75.7 0-141.6-42-175.5-104H424c13.3 0 24-10.8 24-24 0-13.3-10.7-24-24-24H125.8c-3.8-15.4-5.8-31.4-5.8-48 0-110.5 89.5-200 200-200 75.7 0 141.6 42 175.5 104H216c-13.3 0-24 10.8-24 24 0 13.3 10.7 24 24 24h298.2c3.8 15.4 5.8 31.4 5.8 48zm-304-24h208c13.3 0 24 10.7 24 24 0 13.2-10.7 24-24 24H216c-13.3 0-24-10.7-24-24 0-13.2 10.7-24 24-24z\"]\n};\nvar faFonticonsFi = {\n prefix: 'fab',\n iconName: 'fonticons-fi',\n icon: [384, 512, [], \"f3a2\", \"M114.4 224h92.4l-15.2 51.2h-76.4V433c0 8-2.8 9.2 4.4 10l59.6 5.6V483H0v-35.2l29.2-2.8c7.2-.8 9.2-3.2 9.2-10.8V278.4c0-3.2-4-3.2-8-3.2H0V224h38.4v-28.8c0-68 36.4-96 106-96 46.8 0 88.8 11.2 88.8 72.4l-69.6 8.4c.4-25.6-6-31.6-22.4-31.6-25.2 0-26 13.6-26 37.6v32c0 3.2-4.8 6-.8 6zM384 483H243.2v-34.4l28-3.6c7.2-.8 10.4-2.4 10.4-10V287c0-5.6-4-9.2-9.2-10.8l-33.2-8.8 9.2-40.4h110v208c0 8-3.6 8.8 4 10l21.6 3.6V483zm-30-347.2l12.4 45.6-10 10-42.8-22.8-42.8 22.8-10-10 12.4-45.6-30-36.4 4.8-10h38L307.2 51H320l21.2 38.4h38l4.8 13.2-30 33.2z\"]\n};\nvar faAppStore = {\n prefix: 'fab',\n iconName: 'app-store',\n icon: [512, 512, [], \"f36f\", \"M255.9 120.9l9.1-15.7c5.6-9.8 18.1-13.1 27.9-7.5 9.8 5.6 13.1 18.1 7.5 27.9l-87.5 151.5h63.3c20.5 0 32 24.1 23.1 40.8H113.8c-11.3 0-20.4-9.1-20.4-20.4 0-11.3 9.1-20.4 20.4-20.4h52l66.6-115.4-20.8-36.1c-5.6-9.8-2.3-22.2 7.5-27.9 9.8-5.6 22.2-2.3 27.9 7.5l8.9 15.7zm-78.7 218l-19.6 34c-5.6 9.8-18.1 13.1-27.9 7.5-9.8-5.6-13.1-18.1-7.5-27.9l14.6-25.2c16.4-5.1 29.8-1.2 40.4 11.6zm168.9-61.7h53.1c11.3 0 20.4 9.1 20.4 20.4 0 11.3-9.1 20.4-20.4 20.4h-29.5l19.9 34.5c5.6 9.8 2.3 22.2-7.5 27.9-9.8 5.6-22.2 2.3-27.9-7.5-33.5-58.1-58.7-101.6-75.4-130.6-17.1-29.5-4.9-59.1 7.2-69.1 13.4 23 33.4 57.7 60.1 104zM256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm216 248c0 118.7-96.1 216-216 216-118.7 0-216-96.1-216-216 0-118.7 96.1-216 216-216 118.7 0 216 96.1 216 216z\"]\n};\nvar faCcMastercard = {\n prefix: 'fab',\n iconName: 'cc-mastercard',\n icon: [576, 512, [], \"f1f1\", \"M482.9 410.3c0 6.8-4.6 11.7-11.2 11.7-6.8 0-11.2-5.2-11.2-11.7 0-6.5 4.4-11.7 11.2-11.7 6.6 0 11.2 5.2 11.2 11.7zm-310.8-11.7c-7.1 0-11.2 5.2-11.2 11.7 0 6.5 4.1 11.7 11.2 11.7 6.5 0 10.9-4.9 10.9-11.7-.1-6.5-4.4-11.7-10.9-11.7zm117.5-.3c-5.4 0-8.7 3.5-9.5 8.7h19.1c-.9-5.7-4.4-8.7-9.6-8.7zm107.8.3c-6.8 0-10.9 5.2-10.9 11.7 0 6.5 4.1 11.7 10.9 11.7 6.8 0 11.2-4.9 11.2-11.7 0-6.5-4.4-11.7-11.2-11.7zm105.9 26.1c0 .3.3.5.3 1.1 0 .3-.3.5-.3 1.1-.3.3-.3.5-.5.8-.3.3-.5.5-1.1.5-.3.3-.5.3-1.1.3-.3 0-.5 0-1.1-.3-.3 0-.5-.3-.8-.5-.3-.3-.5-.5-.5-.8-.3-.5-.3-.8-.3-1.1 0-.5 0-.8.3-1.1 0-.5.3-.8.5-1.1.3-.3.5-.3.8-.5.5-.3.8-.3 1.1-.3.5 0 .8 0 1.1.3.5.3.8.3 1.1.5s.2.6.5 1.1zm-2.2 1.4c.5 0 .5-.3.8-.3.3-.3.3-.5.3-.8 0-.3 0-.5-.3-.8-.3 0-.5-.3-1.1-.3h-1.6v3.5h.8V426h.3l1.1 1.4h.8l-1.1-1.3zM576 81v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V81c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM64 220.6c0 76.5 62.1 138.5 138.5 138.5 27.2 0 53.9-8.2 76.5-23.1-72.9-59.3-72.4-171.2 0-230.5-22.6-15-49.3-23.1-76.5-23.1-76.4-.1-138.5 62-138.5 138.2zm224 108.8c70.5-55 70.2-162.2 0-217.5-70.2 55.3-70.5 162.6 0 217.5zm-142.3 76.3c0-8.7-5.7-14.4-14.7-14.7-4.6 0-9.5 1.4-12.8 6.5-2.4-4.1-6.5-6.5-12.2-6.5-3.8 0-7.6 1.4-10.6 5.4V392h-8.2v36.7h8.2c0-18.9-2.5-30.2 9-30.2 10.2 0 8.2 10.2 8.2 30.2h7.9c0-18.3-2.5-30.2 9-30.2 10.2 0 8.2 10 8.2 30.2h8.2v-23zm44.9-13.7h-7.9v4.4c-2.7-3.3-6.5-5.4-11.7-5.4-10.3 0-18.2 8.2-18.2 19.3 0 11.2 7.9 19.3 18.2 19.3 5.2 0 9-1.9 11.7-5.4v4.6h7.9V392zm40.5 25.6c0-15-22.9-8.2-22.9-15.2 0-5.7 11.9-4.8 18.5-1.1l3.3-6.5c-9.4-6.1-30.2-6-30.2 8.2 0 14.3 22.9 8.3 22.9 15 0 6.3-13.5 5.8-20.7.8l-3.5 6.3c11.2 7.6 32.6 6 32.6-7.5zm35.4 9.3l-2.2-6.8c-3.8 2.1-12.2 4.4-12.2-4.1v-16.6h13.1V392h-13.1v-11.2h-8.2V392h-7.6v7.3h7.6V416c0 17.6 17.3 14.4 22.6 10.9zm13.3-13.4h27.5c0-16.2-7.4-22.6-17.4-22.6-10.6 0-18.2 7.9-18.2 19.3 0 20.5 22.6 23.9 33.8 14.2l-3.8-6c-7.8 6.4-19.6 5.8-21.9-4.9zm59.1-21.5c-4.6-2-11.6-1.8-15.2 4.4V392h-8.2v36.7h8.2V408c0-11.6 9.5-10.1 12.8-8.4l2.4-7.6zm10.6 18.3c0-11.4 11.6-15.1 20.7-8.4l3.8-6.5c-11.6-9.1-32.7-4.1-32.7 15 0 19.8 22.4 23.8 32.7 15l-3.8-6.5c-9.2 6.5-20.7 2.6-20.7-8.6zm66.7-18.3H408v4.4c-8.3-11-29.9-4.8-29.9 13.9 0 19.2 22.4 24.7 29.9 13.9v4.6h8.2V392zm33.7 0c-2.4-1.2-11-2.9-15.2 4.4V392h-7.9v36.7h7.9V408c0-11 9-10.3 12.8-8.4l2.4-7.6zm40.3-14.9h-7.9v19.3c-8.2-10.9-29.9-5.1-29.9 13.9 0 19.4 22.5 24.6 29.9 13.9v4.6h7.9v-51.7zm7.6-75.1v4.6h.8V302h1.9v-.8h-4.6v.8h1.9zm6.6 123.8c0-.5 0-1.1-.3-1.6-.3-.3-.5-.8-.8-1.1-.3-.3-.8-.5-1.1-.8-.5 0-1.1-.3-1.6-.3-.3 0-.8.3-1.4.3-.5.3-.8.5-1.1.8-.5.3-.8.8-.8 1.1-.3.5-.3 1.1-.3 1.6 0 .3 0 .8.3 1.4 0 .3.3.8.8 1.1.3.3.5.5 1.1.8.5.3 1.1.3 1.4.3.5 0 1.1 0 1.6-.3.3-.3.8-.5 1.1-.8.3-.3.5-.8.8-1.1.3-.6.3-1.1.3-1.4zm3.2-124.7h-1.4l-1.6 3.5-1.6-3.5h-1.4v5.4h.8v-4.1l1.6 3.5h1.1l1.4-3.5v4.1h1.1v-5.4zm4.4-80.5c0-76.2-62.1-138.3-138.5-138.3-27.2 0-53.9 8.2-76.5 23.1 72.1 59.3 73.2 171.5 0 230.5 22.6 15 49.5 23.1 76.5 23.1 76.4.1 138.5-61.9 138.5-138.4z\"]\n};\nvar faItunesNote = {\n prefix: 'fab',\n iconName: 'itunes-note',\n icon: [384, 512, [], \"f3b5\", \"M381.9 388.2c-6.4 27.4-27.2 42.8-55.1 48-24.5 4.5-44.9 5.6-64.5-10.2-23.9-20.1-24.2-53.4-2.7-74.4 17-16.2 40.9-19.5 76.8-25.8 6-1.1 11.2-2.5 15.6-7.4 6.4-7.2 4.4-4.1 4.4-163.2 0-11.2-5.5-14.3-17-12.3-8.2 1.4-185.7 34.6-185.7 34.6-10.2 2.2-13.4 5.2-13.4 16.7 0 234.7 1.1 223.9-2.5 239.5-4.2 18.2-15.4 31.9-30.2 39.5-16.8 9.3-47.2 13.4-63.4 10.4-43.2-8.1-58.4-58-29.1-86.6 17-16.2 40.9-19.5 76.8-25.8 6-1.1 11.2-2.5 15.6-7.4 10.1-11.5 1.8-256.6 5.2-270.2.8-5.2 3-9.6 7.1-12.9 4.2-3.5 11.8-5.5 13.4-5.5 204-38.2 228.9-43.1 232.4-43.1 11.5-.8 18.1 6 18.1 17.6.2 344.5 1.1 326-1.8 338.5z\"]\n};\nvar faGolang = {\n prefix: 'fab',\n iconName: 'golang',\n icon: [640, 512, [], \"e40f\", \"M400.1 194.8C389.2 197.6 380.2 199.1 371 202.4C363.7 204.3 356.3 206.3 347.8 208.5L347.2 208.6C343 209.8 342.6 209.9 338.7 205.4C334 200.1 330.6 196.7 324.1 193.5C304.4 183.9 285.4 186.7 267.7 198.2C246.5 211.9 235.6 232.2 235.9 257.4C236.2 282.4 253.3 302.9 277.1 306.3C299.1 309.1 316.9 301.7 330.9 285.8C333 283.2 334.9 280.5 337 277.5V277.5L337 277.5C337.8 276.5 338.5 275.4 339.3 274.2H279.2C272.7 274.2 271.1 270.2 273.3 264.9C277.3 255.2 284.8 239 289.2 230.9C290.1 229.1 292.3 225.1 296.1 225.1H397.2C401.7 211.7 409 198.2 418.8 185.4C441.5 155.5 468.1 139.9 506 133.4C537.8 127.8 567.7 130.9 594.9 149.3C619.5 166.1 634.7 188.9 638.8 218.8C644.1 260.9 631.9 295.1 602.1 324.4C582.4 345.3 557.2 358.4 528.2 364.3C522.6 365.3 517.1 365.8 511.7 366.3C508.8 366.5 506 366.8 503.2 367.1C474.9 366.5 449 358.4 427.2 339.7C411.9 326.4 401.3 310.1 396.1 291.2C392.4 298.5 388.1 305.6 382.1 312.3C360.5 341.9 331.2 360.3 294.2 365.2C263.6 369.3 235.3 363.4 210.3 344.7C187.3 327.2 174.2 304.2 170.8 275.5C166.7 241.5 176.7 210.1 197.2 184.2C219.4 155.2 248.7 136.8 284.5 130.3C313.8 124.1 341.8 128.4 367.1 145.6C383.6 156.5 395.4 171.4 403.2 189.5C405.1 192.3 403.8 193.9 400.1 194.8zM48.3 200.4C47.05 200.4 46.74 199.8 47.36 198.8L53.91 190.4C54.53 189.5 56.09 188.9 57.34 188.9H168.6C169.8 188.9 170.1 189.8 169.5 190.7L164.2 198.8C163.6 199.8 162 200.7 161.1 200.7L48.3 200.4zM1.246 229.1C0 229.1-.3116 228.4 .3116 227.5L6.855 219.1C7.479 218.2 9.037 217.5 10.28 217.5H152.4C153.6 217.5 154.2 218.5 153.9 219.4L151.4 226.9C151.1 228.1 149.9 228.8 148.6 228.8L1.246 229.1zM75.72 255.9C75.1 256.8 75.41 257.7 76.65 257.7L144.6 258C145.5 258 146.8 257.1 146.8 255.9L147.4 248.4C147.4 247.1 146.8 246.2 145.5 246.2H83.2C81.95 246.2 80.71 247.1 80.08 248.1L75.72 255.9zM577.2 237.9C577 235.3 576.9 233.1 576.5 230.9C570.9 200.1 542.5 182.6 512.9 189.5C483.9 196 465.2 214.4 458.4 243.7C452.8 268 464.6 292.6 487 302.6C504.2 310.1 521.3 309.2 537.8 300.7C562.4 287.1 575.8 268 577.4 241.2C577.3 240 577.3 238.9 577.2 237.9z\"]\n};\nvar faKickstarter = {\n prefix: 'fab',\n iconName: 'kickstarter',\n icon: [448, 512, [], \"f3bb\", \"M400 480H48c-26.4 0-48-21.6-48-48V80c0-26.4 21.6-48 48-48h352c26.4 0 48 21.6 48 48v352c0 26.4-21.6 48-48 48zM199.6 178.5c0-30.7-17.6-45.1-39.7-45.1-25.8 0-40 19.8-40 44.5v154.8c0 25.8 13.7 45.6 40.5 45.6 21.5 0 39.2-14 39.2-45.6v-41.8l60.6 75.7c12.3 14.9 39 16.8 55.8 0 14.6-15.1 14.8-36.8 4-50.4l-49.1-62.8 40.5-58.7c9.4-13.5 9.5-34.5-5.6-49.1-16.4-15.9-44.6-17.3-61.4 7l-44.8 64.7v-38.8z\"]\n};\nvar faGrav = {\n prefix: 'fab',\n iconName: 'grav',\n icon: [512, 512, [], \"f2d6\", \"M301.1 212c4.4 4.4 4.4 11.9 0 16.3l-9.7 9.7c-4.4 4.7-11.9 4.7-16.6 0l-10.5-10.5c-4.4-4.7-4.4-11.9 0-16.6l9.7-9.7c4.4-4.4 11.9-4.4 16.6 0l10.5 10.8zm-30.2-19.7c3-3 3-7.8 0-10.5-2.8-3-7.5-3-10.5 0-2.8 2.8-2.8 7.5 0 10.5 3.1 2.8 7.8 2.8 10.5 0zm-26 5.3c-3 2.8-3 7.5 0 10.2 2.8 3 7.5 3 10.5 0 2.8-2.8 2.8-7.5 0-10.2-3-3-7.7-3-10.5 0zm72.5-13.3c-19.9-14.4-33.8-43.2-11.9-68.1 21.6-24.9 40.7-17.2 59.8.8 11.9 11.3 29.3 24.9 17.2 48.2-12.5 23.5-45.1 33.2-65.1 19.1zm47.7-44.5c-8.9-10-23.3 6.9-15.5 16.1 7.4 9 32.1 2.4 15.5-16.1zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-66.2 42.6c2.5-16.1-20.2-16.6-25.2-25.7-13.6-24.1-27.7-36.8-54.5-30.4 11.6-8 23.5-6.1 23.5-6.1.3-6.4 0-13-9.4-24.9 3.9-12.5.3-22.4.3-22.4 15.5-8.6 26.8-24.4 29.1-43.2 3.6-31-18.8-59.2-49.8-62.8-22.1-2.5-43.7 7.7-54.3 25.7-23.2 40.1 1.4 70.9 22.4 81.4-14.4-1.4-34.3-11.9-40.1-34.3-6.6-25.7 2.8-49.8 8.9-61.4 0 0-4.4-5.8-8-8.9 0 0-13.8 0-24.6 5.3 11.9-15.2 25.2-14.4 25.2-14.4 0-6.4-.6-14.9-3.6-21.6-5.4-11-23.8-12.9-31.7 2.8.1-.2.3-.4.4-.5-5 11.9-1.1 55.9 16.9 87.2-2.5 1.4-9.1 6.1-13 10-21.6 9.7-56.2 60.3-56.2 60.3-28.2 10.8-77.2 50.9-70.6 79.7.3 3 1.4 5.5 3 7.5-2.8 2.2-5.5 5-8.3 8.3-11.9 13.8-5.3 35.2 17.7 24.4 15.8-7.2 29.6-20.2 36.3-30.4 0 0-5.5-5-16.3-4.4 27.7-6.6 34.3-9.4 46.2-9.1 8 3.9 8-34.3 8-34.3 0-14.7-2.2-31-11.1-41.5 12.5 12.2 29.1 32.7 28 60.6-.8 18.3-15.2 23-15.2 23-9.1 16.6-43.2 65.9-30.4 106 0 0-9.7-14.9-10.2-22.1-17.4 19.4-46.5 52.3-24.6 64.5 26.6 14.7 108.8-88.6 126.2-142.3 34.6-20.8 55.4-47.3 63.9-65 22 43.5 95.3 94.5 101.1 59z\"]\n};\nvar faWeibo = {\n prefix: 'fab',\n iconName: 'weibo',\n icon: [512, 512, [], \"f18a\", \"M407 177.6c7.6-24-13.4-46.8-37.4-41.7-22 4.8-28.8-28.1-7.1-32.8 50.1-10.9 92.3 37.1 76.5 84.8-6.8 21.2-38.8 10.8-32-10.3zM214.8 446.7C108.5 446.7 0 395.3 0 310.4c0-44.3 28-95.4 76.3-143.7C176 67 279.5 65.8 249.9 161c-4 13.1 12.3 5.7 12.3 6 79.5-33.6 140.5-16.8 114 51.4-3.7 9.4 1.1 10.9 8.3 13.1 135.7 42.3 34.8 215.2-169.7 215.2zm143.7-146.3c-5.4-55.7-78.5-94-163.4-85.7-84.8 8.6-148.8 60.3-143.4 116s78.5 94 163.4 85.7c84.8-8.6 148.8-60.3 143.4-116zM347.9 35.1c-25.9 5.6-16.8 43.7 8.3 38.3 72.3-15.2 134.8 52.8 111.7 124-7.4 24.2 29.1 37 37.4 12 31.9-99.8-55.1-195.9-157.4-174.3zm-78.5 311c-17.1 38.8-66.8 60-109.1 46.3-40.8-13.1-58-53.4-40.3-89.7 17.7-35.4 63.1-55.4 103.4-45.1 42 10.8 63.1 50.2 46 88.5zm-86.3-30c-12.9-5.4-30 .3-38 12.9-8.3 12.9-4.3 28 8.6 34 13.1 6 30.8.3 39.1-12.9 8-13.1 3.7-28.3-9.7-34zm32.6-13.4c-5.1-1.7-11.4.6-14.3 5.4-2.9 5.1-1.4 10.6 3.7 12.9 5.1 2 11.7-.3 14.6-5.4 2.8-5.2 1.1-10.9-4-12.9z\"]\n};\nvar faUncharted = {\n prefix: 'fab',\n iconName: 'uncharted',\n icon: [448, 512, [], \"e084\", \"M171.73,232.813A5.381,5.381,0,0,0,176.7,229.5,48.081,48.081,0,0,1,191.6,204.244c1.243-.828,1.657-2.484,1.657-4.141a4.22,4.22,0,0,0-2.071-3.312L74.429,128.473,148.958,85a9.941,9.941,0,0,0,4.968-8.281,9.108,9.108,0,0,0-4.968-8.281L126.6,55.6a9.748,9.748,0,0,0-9.523,0l-100.2,57.966a9.943,9.943,0,0,0-4.969,8.281V236.954a9.109,9.109,0,0,0,4.969,8.281L39.235,258.07a8.829,8.829,0,0,0,4.968,1.242,9.4,9.4,0,0,0,6.625-2.484,10.8,10.8,0,0,0,2.9-7.039V164.5L169.66,232.4A4.5,4.5,0,0,0,171.73,232.813ZM323.272,377.73a12.478,12.478,0,0,0-4.969,1.242l-74.528,43.062V287.882c0-2.9-2.9-5.8-6.211-4.555a53.036,53.036,0,0,1-28.984.414,4.86,4.86,0,0,0-6.21,4.555V421.619l-74.529-43.061a8.83,8.83,0,0,0-4.969-1.242,9.631,9.631,0,0,0-9.523,9.523v26.085a9.107,9.107,0,0,0,4.969,8.281l100.2,57.553A8.829,8.829,0,0,0,223.486,480a11.027,11.027,0,0,0,4.969-1.242l100.2-57.553a9.941,9.941,0,0,0,4.968-8.281V386.839C332.8,382.285,328.24,377.73,323.272,377.73ZM286.007,78a23,23,0,1,0-23-23A23,23,0,0,0,286.007,78Zm63.627-10.086a23,23,0,1,0,23,23A23,23,0,0,0,349.634,67.914ZM412.816,151.6a23,23,0,1,0-23-23A23,23,0,0,0,412.816,151.6Zm-63.182-9.2a23,23,0,1,0,23,23A23,23,0,0,0,349.634,142.4Zm-63.627,83.244a23,23,0,1,0-23-23A23,23,0,0,0,286.007,225.648Zm-62.074,36.358a23,23,0,1,0-23-23A23,23,0,0,0,223.933,262.006Zm188.883-82.358a23,23,0,1,0,23,23A23,23,0,0,0,412.816,179.648Zm0,72.272a23,23,0,1,0,23,23A23,23,0,0,0,412.816,251.92Z\"]\n};\nvar faFirstdraft = {\n prefix: 'fab',\n iconName: 'firstdraft',\n icon: [384, 512, [], \"f3a1\", \"M384 192h-64v128H192v128H0v-25.6h166.4v-128h128v-128H384V192zm-25.6 38.4v128h-128v128H64V512h192V384h128V230.4h-25.6zm25.6 192h-89.6V512H320v-64h64v-25.6zM0 0v384h128V256h128V128h128V0H0z\"]\n};\nvar faSquareYoutube = {\n prefix: 'fab',\n iconName: 'square-youtube',\n icon: [448, 512, [61798, \"youtube-square\"], \"f431\", \"M186.8 202.1l95.2 54.1-95.2 54.1V202.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-42 176.3s0-59.6-7.6-88.2c-4.2-15.8-16.5-28.2-32.2-32.4C337.9 128 224 128 224 128s-113.9 0-142.2 7.7c-15.7 4.2-28 16.6-32.2 32.4-7.6 28.5-7.6 88.2-7.6 88.2s0 59.6 7.6 88.2c4.2 15.8 16.5 27.7 32.2 31.9C110.1 384 224 384 224 384s113.9 0 142.2-7.7c15.7-4.2 28-16.1 32.2-31.9 7.6-28.5 7.6-88.1 7.6-88.1z\"]\n};\nvar faYoutubeSquare = faSquareYoutube;\nvar faWikipediaW = {\n prefix: 'fab',\n iconName: 'wikipedia-w',\n icon: [640, 512, [], \"f266\", \"M640 51.2l-.3 12.2c-28.1.8-45 15.8-55.8 40.3-25 57.8-103.3 240-155.3 358.6H415l-81.9-193.1c-32.5 63.6-68.3 130-99.2 193.1-.3.3-15 0-15-.3C172 352.3 122.8 243.4 75.8 133.4 64.4 106.7 26.4 63.4.2 63.7c0-3.1-.3-10-.3-14.2h161.9v13.9c-19.2 1.1-52.8 13.3-43.3 34.2 21.9 49.7 103.6 240.3 125.6 288.6 15-29.7 57.8-109.2 75.3-142.8-13.9-28.3-58.6-133.9-72.8-160-9.7-17.8-36.1-19.4-55.8-19.7V49.8l142.5.3v13.1c-19.4.6-38.1 7.8-29.4 26.1 18.9 40 30.6 68.1 48.1 104.7 5.6-10.8 34.7-69.4 48.1-100.8 8.9-20.6-3.9-28.6-38.6-29.4.3-3.6 0-10.3.3-13.6 44.4-.3 111.1-.3 123.1-.6v13.6c-22.5.8-45.8 12.8-58.1 31.7l-59.2 122.8c6.4 16.1 63.3 142.8 69.2 156.7L559.2 91.8c-8.6-23.1-36.4-28.1-47.2-28.3V49.6l127.8 1.1.2.5z\"]\n};\nvar faWpressr = {\n prefix: 'fab',\n iconName: 'wpressr',\n icon: [496, 512, [\"rendact\"], \"f3e4\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm171.33 158.6c-15.18 34.51-30.37 69.02-45.63 103.5-2.44 5.51-6.89 8.24-12.97 8.24-23.02-.01-46.03.06-69.05-.05-5.12-.03-8.25 1.89-10.34 6.72-10.19 23.56-20.63 47-30.95 70.5-1.54 3.51-4.06 5.29-7.92 5.29-45.94-.01-91.87-.02-137.81 0-3.13 0-5.63-1.15-7.72-3.45-11.21-12.33-22.46-24.63-33.68-36.94-2.69-2.95-2.79-6.18-1.21-9.73 8.66-19.54 17.27-39.1 25.89-58.66 12.93-29.35 25.89-58.69 38.75-88.08 1.7-3.88 4.28-5.68 8.54-5.65 14.24.1 28.48.02 42.72.05 6.24.01 9.2 4.84 6.66 10.59-13.6 30.77-27.17 61.55-40.74 92.33-5.72 12.99-11.42 25.99-17.09 39-3.91 8.95 7.08 11.97 10.95 5.6.23-.37-1.42 4.18 30.01-67.69 1.36-3.1 3.41-4.4 6.77-4.39 15.21.08 30.43.02 45.64.04 5.56.01 7.91 3.64 5.66 8.75-8.33 18.96-16.71 37.9-24.98 56.89-4.98 11.43 8.08 12.49 11.28 5.33.04-.08 27.89-63.33 32.19-73.16 2.02-4.61 5.44-6.51 10.35-6.5 26.43.05 52.86 0 79.29.05 12.44.02 13.93-13.65 3.9-13.64-25.26.03-50.52.02-75.78.02-6.27 0-7.84-2.47-5.27-8.27 5.78-13.06 11.59-26.11 17.3-39.21 1.73-3.96 4.52-5.79 8.84-5.78 23.09.06 25.98.02 130.78.03 6.08-.01 8.03 2.79 5.62 8.27z\"]\n};\nvar faRendact = faWpressr;\nvar faAngellist = {\n prefix: 'fab',\n iconName: 'angellist',\n icon: [448, 512, [], \"f209\", \"M347.1 215.4c11.7-32.6 45.4-126.9 45.4-157.1 0-26.6-15.7-48.9-43.7-48.9-44.6 0-84.6 131.7-97.1 163.1C242 144 196.6 0 156.6 0c-31.1 0-45.7 22.9-45.7 51.7 0 35.3 34.2 126.8 46.6 162-6.3-2.3-13.1-4.3-20-4.3-23.4 0-48.3 29.1-48.3 52.6 0 8.9 4.9 21.4 8 29.7-36.9 10-51.1 34.6-51.1 71.7C46 435.6 114.4 512 210.6 512c118 0 191.4-88.6 191.4-202.9 0-43.1-6.9-82-54.9-93.7zM311.7 108c4-12.3 21.1-64.3 37.1-64.3 8.6 0 10.9 8.9 10.9 16 0 19.1-38.6 124.6-47.1 148l-34-6 33.1-93.7zM142.3 48.3c0-11.9 14.5-45.7 46.3 47.1l34.6 100.3c-15.6-1.3-27.7-3-35.4 1.4-10.9-28.8-45.5-119.7-45.5-148.8zM140 244c29.3 0 67.1 94.6 67.1 107.4 0 5.1-4.9 11.4-10.6 11.4-20.9 0-76.9-76.9-76.9-97.7.1-7.7 12.7-21.1 20.4-21.1zm184.3 186.3c-29.1 32-66.3 48.6-109.7 48.6-59.4 0-106.3-32.6-128.9-88.3-17.1-43.4 3.8-68.3 20.6-68.3 11.4 0 54.3 60.3 54.3 73.1 0 4.9-7.7 8.3-11.7 8.3-16.1 0-22.4-15.5-51.1-51.4-29.7 29.7 20.5 86.9 58.3 86.9 26.1 0 43.1-24.2 38-42 3.7 0 8.3.3 11.7-.6 1.1 27.1 9.1 59.4 41.7 61.7 0-.9 2-7.1 2-7.4 0-17.4-10.6-32.6-10.6-50.3 0-28.3 21.7-55.7 43.7-71.7 8-6 17.7-9.7 27.1-13.1 9.7-3.7 20-8 27.4-15.4-1.1-11.2-5.7-21.1-16.9-21.1-27.7 0-120.6 4-120.6-39.7 0-6.7.1-13.1 17.4-13.1 32.3 0 114.3 8 138.3 29.1 18.1 16.1 24.3 113.2-31 174.7zm-98.6-126c9.7 3.1 19.7 4 29.7 6-7.4 5.4-14 12-20.3 19.1-2.8-8.5-6.2-16.8-9.4-25.1z\"]\n};\nvar faGalacticRepublic = {\n prefix: 'fab',\n iconName: 'galactic-republic',\n icon: [496, 512, [], \"f50c\", \"M248 504C111.25 504 0 392.75 0 256S111.25 8 248 8s248 111.25 248 248-111.25 248-248 248zm0-479.47C120.37 24.53 16.53 128.37 16.53 256S120.37 487.47 248 487.47 479.47 383.63 479.47 256 375.63 24.53 248 24.53zm27.62 21.81v24.62a185.933 185.933 0 0 1 83.57 34.54l17.39-17.36c-28.75-22.06-63.3-36.89-100.96-41.8zm-55.37.07c-37.64 4.94-72.16 19.8-100.88 41.85l17.28 17.36h.08c24.07-17.84 52.55-30.06 83.52-34.67V46.41zm12.25 50.17v82.87c-10.04 2.03-19.42 5.94-27.67 11.42l-58.62-58.59-21.93 21.93 58.67 58.67c-5.47 8.23-9.45 17.59-11.47 27.62h-82.9v31h82.9c2.02 10.02 6.01 19.31 11.47 27.54l-58.67 58.69 21.93 21.93 58.62-58.62a77.873 77.873 0 0 0 27.67 11.47v82.9h31v-82.9c10.05-2.03 19.37-6.06 27.62-11.55l58.67 58.69 21.93-21.93-58.67-58.69c5.46-8.23 9.47-17.52 11.5-27.54h82.87v-31h-82.87c-2.02-10.02-6.03-19.38-11.5-27.62l58.67-58.67-21.93-21.93-58.67 58.67c-8.25-5.49-17.57-9.47-27.62-11.5V96.58h-31zm183.24 30.72l-17.36 17.36a186.337 186.337 0 0 1 34.67 83.67h24.62c-4.95-37.69-19.83-72.29-41.93-101.03zm-335.55.13c-22.06 28.72-36.91 63.26-41.85 100.91h24.65c4.6-30.96 16.76-59.45 34.59-83.52l-17.39-17.39zM38.34 283.67c4.92 37.64 19.75 72.18 41.8 100.9l17.36-17.39c-17.81-24.07-29.92-52.57-34.51-83.52H38.34zm394.7 0c-4.61 30.99-16.8 59.5-34.67 83.6l17.36 17.36c22.08-28.74 36.98-63.29 41.93-100.96h-24.62zM136.66 406.38l-17.36 17.36c28.73 22.09 63.3 36.98 100.96 41.93v-24.64c-30.99-4.63-59.53-16.79-83.6-34.65zm222.53.05c-24.09 17.84-52.58 30.08-83.57 34.67v24.57c37.67-4.92 72.21-19.79 100.96-41.85l-17.31-17.39h-.08z\"]\n};\nvar faNfcDirectional = {\n prefix: 'fab',\n iconName: 'nfc-directional',\n icon: [512, 512, [], \"e530\", \"M211.8 488.6C213.4 491.1 213.9 494.2 213.2 497.1C212.6 500 210.8 502.6 208.3 504.2C205.7 505.8 202.7 506.3 199.7 505.7C138.3 491.8 84.1 455.8 47.53 404.5C10.97 353.2-5.395 290.3 1.57 227.7C8.536 165 38.34 107.2 85.29 65.21C132.2 23.2 193-.0131 256 0C257.5 0 258.1 .2931 260.3 .8627C261.7 1.432 262.1 2.267 264 3.319C265.1 4.371 265.9 5.619 266.5 6.993C267 8.367 267.3 9.839 267.3 11.32V112.3L291.8 86.39C292.8 85.31 294 84.44 295.4 83.84C296.7 83.23 298.2 82.9 299.7 82.86C301.2 82.81 302.6 83.06 304 83.59C305.4 84.12 306.7 84.92 307.8 85.94C308.8 86.96 309.7 88.18 310.3 89.54C310.9 90.89 311.3 92.35 311.3 93.84C311.3 95.32 311.1 96.8 310.6 98.18C310 99.57 309.2 100.8 308.2 101.9L264.2 148.5C263.1 149.6 261.9 150.5 260.5 151.1C259 151.7 257.5 152 255.1 152C254.5 152 252.9 151.7 251.5 151.1C250.1 150.5 248.8 149.6 247.8 148.5L203.7 101.9C201.7 99.74 200.6 96.83 200.7 93.84C200.7 90.84 202 87.1 204.2 85.94C206.4 83.88 209.3 82.77 212.3 82.86C215.3 82.94 218.1 84.21 220.2 86.39L244.7 112.4V22.89C188.3 25.64 134.9 48.73 94.23 87.87C53.58 127 28.49 179.6 23.61 235.8C18.73 292 34.38 348.1 67.68 393.7C100.1 439.2 149.7 471.2 204.7 483.6C207.6 484.3 210.2 486.1 211.8 488.6L211.8 488.6zM171.4 126.1C170.6 127.4 169.5 128.5 168.3 129.3C147.8 143.2 131.1 161.9 119.5 183.8C107.9 205.7 101.8 230.1 101.8 254.9C101.8 279.7 107.9 304.1 119.5 325.1C131.1 347.9 147.8 366.6 168.3 380.5C170.8 382.2 172.5 384.8 173 387.8C173.6 390.7 172.1 393.8 171.3 396.2C169.6 398.7 166.1 400.4 164 400.1C161.1 401.5 158 400.9 155.6 399.2C132 383.2 112.8 361.7 99.46 336.5C86.15 311.4 79.19 283.4 79.19 254.9C79.19 226.5 86.15 198.4 99.46 173.3C112.8 148.1 132 126.6 155.6 110.6C156.8 109.8 158.2 109.2 159.6 108.8C161.1 108.5 162.6 108.5 164.1 108.8C165.5 109 166.9 109.6 168.2 110.4C169.5 111.2 170.5 112.3 171.4 113.5C172.2 114.7 172.8 116.1 173.1 117.6C173.4 119.1 173.4 120.6 173.1 122C172.8 123.5 172.3 124.9 171.4 126.1H171.4zM340.9 383.5C341.7 382.3 342.8 381.2 343.1 380.4V380.3C364.4 366.3 381.1 347.6 392.7 325.7C404.2 303.9 410.2 279.5 410.2 254.8C410.2 230.1 404.2 205.7 392.7 183.8C381.1 161.1 364.4 143.3 343.1 129.3C342.8 128.5 341.7 127.4 340.9 126.2C340.1 124.9 339.5 123.5 339.3 122.1C338.1 120.6 339 119.1 339.3 117.7C339.6 116.2 340.2 114.8 341 113.6C341.9 112.4 342.1 111.3 344.2 110.5C345.4 109.7 346.8 109.2 348.3 108.9C349.8 108.6 351.2 108.6 352.7 108.9C354.2 109.2 355.5 109.8 356.8 110.7C380.2 126.7 399.5 148.2 412.7 173.3C426 198.4 432.1 226.4 432.1 254.8C432.1 283.3 426 311.3 412.7 336.4C399.5 361.5 380.2 383 356.8 399C355.5 399.9 354.2 400.5 352.7 400.8C351.2 401.1 349.8 401.1 348.3 400.8C346.8 400.5 345.4 399.1 344.2 399.2C342.1 398.4 341.9 397.3 341 396.1C340.2 394.9 339.6 393.5 339.3 392C339 390.6 338.1 389.1 339.3 387.6C339.5 386.2 340.1 384.8 340.9 383.5V383.5zM312.3 6.307C368.5 19.04 418.7 50.28 455 95.01C485.4 132.6 504.6 178 510.3 226C515.9 274 507.9 322.7 487.1 366.3C466.2 409.9 433.5 446.8 392.6 472.6C351.7 498.3 304.4 512 256 512C254.5 512 253.1 511.7 251.7 511.1C250.3 510.6 249.1 509.7 248 508.7C246.1 507.6 246.1 506.4 245.6 505C245 503.6 244.7 502.2 244.7 500.7V401.5L220.2 427.5C218.1 429.7 215.3 430.1 212.3 431.1C209.3 431.2 206.4 430 204.2 427.1C202 425.9 200.7 423.1 200.7 420.1C200.6 417.1 201.7 414.2 203.7 412L247.8 365.4C249.1 363.2 252.9 362 255.1 362C259.1 362 262 363.2 264.2 365.4L308.2 412C310.3 414.2 311.4 417.1 311.3 420.1C311.2 423.1 309.9 425.9 307.8 427.1C305.6 430 302.7 431.2 299.7 431.1C296.7 430.1 293.8 429.7 291.8 427.5L267.3 401.6V489.1C323.7 486.3 377.1 463.3 417.8 424.1C458.5 384.1 483.6 332.4 488.5 276.2C493.3 219.1 477.7 163.9 444.4 118.3C411.1 72.75 362.4 40.79 307.4 28.36C305.9 28.03 304.6 27.42 303.3 26.57C302.1 25.71 301.1 24.63 300.3 23.37C299.5 22.12 298.1 20.72 298.7 19.26C298.5 17.8 298.5 16.3 298.8 14.85C299.2 13.41 299.8 12.04 300.6 10.82C301.5 9.61 302.6 8.577 303.8 7.784C305.1 6.99 306.5 6.451 307.9 6.198C309.4 5.945 310.9 5.982 312.3 6.307L312.3 6.307zM353.1 256.1C353.1 287.5 335.6 317.2 303.8 339.6C301.7 341.1 299 341.9 296.4 341.6C293.7 341.4 291.2 340.3 289.4 338.4L219.3 268.6C217.1 266.5 215.1 263.6 215.9 260.6C215.9 257.6 217.1 254.7 219.2 252.6C221.4 250.5 224.2 249.3 227.2 249.3C230.2 249.3 233.1 250.5 235.2 252.6L298.3 315.4C319.1 298.3 330.5 277.5 330.5 256.1C330.5 232.2 316.4 209.1 290.8 191C288.3 189.3 286.7 186.7 286.2 183.7C285.7 180.8 286.3 177.7 288.1 175.3C289.8 172.8 292.4 171.2 295.4 170.7C298.3 170.2 301.4 170.8 303.8 172.6C335.6 195 353.1 224.7 353.1 256.1V256.1zM216.7 341.5C213.7 342 210.7 341.3 208.2 339.6C176.5 317.2 158.1 287.5 158.1 256.1C158.1 224.7 176.5 195 208.2 172.6C210.4 171 213.1 170.3 215.7 170.5C218.4 170.8 220.8 171.9 222.7 173.8L292.8 243.6C294.9 245.7 296.1 248.6 296.1 251.6C296.1 254.6 294.1 257.4 292.8 259.6C290.7 261.7 287.8 262.9 284.9 262.9C281.9 262.9 278.1 261.7 276.9 259.6L213.8 196.7C192.9 214 181.6 234.7 181.6 256.1C181.6 279.1 195.7 303.1 221.3 321.1C223.7 322.9 225.4 325.5 225.9 328.5C226.4 331.4 225.7 334.4 224 336.9C222.3 339.3 219.6 341 216.7 341.5L216.7 341.5z\"]\n};\nvar faSkype = {\n prefix: 'fab',\n iconName: 'skype',\n icon: [448, 512, [], \"f17e\", \"M424.7 299.8c2.9-14 4.7-28.9 4.7-43.8 0-113.5-91.9-205.3-205.3-205.3-14.9 0-29.7 1.7-43.8 4.7C161.3 40.7 137.7 32 112 32 50.2 32 0 82.2 0 144c0 25.7 8.7 49.3 23.3 68.2-2.9 14-4.7 28.9-4.7 43.8 0 113.5 91.9 205.3 205.3 205.3 14.9 0 29.7-1.7 43.8-4.7 19 14.6 42.6 23.3 68.2 23.3 61.8 0 112-50.2 112-112 .1-25.6-8.6-49.2-23.2-68.1zm-194.6 91.5c-65.6 0-120.5-29.2-120.5-65 0-16 9-30.6 29.5-30.6 31.2 0 34.1 44.9 88.1 44.9 25.7 0 42.3-11.4 42.3-26.3 0-18.7-16-21.6-42-28-62.5-15.4-117.8-22-117.8-87.2 0-59.2 58.6-81.1 109.1-81.1 55.1 0 110.8 21.9 110.8 55.4 0 16.9-11.4 31.8-30.3 31.8-28.3 0-29.2-33.5-75-33.5-25.7 0-42 7-42 22.5 0 19.8 20.8 21.8 69.1 33 41.4 9.3 90.7 26.8 90.7 77.6 0 59.1-57.1 86.5-112 86.5z\"]\n};\nvar faJoget = {\n prefix: 'fab',\n iconName: 'joget',\n icon: [496, 512, [], \"f3b7\", \"M378.1 45C337.6 19.9 292.6 8 248.2 8 165 8 83.8 49.9 36.9 125.9c-71.9 116.6-35.6 269.3 81 341.2s269.3 35.6 341.2-80.9c71.9-116.6 35.6-269.4-81-341.2zm51.8 323.2c-40.4 65.5-110.4 101.5-182 101.5-6.8 0-13.6-.4-20.4-1-9-13.6-19.9-33.3-23.7-42.4-5.7-13.7-27.2-45.6 31.2-67.1 51.7-19.1 176.7-16.5 208.8-17.6-4 9-8.6 17.9-13.9 26.6zm-200.8-86.3c-55.5-1.4-81.7-20.8-58.5-48.2s51.1-40.7 68.9-51.2c17.9-10.5 27.3-33.7-23.6-29.7C87.3 161.5 48.6 252.1 37.6 293c-8.8-49.7-.1-102.7 28.5-149.1C128 43.4 259.6 12.2 360.1 74.1c74.8 46.1 111.2 130.9 99.3 212.7-24.9-.5-179.3-3.6-230.3-4.9zm183.8-54.8c-22.7-6-57 11.3-86.7 27.2-29.7 15.8-31.1 8.2-31.1 8.2s40.2-28.1 50.7-34.5 31.9-14 13.4-24.6c-3.2-1.8-6.7-2.7-10.4-2.7-17.8 0-41.5 18.7-67.5 35.6-31.5 20.5-65.3 31.3-65.3 31.3l169.5-1.6 46.5-23.4s3.6-9.5-19.1-15.5z\"]\n};\nvar faFedora = {\n prefix: 'fab',\n iconName: 'fedora',\n icon: [448, 512, [], \"f798\", \"M.0413 255.8C.1219 132.2 100.3 32 224 32C347.7 32 448 132.3 448 256C448 379.7 347.8 479.9 224.1 480H50.93C22.84 480 .0832 457.3 .0416 429.2H0V255.8H.0413zM342.6 192.7C342.6 153 307 124.2 269.4 124.2C234.5 124.2 203.6 150.5 199.3 184.1C199.1 187.9 198.9 189.1 198.9 192.6C198.8 213.7 198.9 235.4 198.1 257C199 283.1 199.1 309.1 198.1 333.6C198.1 360.7 178.7 379.1 153.4 379.1C128.1 379.1 107.6 358.9 107.6 333.6C108.1 305.9 130.2 288.3 156.1 287.5H156.3L182.6 287.3V250L156.3 250.2C109.2 249.8 71.72 286.7 70.36 333.6C70.36 379.2 107.9 416.5 153.4 416.5C196.4 416.5 232.1 382.9 236 340.9L236.2 287.4L268.8 287.1C294.1 287.3 293.8 249.3 268.6 249.8L236.2 250.1C236.2 243.7 236.3 237.3 236.3 230.9C236.4 218.2 236.4 205.5 236.2 192.7C236.3 176.2 252 161.5 269.4 161.5C286.9 161.5 305.3 170.2 305.3 192.7C305.3 195.9 305.2 197.8 305 199C303.1 209.5 310.2 219.4 320.7 220.9C331.3 222.4 340.9 214.8 341.9 204.3C342.5 200.1 342.6 196.4 342.6 192.7H342.6z\"]\n};\nvar faStripeS = {\n prefix: 'fab',\n iconName: 'stripe-s',\n icon: [384, 512, [], \"f42a\", \"M155.3 154.6c0-22.3 18.6-30.9 48.4-30.9 43.4 0 98.5 13.3 141.9 36.7V26.1C298.3 7.2 251.1 0 203.8 0 88.1 0 11 60.4 11 161.4c0 157.9 216.8 132.3 216.8 200.4 0 26.4-22.9 34.9-54.7 34.9-47.2 0-108.2-19.5-156.1-45.5v128.5a396.09 396.09 0 0 0 156 32.4c118.6 0 200.3-51 200.3-153.6 0-170.2-218-139.7-218-203.9z\"]\n};\nvar faMeta = {\n prefix: 'fab',\n iconName: 'meta',\n icon: [640, 512, [], \"e49b\", \"M640 317.9C640 409.2 600.6 466.4 529.7 466.4C467.1 466.4 433.9 431.8 372.8 329.8L341.4 277.2C333.1 264.7 326.9 253 320.2 242.2C300.1 276 273.1 325.2 273.1 325.2C206.1 441.8 168.5 466.4 116.2 466.4C43.42 466.4 0 409.1 0 320.5C0 177.5 79.78 42.4 183.9 42.4C234.1 42.4 277.7 67.08 328.7 131.9C365.8 81.8 406.8 42.4 459.3 42.4C558.4 42.4 640 168.1 640 317.9H640zM287.4 192.2C244.5 130.1 216.5 111.7 183 111.7C121.1 111.7 69.22 217.8 69.22 321.7C69.22 370.2 87.7 397.4 118.8 397.4C149 397.4 167.8 378.4 222 293.6C222 293.6 246.7 254.5 287.4 192.2V192.2zM531.2 397.4C563.4 397.4 578.1 369.9 578.1 322.5C578.1 198.3 523.8 97.08 454.9 97.08C421.7 97.08 393.8 123 360 175.1C369.4 188.9 379.1 204.1 389.3 220.5L426.8 282.9C485.5 377 500.3 397.4 531.2 397.4L531.2 397.4z\"]\n};\nvar faLaravel = {\n prefix: 'fab',\n iconName: 'laravel',\n icon: [512, 512, [], \"f3bd\", \"M504.4,115.83a5.72,5.72,0,0,0-.28-.68,8.52,8.52,0,0,0-.53-1.25,6,6,0,0,0-.54-.71,9.36,9.36,0,0,0-.72-.94c-.23-.22-.52-.4-.77-.6a8.84,8.84,0,0,0-.9-.68L404.4,55.55a8,8,0,0,0-8,0L300.12,111h0a8.07,8.07,0,0,0-.88.69,7.68,7.68,0,0,0-.78.6,8.23,8.23,0,0,0-.72.93c-.17.24-.39.45-.54.71a9.7,9.7,0,0,0-.52,1.25c-.08.23-.21.44-.28.68a8.08,8.08,0,0,0-.28,2.08V223.18l-80.22,46.19V63.44a7.8,7.8,0,0,0-.28-2.09c-.06-.24-.2-.45-.28-.68a8.35,8.35,0,0,0-.52-1.24c-.14-.26-.37-.47-.54-.72a9.36,9.36,0,0,0-.72-.94,9.46,9.46,0,0,0-.78-.6,9.8,9.8,0,0,0-.88-.68h0L115.61,1.07a8,8,0,0,0-8,0L11.34,56.49h0a6.52,6.52,0,0,0-.88.69,7.81,7.81,0,0,0-.79.6,8.15,8.15,0,0,0-.71.93c-.18.25-.4.46-.55.72a7.88,7.88,0,0,0-.51,1.24,6.46,6.46,0,0,0-.29.67,8.18,8.18,0,0,0-.28,2.1v329.7a8,8,0,0,0,4,6.95l192.5,110.84a8.83,8.83,0,0,0,1.33.54c.21.08.41.2.63.26a7.92,7.92,0,0,0,4.1,0c.2-.05.37-.16.55-.22a8.6,8.6,0,0,0,1.4-.58L404.4,400.09a8,8,0,0,0,4-6.95V287.88l92.24-53.11a8,8,0,0,0,4-7V117.92A8.63,8.63,0,0,0,504.4,115.83ZM111.6,17.28h0l80.19,46.15-80.2,46.18L31.41,63.44Zm88.25,60V278.6l-46.53,26.79-33.69,19.4V123.5l46.53-26.79Zm0,412.78L23.37,388.5V77.32L57.06,96.7l46.52,26.8V338.68a6.94,6.94,0,0,0,.12.9,8,8,0,0,0,.16,1.18h0a5.92,5.92,0,0,0,.38.9,6.38,6.38,0,0,0,.42,1v0a8.54,8.54,0,0,0,.6.78,7.62,7.62,0,0,0,.66.84l0,0c.23.22.52.38.77.58a8.93,8.93,0,0,0,.86.66l0,0,0,0,92.19,52.18Zm8-106.17-80.06-45.32,84.09-48.41,92.26-53.11,80.13,46.13-58.8,33.56Zm184.52,4.57L215.88,490.11V397.8L346.6,323.2l45.77-26.15Zm0-119.13L358.68,250l-46.53-26.79V131.79l33.69,19.4L392.37,178Zm8-105.28-80.2-46.17,80.2-46.16,80.18,46.15Zm8,105.28V178L455,151.19l33.68-19.4v91.39h0Z\"]\n};\nvar faHotjar = {\n prefix: 'fab',\n iconName: 'hotjar',\n icon: [448, 512, [], \"f3b1\", \"M414.9 161.5C340.2 29 121.1 0 121.1 0S222.2 110.4 93 197.7C11.3 252.8-21 324.4 14 402.6c26.8 59.9 83.5 84.3 144.6 93.4-29.2-55.1-6.6-122.4-4.1-129.6 57.1 86.4 165 0 110.8-93.9 71 15.4 81.6 138.6 27.1 215.5 80.5-25.3 134.1-88.9 148.8-145.6 15.5-59.3 3.7-127.9-26.3-180.9z\"]\n};\nvar faBluetoothB = {\n prefix: 'fab',\n iconName: 'bluetooth-b',\n icon: [320, 512, [], \"f294\", \"M196.48 260.023l92.626-103.333L143.125 0v206.33l-86.111-86.111-31.406 31.405 108.061 108.399L25.608 368.422l31.406 31.405 86.111-86.111L145.84 512l148.552-148.644-97.912-103.333zm40.86-102.996l-49.977 49.978-.338-100.295 50.315 50.317zM187.363 313.04l49.977 49.978-50.315 50.316.338-100.294z\"]\n};\nvar faStickerMule = {\n prefix: 'fab',\n iconName: 'sticker-mule',\n icon: [576, 512, [], \"f3f7\", \"M561.7 199.6c-1.3.3.3 0 0 0zm-6.2-77.4c-7.7-22.3-5.1-7.2-13.4-36.9-1.6-6.5-3.6-14.5-6.2-20-4.4-8.7-4.6-7.5-4.6-9.5 0-5.3 30.7-45.3 19-46.9-5.7-.6-12.2 11.6-20.6 17-8.6 4.2-8 5-10.3 5-2.6 0-5.7-3-6.2-5-2-5.7 1.9-25.9-3.6-25.9-3.6 0-12.3 24.8-17 25.8-5.2 1.3-27.9-11.4-75.1 18-25.3 13.2-86.9 65.2-87 65.3-6.7 4.7-20 4.7-35.5 16-44.4 30.1-109.6 9.4-110.7 9-110.6-26.8-128-15.2-159 11.5-20.8 17.9-23.7 36.5-24.2 38.9-4.2 20.4 5.2 48.3 6.7 64.3 1.8 19.3-2.7 17.7 7.7 98.3.5 1 4.1 0 5.1 1.5 0 8.4-3.8 12.1-4.1 13-1.5 4.5-1.5 10.5 0 16 2.3 8.2 8.2 37.2 8.2 46.9 0 41.8.4 44 2.6 49.4 3.9 10 12.5 9.1 17 12 3.1 3.5-.5 8.5 1 12.5.5 2 3.6 4 6.2 5 9.2 3.6 27 .3 29.9-2.5 1.6-1.5.5-4.5 3.1-5 5.1 0 10.8-.5 14.4-2.5 5.1-2.5 4.1-6 1.5-10.5-.4-.8-7-13.3-9.8-16-2.1-2-5.1-3-7.2-4.5-5.8-4.9-10.3-19.4-10.3-19.5-4.6-19.4-10.3-46.3-4.1-66.8 4.6-17.2 39.5-87.7 39.6-87.8 4.1-6.5 17-11.5 27.3-7 6 1.9 19.3 22 65.4 30.9 47.9 8.7 97.4-2 112.2-2 2.8 2-1.9 13-.5 38.9 0 26.4-.4 13.7-4.1 29.9-2.2 9.7 3.4 23.2-1.5 46.9-1.4 9.8-9.9 32.7-8.2 43.4.5 1 1 2 1.5 3.5.5 4.5 1.5 8.5 4.6 10 7.3 3.6 12-3.5 9.8 11.5-.7 3.1-2.6 12 1.5 15 4.4 3.7 30.6 3.4 36.5.5 2.6-1.5 1.6-4.5 6.4-7.4 1.9-.9 11.3-.4 11.3-6.5.3-1.8-9.2-19.9-9.3-20-2.6-3.5-9.2-4.5-11.3-8-6.9-10.1-1.7-52.6.5-59.4 3-11 5.6-22.4 8.7-32.4 11-42.5 10.3-50.6 16.5-68.3.8-1.8 6.4-23.1 10.3-29.9 9.3-17 21.7-32.4 33.5-47.4 18-22.9 34-46.9 52-69.8 6.1-7 8.2-13.7 18-8 10.8 5.7 21.6 7 31.9 17 14.6 12.8 10.2 18.2 11.8 22.9 1.5 5 7.7 10.5 14.9 9.5 10.4-2 13-2.5 13.4-2.5 2.6-.5 5.7-5 7.2-8 3.1-5.5 7.2-9 7.2-16.5 0-7.7-.4-2.8-20.6-52.9z\"]\n};\nvar faCreativeCommonsZero = {\n prefix: 'fab',\n iconName: 'creative-commons-zero',\n icon: [496, 512, [], \"f4f3\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm-.4 60.5c-81.9 0-102.5 77.3-102.5 142.8 0 65.5 20.6 142.8 102.5 142.8S350.5 321.5 350.5 256c0-65.5-20.6-142.8-102.5-142.8zm0 53.9c3.3 0 6.4.5 9.2 1.2 5.9 5.1 8.8 12.1 3.1 21.9l-54.5 100.2c-1.7-12.7-1.9-25.1-1.9-34.4 0-28.8 2-88.9 44.1-88.9zm40.8 46.2c2.9 15.4 3.3 31.4 3.3 42.7 0 28.9-2 88.9-44.1 88.9-13.5 0-32.6-7.7-20.1-26.4l60.9-105.2z\"]\n};\nvar faHips = {\n prefix: 'fab',\n iconName: 'hips',\n icon: [640, 512, [], \"f452\", \"M251.6 157.6c0-1.9-.9-2.8-2.8-2.8h-40.9c-1.6 0-2.7 1.4-2.7 2.8v201.8c0 1.4 1.1 2.8 2.7 2.8h40.9c1.9 0 2.8-.9 2.8-2.8zM156.5 168c-16.1-11.8-36.3-17.9-60.3-18-18.1-.1-34.6 3.7-49.8 11.4V80.2c0-1.8-.9-2.7-2.8-2.7H2.7c-1.8 0-2.7.9-2.7 2.7v279.2c0 1.9.9 2.8 2.7 2.8h41c1.9 0 2.8-.9 2.8-2.8V223.3c0-.8-2.8-27 45.8-27 48.5 0 45.8 26.1 45.8 27v122.6c0 9 7.3 16.3 16.4 16.3h27.3c1.8 0 2.7-.9 2.7-2.8V223.3c0-23.4-9.3-41.8-28-55.3zm478.4 110.1c-6.8-15.7-18.4-27-34.9-34.1l-57.6-25.3c-8.6-3.6-9.2-11.2-2.6-16.1 7.4-5.5 44.3-13.9 84 6.8 1.7 1 4-.3 4-2.4v-44.7c0-1.3-.6-2.1-1.9-2.6-17.7-6.6-36.1-9.9-55.1-9.9-26.5 0-45.3 5.8-58.5 15.4-.5.4-28.4 20-22.7 53.7 3.4 19.6 15.8 34.2 37.2 43.6l53.6 23.5c11.6 5.1 15.2 13.3 12.2 21.2-3.7 9.1-13.2 13.6-36.5 13.6-24.3 0-44.7-8.9-58.4-19.1-2.1-1.4-4.4.2-4.4 2.3v34.4c0 10.4 4.9 17.3 14.6 20.7 15.6 5.5 31.6 8.2 48.2 8.2 12.7 0 25.8-1.2 36.3-4.3.7-.3 36-8.9 45.6-45.8 3.5-13.5 2.4-26.5-3.1-39.1zM376.2 149.8c-31.7 0-104.2 20.1-104.2 103.5v183.5c0 .8.6 2.7 2.7 2.7h40.9c1.9 0 2.8-.9 2.8-2.7V348c16.5 12.7 35.8 19.1 57.7 19.1 60.5 0 108.7-48.5 108.7-108.7.1-60.3-48.2-108.6-108.6-108.6zm0 170.9c-17.2 0-31.9-6.1-44-18.2-12.2-12.2-18.2-26.8-18.2-44 0-34.5 27.6-62.2 62.2-62.2 34.5 0 62.2 27.6 62.2 62.2.1 34.3-27.3 62.2-62.2 62.2zM228.3 72.5c-15.9 0-28.8 12.9-28.9 28.9 0 15.6 12.7 28.9 28.9 28.9s28.9-13.1 28.9-28.9c0-16.2-13-28.9-28.9-28.9z\"]\n};\nvar faBehance = {\n prefix: 'fab',\n iconName: 'behance',\n icon: [576, 512, [], \"f1b4\", \"M232 237.2c31.8-15.2 48.4-38.2 48.4-74 0-70.6-52.6-87.8-113.3-87.8H0v354.4h171.8c64.4 0 124.9-30.9 124.9-102.9 0-44.5-21.1-77.4-64.7-89.7zM77.9 135.9H151c28.1 0 53.4 7.9 53.4 40.5 0 30.1-19.7 42.2-47.5 42.2h-79v-82.7zm83.3 233.7H77.9V272h84.9c34.3 0 56 14.3 56 50.6 0 35.8-25.9 47-57.6 47zm358.5-240.7H376V94h143.7v34.9zM576 305.2c0-75.9-44.4-139.2-124.9-139.2-78.2 0-131.3 58.8-131.3 135.8 0 79.9 50.3 134.7 131.3 134.7 61.3 0 101-27.6 120.1-86.3H509c-6.7 21.9-34.3 33.5-55.7 33.5-41.3 0-63-24.2-63-65.3h185.1c.3-4.2.6-8.7.6-13.2zM390.4 274c2.3-33.7 24.7-54.8 58.5-54.8 35.4 0 53.2 20.8 56.2 54.8H390.4z\"]\n};\nvar faReddit = {\n prefix: 'fab',\n iconName: 'reddit',\n icon: [512, 512, [], \"f1a1\", \"M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zM302.8 331c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z\"]\n};\nvar faDiscord = {\n prefix: 'fab',\n iconName: 'discord',\n icon: [640, 512, [], \"f392\", \"M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z\"]\n};\nvar faChrome = {\n prefix: 'fab',\n iconName: 'chrome',\n icon: [512, 512, [], \"f268\", \"M0 256C0 209.4 12.47 165.6 34.27 127.1L144.1 318.3C166 357.5 207.9 384 256 384C270.3 384 283.1 381.7 296.8 377.4L220.5 509.6C95.9 492.3 0 385.3 0 256zM365.1 321.6C377.4 302.4 384 279.1 384 256C384 217.8 367.2 183.5 340.7 160H493.4C505.4 189.6 512 222.1 512 256C512 397.4 397.4 511.1 256 512L365.1 321.6zM477.8 128H256C193.1 128 142.3 172.1 130.5 230.7L54.19 98.47C101 38.53 174 0 256 0C350.8 0 433.5 51.48 477.8 128V128zM168 256C168 207.4 207.4 168 256 168C304.6 168 344 207.4 344 256C344 304.6 304.6 344 256 344C207.4 344 168 304.6 168 256z\"]\n};\nvar faAppStoreIos = {\n prefix: 'fab',\n iconName: 'app-store-ios',\n icon: [448, 512, [], \"f370\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM127 384.5c-5.5 9.6-17.8 12.8-27.3 7.3-9.6-5.5-12.8-17.8-7.3-27.3l14.3-24.7c16.1-4.9 29.3-1.1 39.6 11.4L127 384.5zm138.9-53.9H84c-11 0-20-9-20-20s9-20 20-20h51l65.4-113.2-20.5-35.4c-5.5-9.6-2.2-21.8 7.3-27.3 9.6-5.5 21.8-2.2 27.3 7.3l8.9 15.4 8.9-15.4c5.5-9.6 17.8-12.8 27.3-7.3 9.6 5.5 12.8 17.8 7.3 27.3l-85.8 148.6h62.1c20.2 0 31.5 23.7 22.7 40zm98.1 0h-29l19.6 33.9c5.5 9.6 2.2 21.8-7.3 27.3-9.6 5.5-21.8 2.2-27.3-7.3-32.9-56.9-57.5-99.7-74-128.1-16.7-29-4.8-58 7.1-67.8 13.1 22.7 32.7 56.7 58.9 102h52c11 0 20 9 20 20 0 11.1-9 20-20 20z\"]\n};\nvar faCcDiscover = {\n prefix: 'fab',\n iconName: 'cc-discover',\n icon: [576, 512, [], \"f1f2\", \"M520.4 196.1c0-7.9-5.5-12.1-15.6-12.1h-4.9v24.9h4.7c10.3 0 15.8-4.4 15.8-12.8zM528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-44.1 138.9c22.6 0 52.9-4.1 52.9 24.4 0 12.6-6.6 20.7-18.7 23.2l25.8 34.4h-19.6l-22.2-32.8h-2.2v32.8h-16zm-55.9.1h45.3v14H444v18.2h28.3V217H444v22.2h29.3V253H428zm-68.7 0l21.9 55.2 22.2-55.2h17.5l-35.5 84.2h-8.6l-35-84.2zm-55.9-3c24.7 0 44.6 20 44.6 44.6 0 24.7-20 44.6-44.6 44.6-24.7 0-44.6-20-44.6-44.6 0-24.7 20-44.6 44.6-44.6zm-49.3 6.1v19c-20.1-20.1-46.8-4.7-46.8 19 0 25 27.5 38.5 46.8 19.2v19c-29.7 14.3-63.3-5.7-63.3-38.2 0-31.2 33.1-53 63.3-38zm-97.2 66.3c11.4 0 22.4-15.3-3.3-24.4-15-5.5-20.2-11.4-20.2-22.7 0-23.2 30.6-31.4 49.7-14.3l-8.4 10.8c-10.4-11.6-24.9-6.2-24.9 2.5 0 4.4 2.7 6.9 12.3 10.3 18.2 6.6 23.6 12.5 23.6 25.6 0 29.5-38.8 37.4-56.6 11.3l10.3-9.9c3.7 7.1 9.9 10.8 17.5 10.8zM55.4 253H32v-82h23.4c26.1 0 44.1 17 44.1 41.1 0 18.5-13.2 40.9-44.1 40.9zm67.5 0h-16v-82h16zM544 433c0 8.2-6.8 15-15 15H128c189.6-35.6 382.7-139.2 416-160zM74.1 191.6c-5.2-4.9-11.6-6.6-21.9-6.6H48v54.2h4.2c10.3 0 17-2 21.9-6.4 5.7-5.2 8.9-12.8 8.9-20.7s-3.2-15.5-8.9-20.5z\"]\n};\nvar faWpbeginner = {\n prefix: 'fab',\n iconName: 'wpbeginner',\n icon: [512, 512, [], \"f297\", \"M462.799 322.374C519.01 386.682 466.961 480 370.944 480c-39.602 0-78.824-17.687-100.142-50.04-6.887.356-22.702.356-29.59 0C219.848 462.381 180.588 480 141.069 480c-95.49 0-148.348-92.996-91.855-157.626C-29.925 190.523 80.479 32 256.006 32c175.632 0 285.87 158.626 206.793 290.374zm-339.647-82.972h41.529v-58.075h-41.529v58.075zm217.18 86.072v-23.839c-60.506 20.915-132.355 9.198-187.589-33.971l.246 24.897c51.101 46.367 131.746 57.875 187.343 32.913zm-150.753-86.072h166.058v-58.075H189.579v58.075z\"]\n};\nvar faConfluence = {\n prefix: 'fab',\n iconName: 'confluence',\n icon: [512, 512, [], \"f78d\", \"M2.3 412.2c-4.5 7.6-2.1 17.5 5.5 22.2l105.9 65.2c7.7 4.7 17.7 2.4 22.4-5.3 0-.1.1-.2.1-.2 67.1-112.2 80.5-95.9 280.9-.7 8.1 3.9 17.8.4 21.7-7.7.1-.1.1-.3.2-.4l50.4-114.1c3.6-8.1-.1-17.6-8.1-21.3-22.2-10.4-66.2-31.2-105.9-50.3C127.5 179 44.6 345.3 2.3 412.2zm507.4-312.1c4.5-7.6 2.1-17.5-5.5-22.2L398.4 12.8c-7.5-5-17.6-3.1-22.6 4.4-.2.3-.4.6-.6 1-67.3 112.6-81.1 95.6-280.6.9-8.1-3.9-17.8-.4-21.7 7.7-.1.1-.1.3-.2.4L22.2 141.3c-3.6 8.1.1 17.6 8.1 21.3 22.2 10.4 66.3 31.2 106 50.4 248 120 330.8-45.4 373.4-112.9z\"]\n};\nvar faMdb = {\n prefix: 'fab',\n iconName: 'mdb',\n icon: [576, 512, [], \"f8ca\", \"M17.37 160.41L7 352h43.91l5.59-79.83L84.43 352h44.71l25.54-77.43 4.79 77.43H205l-12.79-191.59H146.7L106 277.74 63.67 160.41zm281 0h-47.9V352h47.9s95 .8 94.2-95.79c-.78-94.21-94.18-95.78-94.18-95.78zm-1.2 146.46V204.78s46 4.27 46.8 50.57-46.78 51.54-46.78 51.54zm238.29-74.24a56.16 56.16 0 0 0 8-38.31c-5.34-35.76-55.08-34.32-55.08-34.32h-51.9v191.58H482s87 4.79 87-63.85c0-43.14-33.52-55.08-33.52-55.08zm-51.9-31.94s13.57-1.59 16 9.59c1.43 6.66-4 12-4 12h-12v-21.57zm-.1 109.46l.1-24.92V267h.08s41.58-4.73 41.19 22.43c-.33 25.65-41.35 20.74-41.35 20.74z\"]\n};\nvar faDochub = {\n prefix: 'fab',\n iconName: 'dochub',\n icon: [416, 512, [], \"f394\", \"M397.9 160H256V19.6L397.9 160zM304 192v130c0 66.8-36.5 100.1-113.3 100.1H96V84.8h94.7c12 0 23.1.8 33.1 2.5v-84C212.9 1.1 201.4 0 189.2 0H0v512h189.2C329.7 512 400 447.4 400 318.1V192h-96z\"]\n};\nvar faAccessibleIcon = {\n prefix: 'fab',\n iconName: 'accessible-icon',\n icon: [448, 512, [62107], \"f368\", \"M423.9 255.8L411 413.1c-3.3 40.7-63.9 35.1-60.6-4.9l10-122.5-41.1 2.3c10.1 20.7 15.8 43.9 15.8 68.5 0 41.2-16.1 78.7-42.3 106.5l-39.3-39.3c57.9-63.7 13.1-167.2-74-167.2-25.9 0-49.5 9.9-67.2 26L73 243.2c22-20.7 50.1-35.1 81.4-40.2l75.3-85.7-42.6-24.8-51.6 46c-30 26.8-70.6-18.5-40.5-45.4l68-60.7c9.8-8.8 24.1-10.2 35.5-3.6 0 0 139.3 80.9 139.5 81.1 16.2 10.1 20.7 36 6.1 52.6L285.7 229l106.1-5.9c18.5-1.1 33.6 14.4 32.1 32.7zm-64.9-154c28.1 0 50.9-22.8 50.9-50.9C409.9 22.8 387.1 0 359 0c-28.1 0-50.9 22.8-50.9 50.9 0 28.1 22.8 50.9 50.9 50.9zM179.6 456.5c-80.6 0-127.4-90.6-82.7-156.1l-39.7-39.7C36.4 287 24 320.3 24 356.4c0 130.7 150.7 201.4 251.4 122.5l-39.7-39.7c-16 10.9-35.3 17.3-56.1 17.3z\"]\n};\nvar faEbay = {\n prefix: 'fab',\n iconName: 'ebay',\n icon: [640, 512, [], \"f4f4\", \"M606 189.5l-54.8 109.9-54.9-109.9h-37.5l10.9 20.6c-11.5-19-35.9-26-63.3-26-31.8 0-67.9 8.7-71.5 43.1h33.7c1.4-13.8 15.7-21.8 35-21.8 26 0 41 9.6 41 33v3.4c-12.7 0-28 .1-41.7.4-42.4.9-69.6 10-76.7 34.4 1-5.2 1.5-10.6 1.5-16.2 0-52.1-39.7-76.2-75.4-76.2-21.3 0-43 5.5-58.7 24.2v-80.6h-32.1v169.5c0 10.3-.6 22.9-1.1 33.1h31.5c.7-6.3 1.1-12.9 1.1-19.5 13.6 16.6 35.4 24.9 58.7 24.9 36.9 0 64.9-21.9 73.3-54.2-.5 2.8-.7 5.8-.7 9 0 24.1 21.1 45 60.6 45 26.6 0 45.8-5.7 61.9-25.5 0 6.6.3 13.3 1.1 20.2h29.8c-.7-8.2-1-17.5-1-26.8v-65.6c0-9.3-1.7-17.2-4.8-23.8l61.5 116.1-28.5 54.1h35.9L640 189.5zM243.7 313.8c-29.6 0-50.2-21.5-50.2-53.8 0-32.4 20.6-53.8 50.2-53.8 29.8 0 50.2 21.4 50.2 53.8 0 32.3-20.4 53.8-50.2 53.8zm200.9-47.3c0 30-17.9 48.4-51.6 48.4-25.1 0-35-13.4-35-25.8 0-19.1 18.1-24.4 47.2-25.3 13.1-.5 27.6-.6 39.4-.6zm-411.9 1.6h128.8v-8.5c0-51.7-33.1-75.4-78.4-75.4-56.8 0-83 30.8-83 77.6 0 42.5 25.3 74 82.5 74 31.4 0 68-11.7 74.4-46.1h-33.1c-12 35.8-87.7 36.7-91.2-21.6zm95-21.4H33.3c6.9-56.6 92.1-54.7 94.4 0z\"]\n};\nvar faAmazon = {\n prefix: 'fab',\n iconName: 'amazon',\n icon: [448, 512, [], \"f270\", \"M257.2 162.7c-48.7 1.8-169.5 15.5-169.5 117.5 0 109.5 138.3 114 183.5 43.2 6.5 10.2 35.4 37.5 45.3 46.8l56.8-56S341 288.9 341 261.4V114.3C341 89 316.5 32 228.7 32 140.7 32 94 87 94 136.3l73.5 6.8c16.3-49.5 54.2-49.5 54.2-49.5 40.7-.1 35.5 29.8 35.5 69.1zm0 86.8c0 80-84.2 68-84.2 17.2 0-47.2 50.5-56.7 84.2-57.8v40.6zm136 163.5c-7.7 10-70 67-174.5 67S34.2 408.5 9.7 379c-6.8-7.7 1-11.3 5.5-8.3C88.5 415.2 203 488.5 387.7 401c7.5-3.7 13.3 2 5.5 12zm39.8 2.2c-6.5 15.8-16 26.8-21.2 31-5.5 4.5-9.5 2.7-6.5-3.8s19.3-46.5 12.7-55c-6.5-8.3-37-4.3-48-3.2-10.8 1-13 2-14-.3-2.3-5.7 21.7-15.5 37.5-17.5 15.7-1.8 41-.8 46 5.7 3.7 5.1 0 27.1-6.5 43.1z\"]\n};\nvar faUnsplash = {\n prefix: 'fab',\n iconName: 'unsplash',\n icon: [448, 512, [], \"e07c\", \"M448,230.17V480H0V230.17H141.13V355.09H306.87V230.17ZM306.87,32H141.13V156.91H306.87Z\"]\n};\nvar faYarn = {\n prefix: 'fab',\n iconName: 'yarn',\n icon: [496, 512, [], \"f7e3\", \"M393.9 345.2c-39 9.3-48.4 32.1-104 47.4 0 0-2.7 4-10.4 5.8-13.4 3.3-63.9 6-68.5 6.1-12.4.1-19.9-3.2-22-8.2-6.4-15.3 9.2-22 9.2-22-8.1-5-9-9.9-9.8-8.1-2.4 5.8-3.6 20.1-10.1 26.5-8.8 8.9-25.5 5.9-35.3.8-10.8-5.7.8-19.2.8-19.2s-5.8 3.4-10.5-3.6c-6-9.3-17.1-37.3 11.5-62-1.3-10.1-4.6-53.7 40.6-85.6 0 0-20.6-22.8-12.9-43.3 5-13.4 7-13.3 8.6-13.9 5.7-2.2 11.3-4.6 15.4-9.1 20.6-22.2 46.8-18 46.8-18s12.4-37.8 23.9-30.4c3.5 2.3 16.3 30.6 16.3 30.6s13.6-7.9 15.1-5c8.2 16 9.2 46.5 5.6 65.1-6.1 30.6-21.4 47.1-27.6 57.5-1.4 2.4 16.5 10 27.8 41.3 10.4 28.6 1.1 52.7 2.8 55.3.8 1.4 13.7.8 36.4-13.2 12.8-7.9 28.1-16.9 45.4-17 16.7-.5 17.6 19.2 4.9 22.2zM496 256c0 136.9-111.1 248-248 248S0 392.9 0 256 111.1 8 248 8s248 111.1 248 248zm-79.3 75.2c-1.7-13.6-13.2-23-28-22.8-22 .3-40.5 11.7-52.8 19.2-4.8 3-8.9 5.2-12.4 6.8 3.1-44.5-22.5-73.1-28.7-79.4 7.8-11.3 18.4-27.8 23.4-53.2 4.3-21.7 3-55.5-6.9-74.5-1.6-3.1-7.4-11.2-21-7.4-9.7-20-13-22.1-15.6-23.8-1.1-.7-23.6-16.4-41.4 28-12.2.9-31.3 5.3-47.5 22.8-2 2.2-5.9 3.8-10.1 5.4h.1c-8.4 3-12.3 9.9-16.9 22.3-6.5 17.4.2 34.6 6.8 45.7-17.8 15.9-37 39.8-35.7 82.5-34 36-11.8 73-5.6 79.6-1.6 11.1 3.7 19.4 12 23.8 12.6 6.7 30.3 9.6 43.9 2.8 4.9 5.2 13.8 10.1 30 10.1 6.8 0 58-2.9 72.6-6.5 6.8-1.6 11.5-4.5 14.6-7.1 9.8-3.1 36.8-12.3 62.2-28.7 18-11.7 24.2-14.2 37.6-17.4 12.9-3.2 21-15.1 19.4-28.2z\"]\n};\nvar faSquareSteam = {\n prefix: 'fab',\n iconName: 'square-steam',\n icon: [448, 512, [\"steam-square\"], \"f1b7\", \"M185.2 356.5c7.7-18.5-1-39.7-19.6-47.4l-29.5-12.2c11.4-4.3 24.3-4.5 36.4.5 12.2 5.1 21.6 14.6 26.7 26.7 5 12.2 5 25.6-.1 37.7-10.5 25.1-39.4 37-64.6 26.5-11.6-4.8-20.4-13.6-25.4-24.2l28.5 11.8c18.6 7.8 39.9-.9 47.6-19.4zM400 32H48C21.5 32 0 53.5 0 80v160.7l116.6 48.1c12-8.2 26.2-12.1 40.7-11.3l55.4-80.2v-1.1c0-48.2 39.3-87.5 87.6-87.5s87.6 39.3 87.6 87.5c0 49.2-40.9 88.7-89.6 87.5l-79 56.3c1.6 38.5-29.1 68.8-65.7 68.8-31.8 0-58.5-22.7-64.5-52.7L0 319.2V432c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-99.7 222.5c-32.2 0-58.4-26.1-58.4-58.3s26.2-58.3 58.4-58.3 58.4 26.2 58.4 58.3-26.2 58.3-58.4 58.3zm.1-14.6c24.2 0 43.9-19.6 43.9-43.8 0-24.2-19.6-43.8-43.9-43.8-24.2 0-43.9 19.6-43.9 43.8 0 24.2 19.7 43.8 43.9 43.8z\"]\n};\nvar faSteamSquare = faSquareSteam;\nvar fa500px = {\n prefix: 'fab',\n iconName: '500px',\n icon: [448, 512, [], \"f26e\", \"M103.3 344.3c-6.5-14.2-6.9-18.3 7.4-23.1 25.6-8 8 9.2 43.2 49.2h.3v-93.9c1.2-50.2 44-92.2 97.7-92.2 53.9 0 97.7 43.5 97.7 96.8 0 63.4-60.8 113.2-128.5 93.3-10.5-4.2-2.1-31.7 8.5-28.6 53 0 89.4-10.1 89.4-64.4 0-61-77.1-89.6-116.9-44.6-23.5 26.4-17.6 42.1-17.6 157.6 50.7 31 118.3 22 160.4-20.1 24.8-24.8 38.5-58 38.5-93 0-35.2-13.8-68.2-38.8-93.3-24.8-24.8-57.8-38.5-93.3-38.5s-68.8 13.8-93.5 38.5c-.3.3-16 16.5-21.2 23.9l-.5.6c-3.3 4.7-6.3 9.1-20.1 6.1-6.9-1.7-14.3-5.8-14.3-11.8V20c0-5 3.9-10.5 10.5-10.5h241.3c8.3 0 8.3 11.6 8.3 15.1 0 3.9 0 15.1-8.3 15.1H130.3v132.9h.3c104.2-109.8 282.8-36 282.8 108.9 0 178.1-244.8 220.3-310.1 62.8zm63.3-260.8c-.5 4.2 4.6 24.5 14.6 20.6C306 56.6 384 144.5 390.6 144.5c4.8 0 22.8-15.3 14.3-22.8-93.2-89-234.5-57-238.3-38.2zM393 414.7C283 524.6 94 475.5 61 310.5c0-12.2-30.4-7.4-28.9 3.3 24 173.4 246 256.9 381.6 121.3 6.9-7.8-12.6-28.4-20.7-20.4zM213.6 306.6c0 4 4.3 7.3 5.5 8.5 3 3 6.1 4.4 8.5 4.4 3.8 0 2.6.2 22.3-19.5 19.6 19.3 19.1 19.5 22.3 19.5 5.4 0 18.5-10.4 10.7-18.2L265.6 284l18.2-18.2c6.3-6.8-10.1-21.8-16.2-15.7L249.7 268c-18.6-18.8-18.4-19.5-21.5-19.5-5 0-18 11.7-12.4 17.3L234 284c-18.1 17.9-20.4 19.2-20.4 22.6z\"]\n};\nvar faSquareVimeo = {\n prefix: 'fab',\n iconName: 'square-vimeo',\n icon: [448, 512, [\"vimeo-square\"], \"f194\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-16.2 149.6c-1.4 31.1-23.2 73.8-65.3 127.9-43.5 56.5-80.3 84.8-110.4 84.8-18.7 0-34.4-17.2-47.3-51.6-25.2-92.3-35.9-146.4-56.7-146.4-2.4 0-10.8 5-25.1 15.1L64 192c36.9-32.4 72.1-68.4 94.1-70.4 24.9-2.4 40.2 14.6 46 51.1 20.5 129.6 29.6 149.2 66.8 90.5 13.4-21.2 20.6-37.2 21.5-48.3 3.4-32.8-25.6-30.6-45.2-22.2 15.7-51.5 45.8-76.5 90.1-75.1 32.9 1 48.4 22.4 46.5 64z\"]\n};\nvar faVimeoSquare = faSquareVimeo;\nvar faAsymmetrik = {\n prefix: 'fab',\n iconName: 'asymmetrik',\n icon: [576, 512, [], \"f372\", \"M517.5 309.2c38.8-40 58.1-80 58.5-116.1.8-65.5-59.4-118.2-169.4-135C277.9 38.4 118.1 73.6 0 140.5 52 114 110.6 92.3 170.7 82.3c74.5-20.5 153-25.4 221.3-14.8C544.5 91.3 588.8 195 490.8 299.2c-10.2 10.8-22 21.1-35 30.6L304.9 103.4 114.7 388.9c-65.6-29.4-76.5-90.2-19.1-151.2 20.8-22.2 48.3-41.9 79.5-58.1 20-12.2 39.7-22.6 62-30.7-65.1 20.3-122.7 52.9-161.6 92.9-27.7 28.6-41.4 57.1-41.7 82.9-.5 35.1 23.4 65.1 68.4 83l-34.5 51.7h101.6l22-34.4c22.2 1 45.3 0 68.6-2.7l-22.8 37.1h135.5L340 406.3c18.6-5.3 36.9-11.5 54.5-18.7l45.9 71.8H542L468.6 349c18.5-12.1 35-25.5 48.9-39.8zm-187.6 80.5l-25-40.6-32.7 53.3c-23.4 3.5-46.7 5.1-69.2 4.4l101.9-159.3 78.7 123c-17.2 7.4-35.3 13.9-53.7 19.2z\"]\n};\nvar faFontAwesome = {\n prefix: 'fab',\n iconName: 'font-awesome',\n icon: [448, 512, [62501, 62694, \"font-awesome-flag\", \"font-awesome-logo-full\"], \"f2b4\", \"M448 48V384C385 407 366 416 329 416C266 416 242 384 179 384C159 384 143 388 128 392V328C143 324 159 320 179 320C242 320 266 352 329 352C349 352 364 349 384 343V135C364 141 349 144 329 144C266 144 242 112 179 112C128 112 104 133 64 141V448C64 466 50 480 32 480S0 466 0 448V64C0 46 14 32 32 32S64 46 64 64V77C104 69 128 48 179 48C242 48 266 80 329 80C366 80 385 71 448 48Z\"]\n};\nvar faFontAwesomeFlag = faFontAwesome;\nvar faFontAwesomeLogoFull = faFontAwesome;\nvar faGratipay = {\n prefix: 'fab',\n iconName: 'gratipay',\n icon: [496, 512, [], \"f184\", \"M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm114.6 226.4l-113 152.7-112.7-152.7c-8.7-11.9-19.1-50.4 13.6-72 28.1-18.1 54.6-4.2 68.5 11.9 15.9 17.9 46.6 16.9 61.7 0 13.9-16.1 40.4-30 68.1-11.9 32.9 21.6 22.6 60 13.8 72z\"]\n};\nvar faApple = {\n prefix: 'fab',\n iconName: 'apple',\n icon: [384, 512, [], \"f179\", \"M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z\"]\n};\nvar faHive = {\n prefix: 'fab',\n iconName: 'hive',\n icon: [512, 512, [], \"e07f\", \"M260.353,254.878,131.538,33.1a2.208,2.208,0,0,0-3.829.009L.3,254.887A2.234,2.234,0,0,0,.3,257.122L129.116,478.9a2.208,2.208,0,0,0,3.83-.009L260.358,257.113A2.239,2.239,0,0,0,260.353,254.878Zm39.078-25.713a2.19,2.19,0,0,0,1.9,1.111h66.509a2.226,2.226,0,0,0,1.9-3.341L259.115,33.111a2.187,2.187,0,0,0-1.9-1.111H190.707a2.226,2.226,0,0,0-1.9,3.341ZM511.7,254.886,384.9,33.112A2.2,2.2,0,0,0,382.99,32h-66.6a2.226,2.226,0,0,0-1.906,3.34L440.652,256,314.481,476.66a2.226,2.226,0,0,0,1.906,3.34h66.6a2.2,2.2,0,0,0,1.906-1.112L511.7,257.114A2.243,2.243,0,0,0,511.7,254.886ZM366.016,284.917H299.508a2.187,2.187,0,0,0-1.9,1.111l-108.8,190.631a2.226,2.226,0,0,0,1.9,3.341h66.509a2.187,2.187,0,0,0,1.9-1.111l108.8-190.631A2.226,2.226,0,0,0,366.016,284.917Z\"]\n};\nvar faGitkraken = {\n prefix: 'fab',\n iconName: 'gitkraken',\n icon: [592, 512, [], \"f3a6\", \"M565.7 118.1c-2.3-6.1-9.3-9.2-15.3-6.6-5.7 2.4-8.5 8.9-6.3 14.6 10.9 29 16.9 60.5 16.9 93.3 0 134.6-100.3 245.7-230.2 262.7V358.4c7.9-1.5 15.5-3.6 23-6.2v104c106.7-25.9 185.9-122.1 185.9-236.8 0-91.8-50.8-171.8-125.8-213.3-5.7-3.2-13-.9-15.9 5-2.7 5.5-.6 12.2 4.7 15.1 67.9 37.6 113.9 110 113.9 193.2 0 93.3-57.9 173.1-139.8 205.4v-92.2c14.2-4.5 24.9-17.7 24.9-33.5 0-13.1-6.8-24.4-17.3-30.5 8.3-79.5 44.5-58.6 44.5-83.9V170c0-38-87.9-161.8-129-164.7-2.5-.2-5-.2-7.6 0C251.1 8.3 163.2 132 163.2 170v14.8c0 25.3 36.3 4.3 44.5 83.9-10.6 6.1-17.3 17.4-17.3 30.5 0 15.8 10.6 29 24.8 33.5v92.2c-81.9-32.2-139.8-112-139.8-205.4 0-83.1 46-155.5 113.9-193.2 5.4-3 7.4-9.6 4.7-15.1-2.9-5.9-10.1-8.2-15.9-5-75 41.5-125.8 121.5-125.8 213.3 0 114.7 79.2 210.8 185.9 236.8v-104c7.6 2.5 15.1 4.6 23 6.2v123.7C131.4 465.2 31 354.1 31 219.5c0-32.8 6-64.3 16.9-93.3 2.2-5.8-.6-12.2-6.3-14.6-6-2.6-13 .4-15.3 6.6C14.5 149.7 8 183.8 8 219.5c0 155.1 122.6 281.6 276.3 287.8V361.4c6.8.4 15 .5 23.4 0v145.8C461.4 501.1 584 374.6 584 219.5c0-35.7-6.5-69.8-18.3-101.4zM365.9 275.5c13 0 23.7 10.5 23.7 23.7 0 13.1-10.6 23.7-23.7 23.7-13 0-23.7-10.5-23.7-23.7 0-13.1 10.6-23.7 23.7-23.7zm-139.8 47.3c-13.2 0-23.7-10.7-23.7-23.7s10.5-23.7 23.7-23.7c13.1 0 23.7 10.6 23.7 23.7 0 13-10.5 23.7-23.7 23.7z\"]\n};\nvar faKeybase = {\n prefix: 'fab',\n iconName: 'keybase',\n icon: [448, 512, [], \"f4f5\", \"M286.17 419a18 18 0 1 0 18 18 18 18 0 0 0-18-18zm111.92-147.6c-9.5-14.62-39.37-52.45-87.26-73.71q-9.1-4.06-18.38-7.27a78.43 78.43 0 0 0-47.88-104.13c-12.41-4.1-23.33-6-32.41-5.77-.6-2-1.89-11 9.4-35L198.66 32l-5.48 7.56c-8.69 12.06-16.92 23.55-24.34 34.89a51 51 0 0 0-8.29-1.25c-41.53-2.45-39-2.33-41.06-2.33-50.61 0-50.75 52.12-50.75 45.88l-2.36 36.68c-1.61 27 19.75 50.21 47.63 51.85l8.93.54a214 214 0 0 0-46.29 35.54C14 304.66 14 374 14 429.77v33.64l23.32-29.8a148.6 148.6 0 0 0 14.56 37.56c5.78 10.13 14.87 9.45 19.64 7.33 4.21-1.87 10-6.92 3.75-20.11a178.29 178.29 0 0 1-15.76-53.13l46.82-59.83-24.66 74.11c58.23-42.4 157.38-61.76 236.25-38.59 34.2 10.05 67.45.69 84.74-23.84.72-1 1.2-2.16 1.85-3.22a156.09 156.09 0 0 1 2.8 28.43c0 23.3-3.69 52.93-14.88 81.64-2.52 6.46 1.76 14.5 8.6 15.74 7.42 1.57 15.33-3.1 18.37-11.15C429 443 434 414 434 382.32c0-38.58-13-77.46-35.91-110.92zM142.37 128.58l-15.7-.93-1.39 21.79 13.13.78a93 93 0 0 0 .32 19.57l-22.38-1.34a12.28 12.28 0 0 1-11.76-12.79L107 119c1-12.17 13.87-11.27 13.26-11.32l29.11 1.73a144.35 144.35 0 0 0-7 19.17zm148.42 172.18a10.51 10.51 0 0 1-14.35-1.39l-9.68-11.49-34.42 27a8.09 8.09 0 0 1-11.13-1.08l-15.78-18.64a7.38 7.38 0 0 1 1.34-10.34l34.57-27.18-14.14-16.74-17.09 13.45a7.75 7.75 0 0 1-10.59-1s-3.72-4.42-3.8-4.53a7.38 7.38 0 0 1 1.37-10.34L214 225.19s-18.51-22-18.6-22.14a9.56 9.56 0 0 1 1.74-13.42 10.38 10.38 0 0 1 14.3 1.37l81.09 96.32a9.58 9.58 0 0 1-1.74 13.44zM187.44 419a18 18 0 1 0 18 18 18 18 0 0 0-18-18z\"]\n};\nvar faApplePay = {\n prefix: 'fab',\n iconName: 'apple-pay',\n icon: [640, 512, [], \"f415\", \"M116.9 158.5c-7.5 8.9-19.5 15.9-31.5 14.9-1.5-12 4.4-24.8 11.3-32.6 7.5-9.1 20.6-15.6 31.3-16.1 1.2 12.4-3.7 24.7-11.1 33.8m10.9 17.2c-17.4-1-32.3 9.9-40.5 9.9-8.4 0-21-9.4-34.8-9.1-17.9.3-34.5 10.4-43.6 26.5-18.8 32.3-4.9 80 13.3 106.3 8.9 13 19.5 27.3 33.5 26.8 13.3-.5 18.5-8.6 34.5-8.6 16.1 0 20.8 8.6 34.8 8.4 14.5-.3 23.6-13 32.5-26 10.1-14.8 14.3-29.1 14.5-29.9-.3-.3-28-10.9-28.3-42.9-.3-26.8 21.9-39.5 22.9-40.3-12.5-18.6-32-20.6-38.8-21.1m100.4-36.2v194.9h30.3v-66.6h41.9c38.3 0 65.1-26.3 65.1-64.3s-26.4-64-64.1-64h-73.2zm30.3 25.5h34.9c26.3 0 41.3 14 41.3 38.6s-15 38.8-41.4 38.8h-34.8V165zm162.2 170.9c19 0 36.6-9.6 44.6-24.9h.6v23.4h28v-97c0-28.1-22.5-46.3-57.1-46.3-32.1 0-55.9 18.4-56.8 43.6h27.3c2.3-12 13.4-19.9 28.6-19.9 18.5 0 28.9 8.6 28.9 24.5v10.8l-37.8 2.3c-35.1 2.1-54.1 16.5-54.1 41.5.1 25.2 19.7 42 47.8 42zm8.2-23.1c-16.1 0-26.4-7.8-26.4-19.6 0-12.3 9.9-19.4 28.8-20.5l33.6-2.1v11c0 18.2-15.5 31.2-36 31.2zm102.5 74.6c29.5 0 43.4-11.3 55.5-45.4L640 193h-30.8l-35.6 115.1h-.6L537.4 193h-31.6L557 334.9l-2.8 8.6c-4.6 14.6-12.1 20.3-25.5 20.3-2.4 0-7-.3-8.9-.5v23.4c1.8.4 9.3.7 11.6.7z\"]\n};\nvar faPadlet = {\n prefix: 'fab',\n iconName: 'padlet',\n icon: [640, 512, [], \"e4a0\", \"M297.9 0L298 .001C305.6 .1078 312.4 4.72 315.5 11.78L447.5 320.3L447.8 320.2L448 320.6L445.2 330.6L402.3 488.6C398.6 504.8 382.6 514.9 366.5 511.2L298.1 495.6L229.6 511.2C213.5 514.9 197.5 504.8 193.8 488.6L150.9 330.6L148.2 320.6L148.3 320.2L280.4 11.78C283.4 4.797 290.3 .1837 297.9 .0006L297.9 0zM160.1 322.1L291.1 361.2L298 483.7L305.9 362.2L436.5 322.9L436.7 322.8L305.7 347.9L297.1 27.72L291.9 347.9L160.1 322.1zM426 222.6L520.4 181.6H594.2L437.2 429.2L468.8 320.2L426 222.6zM597.5 181.4L638.9 257.6C642.9 265.1 635 273.5 627.3 269.8L579.7 247.1L597.5 181.4zM127.3 318.5L158.7 430L1.61 154.5C-4.292 144.1 7.128 132.5 17.55 138.3L169.4 222.5L127.3 318.5z\"]\n};\nvar faAmazonPay = {\n prefix: 'fab',\n iconName: 'amazon-pay',\n icon: [640, 512, [], \"f42c\", \"M14 325.3c2.3-4.2 5.2-4.9 9.7-2.5 10.4 5.6 20.6 11.4 31.2 16.7a595.88 595.88 0 0 0 127.4 46.3 616.61 616.61 0 0 0 63.2 11.8 603.33 603.33 0 0 0 95 5.2c17.4-.4 34.8-1.8 52.1-3.8a603.66 603.66 0 0 0 163.3-42.8c2.9-1.2 5.9-2 9.1-1.2 6.7 1.8 9 9 4.1 13.9a70 70 0 0 1-9.6 7.4c-30.7 21.1-64.2 36.4-99.6 47.9a473.31 473.31 0 0 1-75.1 17.6 431 431 0 0 1-53.2 4.8 21.3 21.3 0 0 0-2.5.3H308a21.3 21.3 0 0 0-2.5-.3c-3.6-.2-7.2-.3-10.7-.4a426.3 426.3 0 0 1-50.4-5.3A448.4 448.4 0 0 1 164 420a443.33 443.33 0 0 1-145.6-87c-1.8-1.6-3-3.8-4.4-5.7zM172 65.1l-4.3.6a80.92 80.92 0 0 0-38 15.1c-2.4 1.7-4.6 3.5-7.1 5.4a4.29 4.29 0 0 1-.4-1.4c-.4-2.7-.8-5.5-1.3-8.2-.7-4.6-3-6.6-7.6-6.6h-11.5c-6.9 0-8.2 1.3-8.2 8.2v209.3c0 1 0 2 .1 3 .2 3 2 4.9 4.9 5 7 .1 14.1.1 21.1 0 2.9 0 4.7-2 5-5 .1-1 .1-2 .1-3v-72.4c1.1.9 1.7 1.4 2.2 1.9 17.9 14.9 38.5 19.8 61 15.4 20.4-4 34.6-16.5 43.8-34.9 7-13.9 9.9-28.7 10.3-44.1.5-17.1-1.2-33.9-8.1-49.8-8.5-19.6-22.6-32.5-43.9-36.9-3.2-.7-6.5-1-9.8-1.5-2.8-.1-5.5-.1-8.3-.1zM124.6 107a3.48 3.48 0 0 1 1.7-3.3c13.7-9.5 28.8-14.5 45.6-13.2 14.9 1.1 27.1 8.4 33.5 25.9 3.9 10.7 4.9 21.8 4.9 33 0 10.4-.8 20.6-4 30.6-6.8 21.3-22.4 29.4-42.6 28.5-14-.6-26.2-6-37.4-13.9a3.57 3.57 0 0 1-1.7-3.3c.1-14.1 0-28.1 0-42.2s.1-28 0-42.1zm205.7-41.9c-1 .1-2 .3-2.9.4a148 148 0 0 0-28.9 4.1c-6.1 1.6-12 3.8-17.9 5.8-3.6 1.2-5.4 3.8-5.3 7.7.1 3.3-.1 6.6 0 9.9.1 4.8 2.1 6.1 6.8 4.9 7.8-2 15.6-4.2 23.5-5.7 12.3-2.3 24.7-3.3 37.2-1.4 6.5 1 12.6 2.9 16.8 8.4 3.7 4.8 5.1 10.5 5.3 16.4.3 8.3.2 16.6.3 24.9a7.84 7.84 0 0 1-.2 1.4c-.5-.1-.9 0-1.3-.1a180.56 180.56 0 0 0-32-4.9c-11.3-.6-22.5.1-33.3 3.9-12.9 4.5-23.3 12.3-29.4 24.9-4.7 9.8-5.4 20.2-3.9 30.7 2 14 9 24.8 21.4 31.7 11.9 6.6 24.8 7.4 37.9 5.4 15.1-2.3 28.5-8.7 40.3-18.4a7.36 7.36 0 0 1 1.6-1.1c.6 3.8 1.1 7.4 1.8 11 .6 3.1 2.5 5.1 5.4 5.2 5.4.1 10.9.1 16.3 0a4.84 4.84 0 0 0 4.8-4.7 26.2 26.2 0 0 0 .1-2.8v-106a80 80 0 0 0-.9-12.9c-1.9-12.9-7.4-23.5-19-30.4-6.7-4-14.1-6-21.8-7.1-3.6-.5-7.2-.8-10.8-1.3-3.9.1-7.9.1-11.9.1zm35 127.7a3.33 3.33 0 0 1-1.5 3c-11.2 8.1-23.5 13.5-37.4 14.9-5.7.6-11.4.4-16.8-1.8a20.08 20.08 0 0 1-12.4-13.3 32.9 32.9 0 0 1-.1-19.4c2.5-8.3 8.4-13 16.4-15.6a61.33 61.33 0 0 1 24.8-2.2c8.4.7 16.6 2.3 25 3.4 1.6.2 2.1 1 2.1 2.6-.1 4.8 0 9.5 0 14.3s-.2 9.4-.1 14.1zm259.9 129.4c-1-5-4.8-6.9-9.1-8.3a88.42 88.42 0 0 0-21-3.9 147.32 147.32 0 0 0-39.2 1.9c-14.3 2.7-27.9 7.3-40 15.6a13.75 13.75 0 0 0-3.7 3.5 5.11 5.11 0 0 0-.5 4c.4 1.5 2.1 1.9 3.6 1.8a16.2 16.2 0 0 0 2.2-.1c7.8-.8 15.5-1.7 23.3-2.5 11.4-1.1 22.9-1.8 34.3-.9a71.64 71.64 0 0 1 14.4 2.7c5.1 1.4 7.4 5.2 7.6 10.4.4 8-1.4 15.7-3.5 23.3-4.1 15.4-10 30.3-15.8 45.1a17.6 17.6 0 0 0-1 3c-.5 2.9 1.2 4.8 4.1 4.1a10.56 10.56 0 0 0 4.8-2.5 145.91 145.91 0 0 0 12.7-13.4c12.8-16.4 20.3-35.3 24.7-55.6.8-3.6 1.4-7.3 2.1-10.9v-17.3zM493.1 199q-19.35-53.55-38.7-107.2c-2-5.7-4.2-11.3-6.3-16.9-1.1-2.9-3.2-4.8-6.4-4.8-7.6-.1-15.2-.2-22.9-.1-2.5 0-3.7 2-3.2 4.5a43.1 43.1 0 0 0 1.9 6.1q29.4 72.75 59.1 145.5c1.7 4.1 2.1 7.6.2 11.8-3.3 7.3-5.9 15-9.3 22.3-3 6.5-8 11.4-15.2 13.3a42.13 42.13 0 0 1-15.4 1.1c-2.5-.2-5-.8-7.5-1-3.4-.2-5.1 1.3-5.2 4.8q-.15 5 0 9.9c.1 5.5 2 8 7.4 8.9a108.18 108.18 0 0 0 16.9 2c17.1.4 30.7-6.5 39.5-21.4a131.63 131.63 0 0 0 9.2-18.4q35.55-89.7 70.6-179.6a26.62 26.62 0 0 0 1.6-5.5c.4-2.8-.9-4.4-3.7-4.4-6.6-.1-13.3 0-19.9 0a7.54 7.54 0 0 0-7.7 5.2c-.5 1.4-1.1 2.7-1.6 4.1l-34.8 100c-2.5 7.2-5.1 14.5-7.7 22.2-.4-1.1-.6-1.7-.9-2.4z\"]\n};\nvar faSquareGithub = {\n prefix: 'fab',\n iconName: 'square-github',\n icon: [448, 512, [\"github-square\"], \"f092\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM277.3 415.7c-8.4 1.5-11.5-3.7-11.5-8 0-5.4.2-33 .2-55.3 0-15.6-5.2-25.5-11.3-30.7 37-4.1 76-9.2 76-73.1 0-18.2-6.5-27.3-17.1-39 1.7-4.3 7.4-22-1.7-45-13.9-4.3-45.7 17.9-45.7 17.9-13.2-3.7-27.5-5.6-41.6-5.6-14.1 0-28.4 1.9-41.6 5.6 0 0-31.8-22.2-45.7-17.9-9.1 22.9-3.5 40.6-1.7 45-10.6 11.7-15.6 20.8-15.6 39 0 63.6 37.3 69 74.3 73.1-4.8 4.3-9.1 11.7-10.6 22.3-9.5 4.3-33.8 11.7-48.3-13.9-9.1-15.8-25.5-17.1-25.5-17.1-16.2-.2-1.1 10.2-1.1 10.2 10.8 5 18.4 24.2 18.4 24.2 9.7 29.7 56.1 19.7 56.1 19.7 0 13.9.2 36.5.2 40.6 0 4.3-3 9.5-11.5 8-66-22.1-112.2-84.9-112.2-158.3 0-91.8 70.2-161.5 162-161.5S388 165.6 388 257.4c.1 73.4-44.7 136.3-110.7 158.3zm-98.1-61.1c-1.9.4-3.7-.4-3.9-1.7-.2-1.5 1.1-2.8 3-3.2 1.9-.2 3.7.6 3.9 1.9.3 1.3-1 2.6-3 3zm-9.5-.9c0 1.3-1.5 2.4-3.5 2.4-2.2.2-3.7-.9-3.7-2.4 0-1.3 1.5-2.4 3.5-2.4 1.9-.2 3.7.9 3.7 2.4zm-13.7-1.1c-.4 1.3-2.4 1.9-4.1 1.3-1.9-.4-3.2-1.9-2.8-3.2.4-1.3 2.4-1.9 4.1-1.5 2 .6 3.3 2.1 2.8 3.4zm-12.3-5.4c-.9 1.1-2.8.9-4.3-.6-1.5-1.3-1.9-3.2-.9-4.1.9-1.1 2.8-.9 4.3.6 1.3 1.3 1.8 3.3.9 4.1zm-9.1-9.1c-.9.6-2.6 0-3.7-1.5s-1.1-3.2 0-3.9c1.1-.9 2.8-.2 3.7 1.3 1.1 1.5 1.1 3.3 0 4.1zm-6.5-9.7c-.9.9-2.4.4-3.5-.6-1.1-1.3-1.3-2.8-.4-3.5.9-.9 2.4-.4 3.5.6 1.1 1.3 1.3 2.8.4 3.5zm-6.7-7.4c-.4.9-1.7 1.1-2.8.4-1.3-.6-1.9-1.7-1.5-2.6.4-.6 1.5-.9 2.8-.4 1.3.7 1.9 1.8 1.5 2.6z\"]\n};\nvar faGithubSquare = faSquareGithub;\nvar faStumbleupon = {\n prefix: 'fab',\n iconName: 'stumbleupon',\n icon: [512, 512, [], \"f1a4\", \"M502.9 266v69.7c0 62.1-50.3 112.4-112.4 112.4-61.8 0-112.4-49.8-112.4-111.3v-70.2l34.3 16 51.1-15.2V338c0 14.7 12 26.5 26.7 26.5S417 352.7 417 338v-72h85.9zm-224.7-58.2l34.3 16 51.1-15.2V173c0-60.5-51.1-109-112.1-109-60.8 0-112.1 48.2-112.1 108.2v162.4c0 14.9-12 26.7-26.7 26.7S86 349.5 86 334.6V266H0v69.7C0 397.7 50.3 448 112.4 448c61.6 0 112.4-49.5 112.4-110.8V176.9c0-14.7 12-26.7 26.7-26.7s26.7 12 26.7 26.7v30.9z\"]\n};\nvar faFedex = {\n prefix: 'fab',\n iconName: 'fedex',\n icon: [640, 512, [], \"f797\", \"M586 284.5l53.3-59.9h-62.4l-21.7 24.8-22.5-24.8H414v-16h56.1v-48.1H318.9V236h-.5c-9.6-11-21.5-14.8-35.4-14.8-28.4 0-49.8 19.4-57.3 44.9-18-59.4-97.4-57.6-121.9-14v-24.2H49v-26.2h60v-41.1H0V345h49v-77.5h48.9c-1.5 5.7-2.3 11.8-2.3 18.2 0 73.1 102.6 91.4 130.2 23.7h-42c-14.7 20.9-45.8 8.9-45.8-14.6h85.5c3.7 30.5 27.4 56.9 60.1 56.9 14.1 0 27-6.9 34.9-18.6h.5V345h212.2l22.1-25 22.3 25H640l-54-60.5zm-446.7-16.6c6.1-26.3 41.7-25.6 46.5 0h-46.5zm153.4 48.9c-34.6 0-34-62.8 0-62.8 32.6 0 34.5 62.8 0 62.8zm167.8 19.1h-94.4V169.4h95v30.2H405v33.9h55.5v28.1h-56.1v44.7h56.1v29.6zm-45.9-39.8v-24.4h56.1v-44l50.7 57-50.7 57v-45.6h-56.1zm138.6 10.3l-26.1 29.5H489l45.6-51.2-45.6-51.2h39.7l26.6 29.3 25.6-29.3h38.5l-45.4 51 46 51.4h-40.5l-26.3-29.5z\"]\n};\nvar faPhoenixFramework = {\n prefix: 'fab',\n iconName: 'phoenix-framework',\n icon: [640, 512, [], \"f3dc\", \"M212.9 344.3c3.8-.1 22.8-1.4 25.6-2.2-2.4-2.6-43.6-1-68-49.6-4.3-8.6-7.5-17.6-6.4-27.6 2.9-25.5 32.9-30 52-18.5 36 21.6 63.3 91.3 113.7 97.5 37 4.5 84.6-17 108.2-45.4-.6-.1-.8-.2-1-.1-.4.1-.8.2-1.1.3-33.3 12.1-94.3 9.7-134.7-14.8-37.6-22.8-53.1-58.7-51.8-74.6 1.8-21.3 22.9-23.2 35.9-19.6 14.4 3.9 24.4 17.6 38.9 27.4 15.6 10.4 32.9 13.7 51.3 10.3 14.9-2.7 34.4-12.3 36.5-14.5-1.1-.1-1.8-.1-2.5-.2-6.2-.6-12.4-.8-18.5-1.7C279.8 194.5 262.1 47.4 138.5 37.9 94.2 34.5 39.1 46 2.2 72.9c-.8.6-1.5 1.2-2.2 1.8.1.2.1.3.2.5.8 0 1.6-.1 2.4-.2 6.3-1 12.5-.8 18.7.3 23.8 4.3 47.7 23.1 55.9 76.5 5.3 34.3-.7 50.8 8 86.1 19 77.1 91 107.6 127.7 106.4zM75.3 64.9c-.9-1-.9-1.2-1.3-2 12.1-2.6 24.2-4.1 36.6-4.8-1.1 14.7-22.2 21.3-35.3 6.8zm196.9 350.5c-42.8 1.2-92-26.7-123.5-61.4-4.6-5-16.8-20.2-18.6-23.4l.4-.4c6.6 4.1 25.7 18.6 54.8 27 24.2 7 48.1 6.3 71.6-3.3 22.7-9.3 41-.5 43.1 2.9-18.5 3.8-20.1 4.4-24 7.9-5.1 4.4-4.6 11.7 7 17.2 26.2 12.4 63-2.8 97.2 25.4 2.4 2 8.1 7.8 10.1 10.7-.1.2-.3.3-.4.5-4.8-1.5-16.4-7.5-40.2-9.3-24.7-2-46.3 5.3-77.5 6.2zm174.8-252c16.4-5.2 41.3-13.4 66.5-3.3 16.1 6.5 26.2 18.7 32.1 34.6 3.5 9.4 5.1 19.7 5.1 28.7-.2 0-.4 0-.6.1-.2-.4-.4-.9-.5-1.3-5-22-29.9-43.8-67.6-29.9-50.2 18.6-130.4 9.7-176.9-48-.7-.9-2.4-1.7-1.3-3.2.1-.2 2.1.6 3 1.3 18.1 13.4 38.3 21.9 60.3 26.2 30.5 6.1 54.6 2.9 79.9-5.2zm102.7 117.5c-32.4.2-33.8 50.1-103.6 64.4-18.2 3.7-38.7 4.6-44.9 4.2v-.4c2.8-1.5 14.7-2.6 29.7-16.6 7.9-7.3 15.3-15.1 22.8-22.9 19.5-20.2 41.4-42.2 81.9-39 23.1 1.8 29.3 8.2 36.1 12.7.3.2.4.5.7.9-.5 0-.7.1-.9 0-7-2.7-14.3-3.3-21.8-3.3zm-12.3-24.1c-.1.2-.1.4-.2.6-28.9-4.4-48-7.9-68.5 4-17 9.9-31.4 20.5-62 24.4-27.1 3.4-45.1 2.4-66.1-8-.3-.2-.6-.4-1-.6 0-.2.1-.3.1-.5 24.9 3.8 36.4 5.1 55.5-5.8 22.3-12.9 40.1-26.6 71.3-31 29.6-4.1 51.3 2.5 70.9 16.9zM268.6 97.3c-.6-.6-1.1-1.2-2.1-2.3 7.6 0 29.7-1.2 53.4 8.4 19.7 8 32.2 21 50.2 32.9 11.1 7.3 23.4 9.3 36.4 8.1 4.3-.4 8.5-1.2 12.8-1.7.4-.1.9 0 1.5.3-.6.4-1.2.9-1.8 1.2-8.1 4-16.7 6.3-25.6 7.1-26.1 2.6-50.3-3.7-73.4-15.4-19.3-9.9-36.4-22.9-51.4-38.6zM640 335.7c-3.5 3.1-22.7 11.6-42.7 5.3-12.3-3.9-19.5-14.9-31.6-24.1-10-7.6-20.9-7.9-28.1-8.4.6-.8.9-1.2 1.2-1.4 14.8-9.2 30.5-12.2 47.3-6.5 12.5 4.2 19.2 13.5 30.4 24.2 10.8 10.4 21 9.9 23.1 10.5.1-.1.2 0 .4.4zm-212.5 137c2.2 1.2 1.6 1.5 1.5 2-18.5-1.4-33.9-7.6-46.8-22.2-21.8-24.7-41.7-27.9-48.6-29.7.5-.2.8-.4 1.1-.4 13.1.1 26.1.7 38.9 3.9 25.3 6.4 35 25.4 41.6 35.3 3.2 4.8 7.3 8.3 12.3 11.1z\"]\n};\nvar faShopify = {\n prefix: 'fab',\n iconName: 'shopify',\n icon: [448, 512, [], \"e057\", \"M388.32,104.1a4.66,4.66,0,0,0-4.4-4c-2,0-37.23-.8-37.23-.8s-21.61-20.82-29.62-28.83V503.2L442.76,472S388.72,106.5,388.32,104.1ZM288.65,70.47a116.67,116.67,0,0,0-7.21-17.61C271,32.85,255.42,22,237,22a15,15,0,0,0-4,.4c-.4-.8-1.2-1.2-1.6-2C223.4,11.63,213,7.63,200.58,8c-24,.8-48,18-67.25,48.83-13.61,21.62-24,48.84-26.82,70.06-27.62,8.4-46.83,14.41-47.23,14.81-14,4.4-14.41,4.8-16,18-1.2,10-38,291.82-38,291.82L307.86,504V65.67a41.66,41.66,0,0,0-4.4.4S297.86,67.67,288.65,70.47ZM233.41,87.69c-16,4.8-33.63,10.4-50.84,15.61,4.8-18.82,14.41-37.63,25.62-50,4.4-4.4,10.41-9.61,17.21-12.81C232.21,54.86,233.81,74.48,233.41,87.69ZM200.58,24.44A27.49,27.49,0,0,1,215,28c-6.4,3.2-12.81,8.41-18.81,14.41-15.21,16.42-26.82,42-31.62,66.45-14.42,4.41-28.83,8.81-42,12.81C131.33,83.28,163.75,25.24,200.58,24.44ZM154.15,244.61c1.6,25.61,69.25,31.22,73.25,91.66,2.8,47.64-25.22,80.06-65.65,82.47-48.83,3.2-75.65-25.62-75.65-25.62l10.4-44s26.82,20.42,48.44,18.82c14-.8,19.22-12.41,18.81-20.42-2-33.62-57.24-31.62-60.84-86.86-3.2-46.44,27.22-93.27,94.47-97.68,26-1.6,39.23,4.81,39.23,4.81L221.4,225.39s-17.21-8-37.63-6.4C154.15,221,153.75,239.8,154.15,244.61ZM249.42,82.88c0-12-1.6-29.22-7.21-43.63,18.42,3.6,27.22,24,31.23,36.43Q262.63,78.68,249.42,82.88Z\"]\n};\nvar faNeos = {\n prefix: 'fab',\n iconName: 'neos',\n icon: [512, 512, [], \"f612\", \"M415.44 512h-95.11L212.12 357.46v91.1L125.69 512H28V29.82L68.47 0h108.05l123.74 176.13V63.45L386.69 0h97.69v461.5zM38.77 35.27V496l72-52.88V194l215.5 307.64h84.79l52.35-38.17h-78.27L69 13zm82.54 466.61l80-58.78v-101l-79.76-114.4v220.94L49 501.89h72.34zM80.63 10.77l310.6 442.57h82.37V10.77h-79.75v317.56L170.91 10.77zM311 191.65l72 102.81V15.93l-72 53v122.72z\"]\n};\nvar faHackerrank = {\n prefix: 'fab',\n iconName: 'hackerrank',\n icon: [512, 512, [], \"f5f7\", \"M477.5 128C463 103.05 285.13 0 256.16 0S49.25 102.79 34.84 128s-14.49 230.8 0 256 192.38 128 221.32 128S463 409.08 477.49 384s14.51-231 .01-256zM316.13 414.22c-4 0-40.91-35.77-38-38.69.87-.87 6.26-1.48 17.55-1.83 0-26.23.59-68.59.94-86.32 0-2-.44-3.43-.44-5.85h-79.93c0 7.1-.46 36.2 1.37 72.88.23 4.54-1.58 6-5.74 5.94-10.13 0-20.27-.11-30.41-.08-4.1 0-5.87-1.53-5.74-6.11.92-33.44 3-84-.15-212.67v-3.17c-9.67-.35-16.38-1-17.26-1.84-2.92-2.92 34.54-38.69 38.49-38.69s41.17 35.78 38.27 38.69c-.87.87-7.9 1.49-16.77 1.84v3.16c-2.42 25.75-2 79.59-2.63 105.39h80.26c0-4.55.39-34.74-1.2-83.64-.1-3.39.95-5.17 4.21-5.2 11.07-.08 22.15-.13 33.23-.06 3.46 0 4.57 1.72 4.5 5.38C333 354.64 336 341.29 336 373.69c8.87.35 16.82 1 17.69 1.84 2.88 2.91-33.62 38.69-37.58 38.69z\"]\n};\nvar faResearchgate = {\n prefix: 'fab',\n iconName: 'researchgate',\n icon: [448, 512, [], \"f4f8\", \"M0 32v448h448V32H0zm262.2 334.4c-6.6 3-33.2 6-50-14.2-9.2-10.6-25.3-33.3-42.2-63.6-8.9 0-14.7 0-21.4-.6v46.4c0 23.5 6 21.2 25.8 23.9v8.1c-6.9-.3-23.1-.8-35.6-.8-13.1 0-26.1.6-33.6.8v-8.1c15.5-2.9 22-1.3 22-23.9V225c0-22.6-6.4-21-22-23.9V193c25.8 1 53.1-.6 70.9-.6 31.7 0 55.9 14.4 55.9 45.6 0 21.1-16.7 42.2-39.2 47.5 13.6 24.2 30 45.6 42.2 58.9 7.2 7.8 17.2 14.7 27.2 14.7v7.3zm22.9-135c-23.3 0-32.2-15.7-32.2-32.2V167c0-12.2 8.8-30.4 34-30.4s30.4 17.9 30.4 17.9l-10.7 7.2s-5.5-12.5-19.7-12.5c-7.9 0-19.7 7.3-19.7 19.7v26.8c0 13.4 6.6 23.3 17.9 23.3 14.1 0 21.5-10.9 21.5-26.8h-17.9v-10.7h30.4c0 20.5 4.7 49.9-34 49.9zm-116.5 44.7c-9.4 0-13.6-.3-20-.8v-69.7c6.4-.6 15-.6 22.5-.6 23.3 0 37.2 12.2 37.2 34.5 0 21.9-15 36.6-39.7 36.6z\"]\n};\nvar faSwift = {\n prefix: 'fab',\n iconName: 'swift',\n icon: [448, 512, [], \"f8e1\", \"M448 156.09c0-4.51-.08-9-.2-13.52a196.31 196.31 0 0 0-2.58-29.42 99.62 99.62 0 0 0-9.22-28A94.08 94.08 0 0 0 394.84 44a99.17 99.17 0 0 0-28-9.22 195 195 0 0 0-29.43-2.59c-4.51-.12-9-.17-13.52-.2H124.14c-4.51 0-9 .08-13.52.2-2.45.07-4.91.15-7.37.27a171.68 171.68 0 0 0-22.06 2.32 103.06 103.06 0 0 0-21.21 6.1q-3.46 1.45-6.81 3.12a94.66 94.66 0 0 0-18.39 12.32c-1.88 1.61-3.69 3.28-5.43 5A93.86 93.86 0 0 0 12 85.17a99.45 99.45 0 0 0-9.22 28 196.31 196.31 0 0 0-2.54 29.4c-.13 4.51-.18 9-.21 13.52v199.83c0 4.51.08 9 .21 13.51a196.08 196.08 0 0 0 2.58 29.42 99.3 99.3 0 0 0 9.22 28A94.31 94.31 0 0 0 53.17 468a99.47 99.47 0 0 0 28 9.21 195 195 0 0 0 29.43 2.59c4.5.12 9 .17 13.52.2H323.91c4.51 0 9-.08 13.52-.2a196.59 196.59 0 0 0 29.44-2.59 99.57 99.57 0 0 0 28-9.21A94.22 94.22 0 0 0 436 426.84a99.3 99.3 0 0 0 9.22-28 194.79 194.79 0 0 0 2.59-29.42c.12-4.5.17-9 .2-13.51V172.14c-.01-5.35-.01-10.7-.01-16.05zm-69.88 241c-20-38.93-57.23-29.27-76.31-19.47-1.72 1-3.48 2-5.25 3l-.42.25c-39.5 21-92.53 22.54-145.85-.38A234.64 234.64 0 0 1 45 290.12a230.63 230.63 0 0 0 39.17 23.37c56.36 26.4 113 24.49 153 0-57-43.85-104.6-101-141.09-147.22a197.09 197.09 0 0 1-18.78-25.9c43.7 40 112.7 90.22 137.48 104.12-52.57-55.49-98.89-123.94-96.72-121.74 82.79 83.42 159.18 130.59 159.18 130.59 2.88 1.58 5 2.85 6.73 4a127.44 127.44 0 0 0 4.16-12.47c13.22-48.33-1.66-103.58-35.31-149.2C329.61 141.75 375 229.34 356.4 303.42c-.44 1.73-.95 3.4-1.44 5.09 38.52 47.4 28.04 98.17 23.13 88.59z\"]\n};\nvar faAngular = {\n prefix: 'fab',\n iconName: 'angular',\n icon: [448, 512, [], \"f420\", \"M185.7 268.1h76.2l-38.1-91.6-38.1 91.6zM223.8 32L16 106.4l31.8 275.7 176 97.9 176-97.9 31.8-275.7zM354 373.8h-48.6l-26.2-65.4H168.6l-26.2 65.4H93.7L223.8 81.5z\"]\n};\nvar faSpeakap = {\n prefix: 'fab',\n iconName: 'speakap',\n icon: [448, 512, [], \"f3f3\", \"M64 391.78C-15.41 303.59-8 167.42 80.64 87.64s224.8-73 304.21 15.24 72 224.36-16.64 304.14c-18.74 16.87 64 43.09 42 52.26-82.06 34.21-253.91 35-346.23-67.5zm213.31-211.6l38.5-40.86c-9.61-8.89-32-26.83-76.17-27.6-52.33-.91-95.86 28.3-96.77 80-.2 11.33.29 36.72 29.42 54.83 34.46 21.42 86.52 21.51 86 52.26-.37 21.28-26.42 25.81-38.59 25.6-3-.05-30.23-.46-47.61-24.62l-40 42.61c28.16 27 59 32.62 83.49 33.05 10.23.18 96.42.33 97.84-81 .28-15.81-2.07-39.72-28.86-56.59-34.36-21.64-85-19.45-84.43-49.75.41-23.25 31-25.37 37.53-25.26.43 0 26.62.26 39.62 17.37z\"]\n};\nvar faAngrycreative = {\n prefix: 'fab',\n iconName: 'angrycreative',\n icon: [640, 512, [], \"f36e\", \"M640 238.2l-3.2 28.2-34.5 2.3-2 18.1 34.5-2.3-3.2 28.2-34.4 2.2-2.3 20.1 34.4-2.2-3 26.1-64.7 4.1 12.7-113.2L527 365.2l-31.9 2-23.8-117.8 30.3-2 13.6 79.4 31.7-82.4 93.1-6.2zM426.8 371.5l28.3-1.8L468 249.6l-28.4 1.9-12.8 120zM162 388.1l-19.4-36-3.5 37.4-28.2 1.7 2.7-29.1c-11 18-32 34.3-56.9 35.8C23.9 399.9-3 377 .3 339.7c2.6-29.3 26.7-62.8 67.5-65.4 37.7-2.4 47.6 23.2 51.3 28.8l2.8-30.8 38.9-2.5c20.1-1.3 38.7 3.7 42.5 23.7l2.6-26.6 64.8-4.2-2.7 27.9-36.4 2.4-1.7 17.9 36.4-2.3-2.7 27.9-36.4 2.3-1.9 19.9 36.3-2.3-2.1 20.8 55-117.2 23.8-1.6L370.4 369l8.9-85.6-22.3 1.4 2.9-27.9 75-4.9-3 28-24.3 1.6-9.7 91.9-58 3.7-4.3-15.6-39.4 2.5-8 16.3-126.2 7.7zm-44.3-70.2l-26.4 1.7C84.6 307.2 76.9 303 65 303.8c-19 1.2-33.3 17.5-34.6 33.3-1.4 16 7.3 32.5 28.7 31.2 12.8-.8 21.3-8.6 28.9-18.9l27-1.7 2.7-29.8zm56.1-7.7c1.2-12.9-7.6-13.6-26.1-12.4l-2.7 28.5c14.2-.9 27.5-2.1 28.8-16.1zm21.1 70.8l5.8-60c-5 13.5-14.7 21.1-27.9 26.6l22.1 33.4zm135.4-45l-7.9-37.8-15.8 39.3 23.7-1.5zm-170.1-74.6l-4.3-17.5-39.6 2.6-8.1 18.2-31.9 2.1 57-121.9 23.9-1.6 30.7 102 9.9-104.7 27-1.8 37.8 63.6 6.5-66.6 28.5-1.9-4 41.2c7.4-13.5 22.9-44.7 63.6-47.5 40.5-2.8 52.4 29.3 53.4 30.3l3.3-32 39.3-2.7c12.7-.9 27.8.3 36.3 9.7l-4.4-11.9 32.2-2.2 12.9 43.2 23-45.7 31-2.2-43.6 78.4-4.8 44.3-28.4 1.9 4.8-44.3-15.8-43c1 22.3-9.2 40.1-32 49.6l25.2 38.8-36.4 2.4-19.2-36.8-4 38.3-28.4 1.9 3.3-31.5c-6.7 9.3-19.7 35.4-59.6 38-26.2 1.7-45.6-10.3-55.4-39.2l-4 40.3-25 1.6-37.6-63.3-6.3 66.2-56.8 3.7zm276.6-82.1c10.2-.7 17.5-2.1 21.6-4.3 4.5-2.4 7-6.4 7.6-12.1.6-5.3-.6-8.8-3.4-10.4-3.6-2.1-10.6-2.8-22.9-2l-2.9 28.8zM327.7 214c5.6 5.9 12.7 8.5 21.3 7.9 4.7-.3 9.1-1.8 13.3-4.1 5.5-3 10.6-8 15.1-14.3l-34.2 2.3 2.4-23.9 63.1-4.3 1.2-12-31.2 2.1c-4.1-3.7-7.8-6.6-11.1-8.1-4-1.7-8.1-2.8-12.2-2.5-8 .5-15.3 3.6-22 9.2-7.7 6.4-12 14.5-12.9 24.4-1.1 9.6 1.4 17.3 7.2 23.3zm-201.3 8.2l23.8-1.6-8.3-37.6-15.5 39.2z\"]\n};\nvar faYCombinator = {\n prefix: 'fab',\n iconName: 'y-combinator',\n icon: [448, 512, [], \"f23b\", \"M448 32v448H0V32h448zM236 287.5L313.5 142h-32.7L235 233c-4.7 9.3-9 18.3-12.8 26.8L210 233l-45.2-91h-35l76.7 143.8v94.5H236v-92.8z\"]\n};\nvar faEmpire = {\n prefix: 'fab',\n iconName: 'empire',\n icon: [496, 512, [], \"f1d1\", \"M287.6 54.2c-10.8-2.2-22.1-3.3-33.5-3.6V32.4c78.1 2.2 146.1 44 184.6 106.6l-15.8 9.1c-6.1-9.7-12.7-18.8-20.2-27.1l-18 15.5c-26-29.6-61.4-50.7-101.9-58.4l4.8-23.9zM53.4 322.4l23-7.7c-6.4-18.3-10-38.2-10-58.7s3.3-40.4 9.7-58.7l-22.7-7.7c3.6-10.8 8.3-21.3 13.6-31l-15.8-9.1C34 181 24.1 217.5 24.1 256s10 75 27.1 106.6l15.8-9.1c-5.3-10-9.7-20.3-13.6-31.1zM213.1 434c-40.4-8-75.8-29.1-101.9-58.7l-18 15.8c-7.5-8.6-14.4-17.7-20.2-27.4l-16 9.4c38.5 62.3 106.8 104.3 184.9 106.6v-18.3c-11.3-.3-22.7-1.7-33.5-3.6l4.7-23.8zM93.3 120.9l18 15.5c26-29.6 61.4-50.7 101.9-58.4l-4.7-23.8c10.8-2.2 22.1-3.3 33.5-3.6V32.4C163.9 34.6 95.9 76.4 57.4 139l15.8 9.1c6-9.7 12.6-18.9 20.1-27.2zm309.4 270.2l-18-15.8c-26 29.6-61.4 50.7-101.9 58.7l4.7 23.8c-10.8 1.9-22.1 3.3-33.5 3.6v18.3c78.1-2.2 146.4-44.3 184.9-106.6l-16.1-9.4c-5.7 9.7-12.6 18.8-20.1 27.4zM496 256c0 137-111 248-248 248S0 393 0 256 111 8 248 8s248 111 248 248zm-12.2 0c0-130.1-105.7-235.8-235.8-235.8S12.2 125.9 12.2 256 117.9 491.8 248 491.8 483.8 386.1 483.8 256zm-39-106.6l-15.8 9.1c5.3 9.7 10 20.2 13.6 31l-22.7 7.7c6.4 18.3 9.7 38.2 9.7 58.7s-3.6 40.4-10 58.7l23 7.7c-3.9 10.8-8.3 21-13.6 31l15.8 9.1C462 331 471.9 294.5 471.9 256s-9.9-75-27.1-106.6zm-183 177.7c16.3-3.3 30.4-11.6 40.7-23.5l51.2 44.8c11.9-13.6 21.3-29.3 27.1-46.8l-64.2-22.1c2.5-7.5 3.9-15.2 3.9-23.5s-1.4-16.1-3.9-23.5l64.5-22.1c-6.1-17.4-15.5-33.2-27.4-46.8l-51.2 44.8c-10.2-11.9-24.4-20.5-40.7-23.8l13.3-66.4c-8.6-1.9-17.7-2.8-27.1-2.8-9.4 0-18.5.8-27.1 2.8l13.3 66.4c-16.3 3.3-30.4 11.9-40.7 23.8l-51.2-44.8c-11.9 13.6-21.3 29.3-27.4 46.8l64.5 22.1c-2.5 7.5-3.9 15.2-3.9 23.5s1.4 16.1 3.9 23.5l-64.2 22.1c5.8 17.4 15.2 33.2 27.1 46.8l51.2-44.8c10.2 11.9 24.4 20.2 40.7 23.5l-13.3 66.7c8.6 1.7 17.7 2.8 27.1 2.8 9.4 0 18.5-1.1 27.1-2.8l-13.3-66.7z\"]\n};\nvar faEnvira = {\n prefix: 'fab',\n iconName: 'envira',\n icon: [448, 512, [], \"f299\", \"M0 32c477.6 0 366.6 317.3 367.1 366.3L448 480h-26l-70.4-71.2c-39 4.2-124.4 34.5-214.4-37C47 300.3 52 214.7 0 32zm79.7 46c-49.7-23.5-5.2 9.2-5.2 9.2 45.2 31.2 66 73.7 90.2 119.9 31.5 60.2 79 139.7 144.2 167.7 65 28 34.2 12.5 6-8.5-28.2-21.2-68.2-87-91-130.2-31.7-60-61-118.6-144.2-158.1z\"]\n};\nvar faSquareGitlab = {\n prefix: 'fab',\n iconName: 'square-gitlab',\n icon: [448, 512, [\"gitlab-square\"], \"e5ae\", \"M48 32H400C426.5 32 448 53.5 448 80V432C448 458.5 426.5 480 400 480H48C21.5 480 0 458.5 0 432V80C0 53.5 21.5 32 48 32zM382.1 224.9L337.5 108.5C336.6 106.2 334.9 104.2 332.9 102.9C331.3 101.9 329.5 101.3 327.7 101.1C325.9 100.9 324 101.2 322.3 101.8C320.6 102.5 319 103.5 317.8 104.9C316.6 106.3 315.7 107.9 315.2 109.7L285 201.9H162.1L132.9 109.7C132.4 107.9 131.4 106.3 130.2 104.9C128.1 103.6 127.4 102.5 125.7 101.9C123.1 101.2 122.1 100.1 120.3 101.1C118.5 101.3 116.7 101.9 115.1 102.9C113.1 104.2 111.5 106.2 110.6 108.5L65.94 224.9L65.47 226.1C59.05 242.9 58.26 261.3 63.22 278.6C68.18 295.9 78.62 311.1 92.97 321.9L93.14 322L93.52 322.3L161.4 373.2L215.6 414.1C217.1 415.1 220.9 416.9 223.9 416.9C226.9 416.9 229.9 415.1 232.3 414.1L286.4 373.2L354.8 322L355 321.9C369.4 311 379.8 295.8 384.8 278.6C389.7 261.3 388.1 242.9 382.5 226.1L382.1 224.9z\"]\n};\nvar faGitlabSquare = faSquareGitlab;\nvar faStudiovinari = {\n prefix: 'fab',\n iconName: 'studiovinari',\n icon: [512, 512, [], \"f3f8\", \"M480.3 187.7l4.2 28v28l-25.1 44.1-39.8 78.4-56.1 67.5-79.1 37.8-17.7 24.5-7.7 12-9.6 4s17.3-63.6 19.4-63.6c2.1 0 20.3.7 20.3.7l66.7-38.6-92.5 26.1-55.9 36.8-22.8 28-6.6 1.4 20.8-73.6 6.9-5.5 20.7 12.9 88.3-45.2 56.8-51.5 14.8-68.4-125.4 23.3 15.2-18.2-173.4-53.3 81.9-10.5-166-122.9L133.5 108 32.2 0l252.9 126.6-31.5-38L378 163 234.7 64l18.7 38.4-49.6-18.1L158.3 0l194.6 122L310 66.2l108 96.4 12-8.9-21-16.4 4.2-37.8L451 89.1l29.2 24.7 11.5 4.2-7 6.2 8.5 12-13.1 7.4-10.3 20.2 10.5 23.9z\"]\n};\nvar faPiedPiper = {\n prefix: 'fab',\n iconName: 'pied-piper',\n icon: [480, 512, [], \"f2ae\", \"M455.93,23.2C429.23,30,387.79,51.69,341.35,90.66A206,206,0,0,0,240,64C125.13,64,32,157.12,32,272s93.13,208,208,208,208-93.13,208-208a207.25,207.25,0,0,0-58.75-144.81,155.35,155.35,0,0,0-17,27.4A176.16,176.16,0,0,1,417.1,272c0,97.66-79.44,177.11-177.09,177.11a175.81,175.81,0,0,1-87.63-23.4c82.94-107.33,150.79-37.77,184.31-226.65,5.79-32.62,28-94.26,126.23-160.18C471,33.45,465.35,20.8,455.93,23.2ZM125,406.4A176.66,176.66,0,0,1,62.9,272C62.9,174.34,142.35,94.9,240,94.9a174,174,0,0,1,76.63,17.75C250.64,174.76,189.77,265.52,125,406.4Z\"]\n};\nvar faWordpress = {\n prefix: 'fab',\n iconName: 'wordpress',\n icon: [512, 512, [], \"f19a\", \"M61.7 169.4l101.5 278C92.2 413 43.3 340.2 43.3 256c0-30.9 6.6-60.1 18.4-86.6zm337.9 75.9c0-26.3-9.4-44.5-17.5-58.7-10.8-17.5-20.9-32.4-20.9-49.9 0-19.6 14.8-37.8 35.7-37.8.9 0 1.8.1 2.8.2-37.9-34.7-88.3-55.9-143.7-55.9-74.3 0-139.7 38.1-177.8 95.9 5 .2 9.7.3 13.7.3 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l77.5 230.4L249.8 247l-33.1-90.8c-11.5-.7-22.3-2-22.3-2-11.5-.7-10.1-18.2 1.3-17.5 0 0 35.1 2.7 56 2.7 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l76.9 228.7 21.2-70.9c9-29.4 16-50.5 16-68.7zm-139.9 29.3l-63.8 185.5c19.1 5.6 39.2 8.7 60.1 8.7 24.8 0 48.5-4.3 70.6-12.1-.6-.9-1.1-1.9-1.5-2.9l-65.4-179.2zm183-120.7c.9 6.8 1.4 14 1.4 21.9 0 21.6-4 45.8-16.2 76.2l-65 187.9C426.2 403 468.7 334.5 468.7 256c0-37-9.4-71.8-26-102.1zM504 256c0 136.8-111.3 248-248 248C119.2 504 8 392.7 8 256 8 119.2 119.2 8 256 8c136.7 0 248 111.2 248 248zm-11.4 0c0-130.5-106.2-236.6-236.6-236.6C125.5 19.4 19.4 125.5 19.4 256S125.6 492.6 256 492.6c130.5 0 236.6-106.1 236.6-236.6z\"]\n};\nvar faProductHunt = {\n prefix: 'fab',\n iconName: 'product-hunt',\n icon: [512, 512, [], \"f288\", \"M326.3 218.8c0 20.5-16.7 37.2-37.2 37.2h-70.3v-74.4h70.3c20.5 0 37.2 16.7 37.2 37.2zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-128.1-37.2c0-47.9-38.9-86.8-86.8-86.8H169.2v248h49.6v-74.4h70.3c47.9 0 86.8-38.9 86.8-86.8z\"]\n};\nvar faFirefox = {\n prefix: 'fab',\n iconName: 'firefox',\n icon: [512, 512, [], \"f269\", \"M503.52,241.48c-.12-1.56-.24-3.12-.24-4.68v-.12l-.36-4.68v-.12a245.86,245.86,0,0,0-7.32-41.15c0-.12,0-.12-.12-.24l-1.08-4c-.12-.24-.12-.48-.24-.6-.36-1.2-.72-2.52-1.08-3.72-.12-.24-.12-.6-.24-.84-.36-1.2-.72-2.4-1.08-3.48-.12-.36-.24-.6-.36-1-.36-1.2-.72-2.28-1.2-3.48l-.36-1.08c-.36-1.08-.84-2.28-1.2-3.36a8.27,8.27,0,0,0-.36-1c-.48-1.08-.84-2.28-1.32-3.36-.12-.24-.24-.6-.36-.84-.48-1.2-1-2.28-1.44-3.48,0-.12-.12-.24-.12-.36-1.56-3.84-3.24-7.68-5-11.4l-.36-.72c-.48-1-.84-1.8-1.32-2.64-.24-.48-.48-1.08-.72-1.56-.36-.84-.84-1.56-1.2-2.4-.36-.6-.6-1.2-1-1.8s-.84-1.44-1.2-2.28c-.36-.6-.72-1.32-1.08-1.92s-.84-1.44-1.2-2.16a18.07,18.07,0,0,0-1.2-2c-.36-.72-.84-1.32-1.2-2s-.84-1.32-1.2-2-.84-1.32-1.2-1.92-.84-1.44-1.32-2.16a15.63,15.63,0,0,0-1.2-1.8L463.2,119a15.63,15.63,0,0,0-1.2-1.8c-.48-.72-1.08-1.56-1.56-2.28-.36-.48-.72-1.08-1.08-1.56l-1.8-2.52c-.36-.48-.6-.84-1-1.32-1-1.32-1.8-2.52-2.76-3.72a248.76,248.76,0,0,0-23.51-26.64A186.82,186.82,0,0,0,412,62.46c-4-3.48-8.16-6.72-12.48-9.84a162.49,162.49,0,0,0-24.6-15.12c-2.4-1.32-4.8-2.52-7.2-3.72a254,254,0,0,0-55.43-19.56c-1.92-.36-3.84-.84-5.64-1.2h-.12c-1-.12-1.8-.36-2.76-.48a236.35,236.35,0,0,0-38-4H255.14a234.62,234.62,0,0,0-45.48,5c-33.59,7.08-63.23,21.24-82.91,39-1.08,1-1.92,1.68-2.4,2.16l-.48.48H124l-.12.12.12-.12a.12.12,0,0,0,.12-.12l-.12.12a.42.42,0,0,1,.24-.12c14.64-8.76,34.92-16,49.44-19.56l5.88-1.44c.36-.12.84-.12,1.2-.24,1.68-.36,3.36-.72,5.16-1.08.24,0,.6-.12.84-.12C250.94,20.94,319.34,40.14,367,85.61a171.49,171.49,0,0,1,26.88,32.76c30.36,49.2,27.48,111.11,3.84,147.59-34.44,53-111.35,71.27-159,24.84a84.19,84.19,0,0,1-25.56-59,74.05,74.05,0,0,1,6.24-31c1.68-3.84,13.08-25.67,18.24-24.59-13.08-2.76-37.55,2.64-54.71,28.19-15.36,22.92-14.52,58.2-5,83.28a132.85,132.85,0,0,1-12.12-39.24c-12.24-82.55,43.31-153,94.31-170.51-27.48-24-96.47-22.31-147.71,15.36-29.88,22-51.23,53.16-62.51,90.36,1.68-20.88,9.6-52.08,25.8-83.88-17.16,8.88-39,37-49.8,62.88-15.6,37.43-21,82.19-16.08,124.79.36,3.24.72,6.36,1.08,9.6,19.92,117.11,122,206.38,244.78,206.38C392.77,503.42,504,392.19,504,255,503.88,250.48,503.76,245.92,503.52,241.48Z\"]\n};\nvar faLinode = {\n prefix: 'fab',\n iconName: 'linode',\n icon: [448, 512, [], \"f2b8\", \"M366.036,186.867l-59.5,36.871-.838,36.871-29.329-19.273-39.384,24.3c2.238,55.211,2.483,59.271,2.51,59.5l-97.2,65.359L127.214,285.748l108.1-62.01L195.09,197.761l-75.417,38.547L98.723,93.015,227.771,43.574,136.432,0,10.737,39.385,38.39,174.3l41.9,32.681L48.445,222.062,69.394,323.457,98.723,351.11,77.774,363.679l16.76,78.769L160.733,512c-10.8-74.842-11.658-78.641-11.725-78.773l77.925-55.3c16.759-12.57,15.083-10.894,15.083-10.894l.838,24.3,33.519,28.491-.838-77.093,46.927-33.519,26.815-18.435-2.514,36.033,25.139,17.6,6.7-74.579,58.657-43.575Z\"]\n};\nvar faGoodreads = {\n prefix: 'fab',\n iconName: 'goodreads',\n icon: [448, 512, [], \"f3a8\", \"M299.9 191.2c5.1 37.3-4.7 79-35.9 100.7-22.3 15.5-52.8 14.1-70.8 5.7-37.1-17.3-49.5-58.6-46.8-97.2 4.3-60.9 40.9-87.9 75.3-87.5 46.9-.2 71.8 31.8 78.2 78.3zM448 88v336c0 30.9-25.1 56-56 56H56c-30.9 0-56-25.1-56-56V88c0-30.9 25.1-56 56-56h336c30.9 0 56 25.1 56 56zM330 313.2s-.1-34-.1-217.3h-29v40.3c-.8.3-1.2-.5-1.6-1.2-9.6-20.7-35.9-46.3-76-46-51.9.4-87.2 31.2-100.6 77.8-4.3 14.9-5.8 30.1-5.5 45.6 1.7 77.9 45.1 117.8 112.4 115.2 28.9-1.1 54.5-17 69-45.2.5-1 1.1-1.9 1.7-2.9.2.1.4.1.6.2.3 3.8.2 30.7.1 34.5-.2 14.8-2 29.5-7.2 43.5-7.8 21-22.3 34.7-44.5 39.5-17.8 3.9-35.6 3.8-53.2-1.2-21.5-6.1-36.5-19-41.1-41.8-.3-1.6-1.3-1.3-2.3-1.3h-26.8c.8 10.6 3.2 20.3 8.5 29.2 24.2 40.5 82.7 48.5 128.2 37.4 49.9-12.3 67.3-54.9 67.4-106.3z\"]\n};\nvar faSquareOdnoklassniki = {\n prefix: 'fab',\n iconName: 'square-odnoklassniki',\n icon: [448, 512, [\"odnoklassniki-square\"], \"f264\", \"M184.2 177.1c0-22.1 17.9-40 39.8-40s39.8 17.9 39.8 40c0 22-17.9 39.8-39.8 39.8s-39.8-17.9-39.8-39.8zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-305.1 97.1c0 44.6 36.4 80.9 81.1 80.9s81.1-36.2 81.1-80.9c0-44.8-36.4-81.1-81.1-81.1s-81.1 36.2-81.1 81.1zm174.5 90.7c-4.6-9.1-17.3-16.8-34.1-3.6 0 0-22.7 18-59.3 18s-59.3-18-59.3-18c-16.8-13.2-29.5-5.5-34.1 3.6-7.9 16.1 1.1 23.7 21.4 37 17.3 11.1 41.2 15.2 56.6 16.8l-12.9 12.9c-18.2 18-35.5 35.5-47.7 47.7-17.6 17.6 10.7 45.8 28.4 28.6l47.7-47.9c18.2 18.2 35.7 35.7 47.7 47.9 17.6 17.2 46-10.7 28.6-28.6l-47.7-47.7-13-12.9c15.5-1.6 39.1-5.9 56.2-16.8 20.4-13.3 29.3-21 21.5-37z\"]\n};\nvar faOdnoklassnikiSquare = faSquareOdnoklassniki;\nvar faJsfiddle = {\n prefix: 'fab',\n iconName: 'jsfiddle',\n icon: [576, 512, [], \"f1cc\", \"M510.634 237.462c-4.727-2.621-5.664-5.748-6.381-10.776-2.352-16.488-3.539-33.619-9.097-49.095-35.895-99.957-153.99-143.386-246.849-91.646-27.37 15.25-48.971 36.369-65.493 63.903-3.184-1.508-5.458-2.71-7.824-3.686-30.102-12.421-59.049-10.121-85.331 9.167-25.531 18.737-36.422 44.548-32.676 76.408.355 3.025-1.967 7.621-4.514 9.545-39.712 29.992-56.031 78.065-41.902 124.615 13.831 45.569 57.514 79.796 105.608 81.433 30.291 1.031 60.637.546 90.959.539 84.041-.021 168.09.531 252.12-.48 52.664-.634 96.108-36.873 108.212-87.293 11.54-48.074-11.144-97.3-56.832-122.634zm21.107 156.88c-18.23 22.432-42.343 35.253-71.28 35.65-56.874.781-113.767.23-170.652.23 0 .7-163.028.159-163.728.154-43.861-.332-76.739-19.766-95.175-59.995-18.902-41.245-4.004-90.848 34.186-116.106 9.182-6.073 12.505-11.566 10.096-23.136-5.49-26.361 4.453-47.956 26.42-62.981 22.987-15.723 47.422-16.146 72.034-3.083 10.269 5.45 14.607 11.564 22.198-2.527 14.222-26.399 34.557-46.727 60.671-61.294 97.46-54.366 228.37 7.568 230.24 132.697.122 8.15 2.412 12.428 9.848 15.894 57.56 26.829 74.456 96.122 35.142 144.497zm-87.789-80.499c-5.848 31.157-34.622 55.096-66.666 55.095-16.953-.001-32.058-6.545-44.079-17.705-27.697-25.713-71.141-74.98-95.937-93.387-20.056-14.888-41.99-12.333-60.272 3.782-49.996 44.071 15.859 121.775 67.063 77.188 4.548-3.96 7.84-9.543 12.744-12.844 8.184-5.509 20.766-.884 13.168 10.622-17.358 26.284-49.33 38.197-78.863 29.301-28.897-8.704-48.84-35.968-48.626-70.179 1.225-22.485 12.364-43.06 35.414-55.965 22.575-12.638 46.369-13.146 66.991 2.474C295.68 280.7 320.467 323.97 352.185 343.47c24.558 15.099 54.254 7.363 68.823-17.506 28.83-49.209-34.592-105.016-78.868-63.46-3.989 3.744-6.917 8.932-11.41 11.72-10.975 6.811-17.333-4.113-12.809-10.353 20.703-28.554 50.464-40.44 83.271-28.214 31.429 11.714 49.108 44.366 42.76 78.186z\"]\n};\nvar faSith = {\n prefix: 'fab',\n iconName: 'sith',\n icon: [448, 512, [], \"f512\", \"M0 32l69.71 118.75-58.86-11.52 69.84 91.03a146.741 146.741 0 0 0 0 51.45l-69.84 91.03 58.86-11.52L0 480l118.75-69.71-11.52 58.86 91.03-69.84c17.02 3.04 34.47 3.04 51.48 0l91.03 69.84-11.52-58.86L448 480l-69.71-118.78 58.86 11.52-69.84-91.03c3.03-17.01 3.04-34.44 0-51.45l69.84-91.03-58.86 11.52L448 32l-118.75 69.71 11.52-58.9-91.06 69.87c-8.5-1.52-17.1-2.29-25.71-2.29s-17.21.78-25.71 2.29l-91.06-69.87 11.52 58.9L0 32zm224 99.78c31.8 0 63.6 12.12 87.85 36.37 48.5 48.5 48.49 127.21 0 175.7s-127.2 48.46-175.7-.03c-48.5-48.5-48.49-127.21 0-175.7 24.24-24.25 56.05-36.34 87.85-36.34zm0 36.66c-22.42 0-44.83 8.52-61.92 25.61-34.18 34.18-34.19 89.68 0 123.87s89.65 34.18 123.84 0c34.18-34.18 34.19-89.68 0-123.87-17.09-17.09-39.5-25.61-61.92-25.61z\"]\n};\nvar faThemeisle = {\n prefix: 'fab',\n iconName: 'themeisle',\n icon: [512, 512, [], \"f2b2\", \"M208 88.286c0-10 6.286-21.714 17.715-21.714 11.142 0 17.714 11.714 17.714 21.714 0 10.285-6.572 21.714-17.714 21.714C214.286 110 208 98.571 208 88.286zm304 160c0 36.001-11.429 102.286-36.286 129.714-22.858 24.858-87.428 61.143-120.857 70.572l-1.143.286v32.571c0 16.286-12.572 30.571-29.143 30.571-10 0-19.429-5.714-24.572-14.286-5.427 8.572-14.856 14.286-24.856 14.286-10 0-19.429-5.714-24.858-14.286-5.142 8.572-14.571 14.286-24.57 14.286-10.286 0-19.429-5.714-24.858-14.286-5.143 8.572-14.571 14.286-24.571 14.286-18.857 0-29.429-15.714-29.429-32.857-16.286 12.285-35.715 19.428-56.571 19.428-22 0-43.429-8.285-60.286-22.857 10.285-.286 20.571-2.286 30.285-5.714-20.857-5.714-39.428-18.857-52-36.286 21.37 4.645 46.209 1.673 67.143-11.143-22-22-56.571-58.857-68.572-87.428C1.143 321.714 0 303.714 0 289.429c0-49.714 20.286-160 86.286-160 10.571 0 18.857 4.858 23.143 14.857a158.792 158.792 0 0 1 12-15.428c2-2.572 5.714-5.429 7.143-8.286 7.999-12.571 11.714-21.142 21.714-34C182.571 45.428 232 17.143 285.143 17.143c6 0 12 .285 17.714 1.143C313.714 6.571 328.857 0 344.572 0c14.571 0 29.714 6 40 16.286.857.858 1.428 2.286 1.428 3.428 0 3.714-10.285 13.429-12.857 16.286 4.286 1.429 15.714 6.858 15.714 12 0 2.857-2.857 5.143-4.571 7.143 31.429 27.714 49.429 67.143 56.286 108 4.286-5.143 10.285-8.572 17.143-8.572 10.571 0 20.857 7.144 28.571 14.001C507.143 187.143 512 221.714 512 248.286zM188 89.428c0 18.286 12.571 37.143 32.286 37.143 19.714 0 32.285-18.857 32.285-37.143 0-18-12.571-36.857-32.285-36.857-19.715 0-32.286 18.858-32.286 36.857zM237.714 194c0-19.714 3.714-39.143 8.571-58.286-52.039 79.534-13.531 184.571 68.858 184.571 21.428 0 42.571-7.714 60-20 2-7.429 3.714-14.857 3.714-22.572 0-14.286-6.286-21.428-20.572-21.428-4.571 0-9.143.857-13.429 1.714-63.343 12.668-107.142 3.669-107.142-63.999zm-41.142 254.858c0-11.143-8.858-20.857-20.286-20.857-11.429 0-20 9.715-20 20.857v32.571c0 11.143 8.571 21.142 20 21.142 11.428 0 20.286-9.715 20.286-21.142v-32.571zm49.143 0c0-11.143-8.572-20.857-20-20.857-11.429 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.857 21.142 20.286 21.142 11.428 0 20-10 20-21.142v-32.571zm49.713 0c0-11.143-8.857-20.857-20.285-20.857-11.429 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.857 21.142 20.286 21.142 11.428 0 20.285-9.715 20.285-21.142v-32.571zm49.715 0c0-11.143-8.857-20.857-20.286-20.857-11.428 0-20.286 9.715-20.286 20.857v32.571c0 11.143 8.858 21.142 20.286 21.142 11.429 0 20.286-10 20.286-21.142v-32.571zM421.714 286c-30.857 59.142-90.285 102.572-158.571 102.572-96.571 0-160.571-84.572-160.571-176.572 0-16.857 2-33.429 6-49.714-20 33.715-29.714 72.572-29.714 111.429 0 60.286 24.857 121.715 71.429 160.857 5.143-9.714 14.857-16.286 26-16.286 10 0 19.428 5.714 24.571 14.286 5.429-8.571 14.571-14.286 24.858-14.286 10 0 19.428 5.714 24.571 14.286 5.429-8.571 14.857-14.286 24.858-14.286 10 0 19.428 5.714 24.857 14.286 5.143-8.571 14.571-14.286 24.572-14.286 10.857 0 20.857 6.572 25.714 16 43.427-36.286 68.569-92 71.426-148.286zm10.572-99.714c0-53.714-34.571-105.714-92.572-105.714-30.285 0-58.571 15.143-78.857 36.857C240.862 183.812 233.41 254 302.286 254c28.805 0 97.357-28.538 84.286 36.857 28.857-26 45.714-65.714 45.714-104.571z\"]\n};\nvar faPage4 = {\n prefix: 'fab',\n iconName: 'page4',\n icon: [496, 512, [], \"f3d7\", \"M248 504C111 504 0 393 0 256S111 8 248 8c20.9 0 41.3 2.6 60.7 7.5L42.3 392H248v112zm0-143.6V146.8L98.6 360.4H248zm96 31.6v92.7c45.7-19.2 84.5-51.7 111.4-92.7H344zm57.4-138.2l-21.2 8.4 21.2 8.3v-16.7zm-20.3 54.5c-6.7 0-8 6.3-8 12.9v7.7h16.2v-10c0-5.9-2.3-10.6-8.2-10.6zM496 256c0 37.3-8.2 72.7-23 104.4H344V27.3C433.3 64.8 496 153.1 496 256zM360.4 143.6h68.2V96h-13.9v32.6h-13.9V99h-13.9v29.6h-12.7V96h-13.9v47.6zm68.1 185.3H402v-11c0-15.4-5.6-25.2-20.9-25.2-15.4 0-20.7 10.6-20.7 25.9v25.3h68.2v-15zm0-103l-68.2 29.7V268l68.2 29.5v-16.6l-14.4-5.7v-26.5l14.4-5.9v-16.9zm-4.8-68.5h-35.6V184H402v-12.2h11c8.6 15.8 1.3 35.3-18.6 35.3-22.5 0-28.3-25.3-15.5-37.7l-11.6-10.6c-16.2 17.5-12.2 63.9 27.1 63.9 34 0 44.7-35.9 29.3-65.3z\"]\n};\nvar faHashnode = {\n prefix: 'fab',\n iconName: 'hashnode',\n icon: [512, 512, [], \"e499\", \"M35.19 171.1C-11.72 217.1-11.72 294 35.19 340.9L171.1 476.8C217.1 523.7 294 523.7 340.9 476.8L476.8 340.9C523.7 294 523.7 217.1 476.8 171.1L340.9 35.19C294-11.72 217.1-11.72 171.1 35.19L35.19 171.1zM315.5 315.5C282.6 348.3 229.4 348.3 196.6 315.5C163.7 282.6 163.7 229.4 196.6 196.6C229.4 163.7 282.6 163.7 315.5 196.6C348.3 229.4 348.3 282.6 315.5 315.5z\"]\n};\nvar faReact = {\n prefix: 'fab',\n iconName: 'react',\n icon: [512, 512, [], \"f41b\", \"M418.2 177.2c-5.4-1.8-10.8-3.5-16.2-5.1.9-3.7 1.7-7.4 2.5-11.1 12.3-59.6 4.2-107.5-23.1-123.3-26.3-15.1-69.2.6-112.6 38.4-4.3 3.7-8.5 7.6-12.5 11.5-2.7-2.6-5.5-5.2-8.3-7.7-45.5-40.4-91.1-57.4-118.4-41.5-26.2 15.2-34 60.3-23 116.7 1.1 5.6 2.3 11.1 3.7 16.7-6.4 1.8-12.7 3.8-18.6 5.9C38.3 196.2 0 225.4 0 255.6c0 31.2 40.8 62.5 96.3 81.5 4.5 1.5 9 3 13.6 4.3-1.5 6-2.8 11.9-4 18-10.5 55.5-2.3 99.5 23.9 114.6 27 15.6 72.4-.4 116.6-39.1 3.5-3.1 7-6.3 10.5-9.7 4.4 4.3 9 8.4 13.6 12.4 42.8 36.8 85.1 51.7 111.2 36.6 27-15.6 35.8-62.9 24.4-120.5-.9-4.4-1.9-8.9-3-13.5 3.2-.9 6.3-1.9 9.4-2.9 57.7-19.1 99.5-50 99.5-81.7 0-30.3-39.4-59.7-93.8-78.4zM282.9 92.3c37.2-32.4 71.9-45.1 87.7-36 16.9 9.7 23.4 48.9 12.8 100.4-.7 3.4-1.4 6.7-2.3 10-22.2-5-44.7-8.6-67.3-10.6-13-18.6-27.2-36.4-42.6-53.1 3.9-3.7 7.7-7.2 11.7-10.7zM167.2 307.5c5.1 8.7 10.3 17.4 15.8 25.9-15.6-1.7-31.1-4.2-46.4-7.5 4.4-14.4 9.9-29.3 16.3-44.5 4.6 8.8 9.3 17.5 14.3 26.1zm-30.3-120.3c14.4-3.2 29.7-5.8 45.6-7.8-5.3 8.3-10.5 16.8-15.4 25.4-4.9 8.5-9.7 17.2-14.2 26-6.3-14.9-11.6-29.5-16-43.6zm27.4 68.9c6.6-13.8 13.8-27.3 21.4-40.6s15.8-26.2 24.4-38.9c15-1.1 30.3-1.7 45.9-1.7s31 .6 45.9 1.7c8.5 12.6 16.6 25.5 24.3 38.7s14.9 26.7 21.7 40.4c-6.7 13.8-13.9 27.4-21.6 40.8-7.6 13.3-15.7 26.2-24.2 39-14.9 1.1-30.4 1.6-46.1 1.6s-30.9-.5-45.6-1.4c-8.7-12.7-16.9-25.7-24.6-39s-14.8-26.8-21.5-40.6zm180.6 51.2c5.1-8.8 9.9-17.7 14.6-26.7 6.4 14.5 12 29.2 16.9 44.3-15.5 3.5-31.2 6.2-47 8 5.4-8.4 10.5-17 15.5-25.6zm14.4-76.5c-4.7-8.8-9.5-17.6-14.5-26.2-4.9-8.5-10-16.9-15.3-25.2 16.1 2 31.5 4.7 45.9 8-4.6 14.8-10 29.2-16.1 43.4zM256.2 118.3c10.5 11.4 20.4 23.4 29.6 35.8-19.8-.9-39.7-.9-59.5 0 9.8-12.9 19.9-24.9 29.9-35.8zM140.2 57c16.8-9.8 54.1 4.2 93.4 39 2.5 2.2 5 4.6 7.6 7-15.5 16.7-29.8 34.5-42.9 53.1-22.6 2-45 5.5-67.2 10.4-1.3-5.1-2.4-10.3-3.5-15.5-9.4-48.4-3.2-84.9 12.6-94zm-24.5 263.6c-4.2-1.2-8.3-2.5-12.4-3.9-21.3-6.7-45.5-17.3-63-31.2-10.1-7-16.9-17.8-18.8-29.9 0-18.3 31.6-41.7 77.2-57.6 5.7-2 11.5-3.8 17.3-5.5 6.8 21.7 15 43 24.5 63.6-9.6 20.9-17.9 42.5-24.8 64.5zm116.6 98c-16.5 15.1-35.6 27.1-56.4 35.3-11.1 5.3-23.9 5.8-35.3 1.3-15.9-9.2-22.5-44.5-13.5-92 1.1-5.6 2.3-11.2 3.7-16.7 22.4 4.8 45 8.1 67.9 9.8 13.2 18.7 27.7 36.6 43.2 53.4-3.2 3.1-6.4 6.1-9.6 8.9zm24.5-24.3c-10.2-11-20.4-23.2-30.3-36.3 9.6.4 19.5.6 29.5.6 10.3 0 20.4-.2 30.4-.7-9.2 12.7-19.1 24.8-29.6 36.4zm130.7 30c-.9 12.2-6.9 23.6-16.5 31.3-15.9 9.2-49.8-2.8-86.4-34.2-4.2-3.6-8.4-7.5-12.7-11.5 15.3-16.9 29.4-34.8 42.2-53.6 22.9-1.9 45.7-5.4 68.2-10.5 1 4.1 1.9 8.2 2.7 12.2 4.9 21.6 5.7 44.1 2.5 66.3zm18.2-107.5c-2.8.9-5.6 1.8-8.5 2.6-7-21.8-15.6-43.1-25.5-63.8 9.6-20.4 17.7-41.4 24.5-62.9 5.2 1.5 10.2 3.1 15 4.7 46.6 16 79.3 39.8 79.3 58 0 19.6-34.9 44.9-84.8 61.4zm-149.7-15c25.3 0 45.8-20.5 45.8-45.8s-20.5-45.8-45.8-45.8c-25.3 0-45.8 20.5-45.8 45.8s20.5 45.8 45.8 45.8z\"]\n};\nvar faCcPaypal = {\n prefix: 'fab',\n iconName: 'cc-paypal',\n icon: [576, 512, [], \"f1f4\", \"M186.3 258.2c0 12.2-9.7 21.5-22 21.5-9.2 0-16-5.2-16-15 0-12.2 9.5-22 21.7-22 9.3 0 16.3 5.7 16.3 15.5zM80.5 209.7h-4.7c-1.5 0-3 1-3.2 2.7l-4.3 26.7 8.2-.3c11 0 19.5-1.5 21.5-14.2 2.3-13.4-6.2-14.9-17.5-14.9zm284 0H360c-1.8 0-3 1-3.2 2.7l-4.2 26.7 8-.3c13 0 22-3 22-18-.1-10.6-9.6-11.1-18.1-11.1zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM128.3 215.4c0-21-16.2-28-34.7-28h-40c-2.5 0-5 2-5.2 4.7L32 294.2c-.3 2 1.2 4 3.2 4h19c2.7 0 5.2-2.9 5.5-5.7l4.5-26.6c1-7.2 13.2-4.7 18-4.7 28.6 0 46.1-17 46.1-45.8zm84.2 8.8h-19c-3.8 0-4 5.5-4.2 8.2-5.8-8.5-14.2-10-23.7-10-24.5 0-43.2 21.5-43.2 45.2 0 19.5 12.2 32.2 31.7 32.2 9 0 20.2-4.9 26.5-11.9-.5 1.5-1 4.7-1 6.2 0 2.3 1 4 3.2 4H200c2.7 0 5-2.9 5.5-5.7l10.2-64.3c.3-1.9-1.2-3.9-3.2-3.9zm40.5 97.9l63.7-92.6c.5-.5.5-1 .5-1.7 0-1.7-1.5-3.5-3.2-3.5h-19.2c-1.7 0-3.5 1-4.5 2.5l-26.5 39-11-37.5c-.8-2.2-3-4-5.5-4h-18.7c-1.7 0-3.2 1.8-3.2 3.5 0 1.2 19.5 56.8 21.2 62.1-2.7 3.8-20.5 28.6-20.5 31.6 0 1.8 1.5 3.2 3.2 3.2h19.2c1.8-.1 3.5-1.1 4.5-2.6zm159.3-106.7c0-21-16.2-28-34.7-28h-39.7c-2.7 0-5.2 2-5.5 4.7l-16.2 102c-.2 2 1.3 4 3.2 4h20.5c2 0 3.5-1.5 4-3.2l4.5-29c1-7.2 13.2-4.7 18-4.7 28.4 0 45.9-17 45.9-45.8zm84.2 8.8h-19c-3.8 0-4 5.5-4.3 8.2-5.5-8.5-14-10-23.7-10-24.5 0-43.2 21.5-43.2 45.2 0 19.5 12.2 32.2 31.7 32.2 9.3 0 20.5-4.9 26.5-11.9-.3 1.5-1 4.7-1 6.2 0 2.3 1 4 3.2 4H484c2.7 0 5-2.9 5.5-5.7l10.2-64.3c.3-1.9-1.2-3.9-3.2-3.9zm47.5-33.3c0-2-1.5-3.5-3.2-3.5h-18.5c-1.5 0-3 1.2-3.2 2.7l-16.2 104-.3.5c0 1.8 1.5 3.5 3.5 3.5h16.5c2.5 0 5-2.9 5.2-5.7L544 191.2v-.3zm-90 51.8c-12.2 0-21.7 9.7-21.7 22 0 9.7 7 15 16.2 15 12 0 21.7-9.2 21.7-21.5.1-9.8-6.9-15.5-16.2-15.5z\"]\n};\nvar faSquarespace = {\n prefix: 'fab',\n iconName: 'squarespace',\n icon: [512, 512, [], \"f5be\", \"M186.12 343.34c-9.65 9.65-9.65 25.29 0 34.94 9.65 9.65 25.29 9.65 34.94 0L378.24 221.1c19.29-19.29 50.57-19.29 69.86 0s19.29 50.57 0 69.86L293.95 445.1c19.27 19.29 50.53 19.31 69.82.04l.04-.04 119.25-119.24c38.59-38.59 38.59-101.14 0-139.72-38.59-38.59-101.15-38.59-139.72 0l-157.22 157.2zm244.53-104.8c-9.65-9.65-25.29-9.65-34.93 0l-157.2 157.18c-19.27 19.29-50.53 19.31-69.82.05l-.05-.05c-9.64-9.64-25.27-9.65-34.92-.01l-.01.01c-9.65 9.64-9.66 25.28-.02 34.93l.02.02c38.58 38.57 101.14 38.57 139.72 0l157.2-157.2c9.65-9.65 9.65-25.29.01-34.93zm-261.99 87.33l157.18-157.18c9.64-9.65 9.64-25.29 0-34.94-9.64-9.64-25.27-9.64-34.91 0L133.72 290.93c-19.28 19.29-50.56 19.3-69.85.01l-.01-.01c-19.29-19.28-19.31-50.54-.03-69.84l.03-.03L218.03 66.89c-19.28-19.29-50.55-19.3-69.85-.02l-.02.02L28.93 186.14c-38.58 38.59-38.58 101.14 0 139.72 38.6 38.59 101.13 38.59 139.73.01zm-87.33-52.4c9.64 9.64 25.27 9.64 34.91 0l157.21-157.19c19.28-19.29 50.55-19.3 69.84-.02l.02.02c9.65 9.65 25.29 9.65 34.93 0 9.65-9.65 9.65-25.29 0-34.93-38.59-38.59-101.13-38.59-139.72 0L81.33 238.54c-9.65 9.64-9.65 25.28-.01 34.93h.01z\"]\n};\nvar faCcStripe = {\n prefix: 'fab',\n iconName: 'cc-stripe',\n icon: [576, 512, [], \"f1f5\", \"M492.4 220.8c-8.9 0-18.7 6.7-18.7 22.7h36.7c0-16-9.3-22.7-18-22.7zM375 223.4c-8.2 0-13.3 2.9-17 7l.2 52.8c3.5 3.7 8.5 6.7 16.8 6.7 13.1 0 21.9-14.3 21.9-33.4 0-18.6-9-33.2-21.9-33.1zM528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM122.2 281.1c0 25.6-20.3 40.1-49.9 40.3-12.2 0-25.6-2.4-38.8-8.1v-33.9c12 6.4 27.1 11.3 38.9 11.3 7.9 0 13.6-2.1 13.6-8.7 0-17-54-10.6-54-49.9 0-25.2 19.2-40.2 48-40.2 11.8 0 23.5 1.8 35.3 6.5v33.4c-10.8-5.8-24.5-9.1-35.3-9.1-7.5 0-12.1 2.2-12.1 7.7 0 16 54.3 8.4 54.3 50.7zm68.8-56.6h-27V275c0 20.9 22.5 14.4 27 12.6v28.9c-4.7 2.6-13.3 4.7-24.9 4.7-21.1 0-36.9-15.5-36.9-36.5l.2-113.9 34.7-7.4v30.8H191zm74 2.4c-4.5-1.5-18.7-3.6-27.1 7.4v84.4h-35.5V194.2h30.7l2.2 10.5c8.3-15.3 24.9-12.2 29.6-10.5h.1zm44.1 91.8h-35.7V194.2h35.7zm0-142.9l-35.7 7.6v-28.9l35.7-7.6zm74.1 145.5c-12.4 0-20-5.3-25.1-9l-.1 40.2-35.5 7.5V194.2h31.3l1.8 8.8c4.9-4.5 13.9-11.1 27.8-11.1 24.9 0 48.4 22.5 48.4 63.8 0 45.1-23.2 65.5-48.6 65.6zm160.4-51.5h-69.5c1.6 16.6 13.8 21.5 27.6 21.5 14.1 0 25.2-3 34.9-7.9V312c-9.7 5.3-22.4 9.2-39.4 9.2-34.6 0-58.8-21.7-58.8-64.5 0-36.2 20.5-64.9 54.3-64.9 33.7 0 51.3 28.7 51.3 65.1 0 3.5-.3 10.9-.4 12.9z\"]\n};\nvar faCreativeCommonsShare = {\n prefix: 'fab',\n iconName: 'creative-commons-share',\n icon: [496, 512, [], \"f4f2\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm101 132.4c7.8 0 13.7 6.1 13.7 13.7v182.5c0 7.7-6.1 13.7-13.7 13.7H214.3c-7.7 0-13.7-6-13.7-13.7v-54h-54c-7.8 0-13.7-6-13.7-13.7V131.1c0-8.2 6.6-12.7 12.4-13.7h136.4c7.7 0 13.7 6 13.7 13.7v54h54zM159.9 300.3h40.7V198.9c0-7.4 5.8-12.6 12-13.7h55.8v-40.3H159.9v155.4zm176.2-88.1H227.6v155.4h108.5V212.2z\"]\n};\nvar faBitcoin = {\n prefix: 'fab',\n iconName: 'bitcoin',\n icon: [512, 512, [], \"f379\", \"M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-141.651-35.33c4.937-32.999-20.191-50.739-54.55-62.573l11.146-44.702-27.213-6.781-10.851 43.524c-7.154-1.783-14.502-3.464-21.803-5.13l10.929-43.81-27.198-6.781-11.153 44.686c-5.922-1.349-11.735-2.682-17.377-4.084l.031-.14-37.53-9.37-7.239 29.062s20.191 4.627 19.765 4.913c11.022 2.751 13.014 10.044 12.68 15.825l-12.696 50.925c.76.194 1.744.473 2.829.907-.907-.225-1.876-.473-2.876-.713l-17.796 71.338c-1.349 3.348-4.767 8.37-12.471 6.464.271.395-19.78-4.937-19.78-4.937l-13.51 31.147 35.414 8.827c6.588 1.651 13.045 3.379 19.4 5.006l-11.262 45.213 27.182 6.781 11.153-44.733a1038.209 1038.209 0 0 0 21.687 5.627l-11.115 44.523 27.213 6.781 11.262-45.128c46.404 8.781 81.299 5.239 95.986-36.727 11.836-33.79-.589-53.281-25.004-65.991 17.78-4.098 31.174-15.792 34.747-39.949zm-62.177 87.179c-8.41 33.79-65.308 15.523-83.755 10.943l14.944-59.899c18.446 4.603 77.6 13.717 68.811 48.956zm8.417-87.667c-7.673 30.736-55.031 15.12-70.393 11.292l13.548-54.327c15.363 3.828 64.836 10.973 56.845 43.035z\"]\n};\nvar faKeycdn = {\n prefix: 'fab',\n iconName: 'keycdn',\n icon: [512, 512, [], \"f3ba\", \"M63.8 409.3l60.5-59c32.1 42.8 71.1 66 126.6 67.4 30.5.7 60.3-7 86.4-22.4 5.1 5.3 18.5 19.5 20.9 22-32.2 20.7-69.6 31.1-108.1 30.2-43.3-1.1-84.6-16.7-117.7-44.4.3-.6-38.2 37.5-38.6 37.9 9.5 29.8-13.1 62.4-46.3 62.4C20.7 503.3 0 481.7 0 454.9c0-34.3 33.1-56.6 63.8-45.6zm354.9-252.4c19.1 31.3 29.6 67.4 28.7 104-1.1 44.8-19 87.5-48.6 121 .3.3 23.8 25.2 24.1 25.5 9.6-1.3 19.2 2 25.9 9.1 11.3 12 10.9 30.9-1.1 42.4-12 11.3-30.9 10.9-42.4-1.1-6.7-7-9.4-16.8-7.6-26.3-24.9-26.6-44.4-47.2-44.4-47.2 42.7-34.1 63.3-79.6 64.4-124.2.7-28.9-7.2-57.2-21.1-82.2l22.1-21zM104 53.1c6.7 7 9.4 16.8 7.6 26.3l45.9 48.1c-4.7 3.8-13.3 10.4-22.8 21.3-25.4 28.5-39.6 64.8-40.7 102.9-.7 28.9 6.1 57.2 20 82.4l-22 21.5C72.7 324 63.1 287.9 64.2 250.9c1-44.6 18.3-87.6 47.5-121.1l-25.3-26.4c-9.6 1.3-19.2-2-25.9-9.1-11.3-12-10.9-30.9 1.1-42.4C73.5 40.7 92.2 41 104 53.1zM464.9 8c26 0 47.1 22.4 47.1 48.3S490.9 104 464.9 104c-6.3.1-14-1.1-15.9-1.8l-62.9 59.7c-32.7-43.6-76.7-65.9-126.9-67.2-30.5-.7-60.3 6.8-86.2 22.4l-21.1-22C184.1 74.3 221.5 64 260 64.9c43.3 1.1 84.6 16.7 117.7 44.6l41.1-38.6c-1.5-4.7-2.2-9.6-2.2-14.5C416.5 29.7 438.9 8 464.9 8zM256.7 113.4c5.5 0 10.9.4 16.4 1.1 78.1 9.8 133.4 81.1 123.8 159.1-9.8 78.1-81.1 133.4-159.1 123.8-78.1-9.8-133.4-81.1-123.8-159.2 9.3-72.4 70.1-124.6 142.7-124.8zm-59 119.4c.6 22.7 12.2 41.8 32.4 52.2l-11 51.7h73.7l-11-51.7c20.1-10.9 32.1-29 32.4-52.2-.4-32.8-25.8-57.5-58.3-58.3-32.1.8-57.3 24.8-58.2 58.3zM256 160\"]\n};\nvar faOpera = {\n prefix: 'fab',\n iconName: 'opera',\n icon: [496, 512, [], \"f26a\", \"M313.9 32.7c-170.2 0-252.6 223.8-147.5 355.1 36.5 45.4 88.6 75.6 147.5 75.6 36.3 0 70.3-11.1 99.4-30.4-43.8 39.2-101.9 63-165.3 63-3.9 0-8 0-11.9-.3C104.6 489.6 0 381.1 0 248 0 111 111 0 248 0h.8c63.1.3 120.7 24.1 164.4 63.1-29-19.4-63.1-30.4-99.3-30.4zm101.8 397.7c-40.9 24.7-90.7 23.6-132-5.8 56.2-20.5 97.7-91.6 97.7-176.6 0-84.7-41.2-155.8-97.4-176.6 41.8-29.2 91.2-30.3 132.9-5 105.9 98.7 105.5 265.7-1.2 364z\"]\n};\nvar faItchIo = {\n prefix: 'fab',\n iconName: 'itch-io',\n icon: [512, 512, [], \"f83a\", \"M71.92 34.77C50.2 47.67 7.4 96.84 7 109.73v21.34c0 27.06 25.29 50.84 48.25 50.84 27.57 0 50.54-22.85 50.54-50 0 27.12 22.18 50 49.76 50s49-22.85 49-50c0 27.12 23.59 50 51.16 50h.5c27.57 0 51.16-22.85 51.16-50 0 27.12 21.47 50 49 50s49.76-22.85 49.76-50c0 27.12 23 50 50.54 50 23 0 48.25-23.78 48.25-50.84v-21.34c-.4-12.9-43.2-62.07-64.92-75C372.56 32.4 325.76 32 256 32S91.14 33.1 71.92 34.77zm132.32 134.39c-22 38.4-77.9 38.71-99.85.25-13.17 23.14-43.17 32.07-56 27.66-3.87 40.15-13.67 237.13 17.73 269.15 80 18.67 302.08 18.12 379.76 0 31.65-32.27 21.32-232 17.75-269.15-12.92 4.44-42.88-4.6-56-27.66-22 38.52-77.85 38.1-99.85-.24-7.1 12.49-23.05 28.94-51.76 28.94a57.54 57.54 0 0 1-51.75-28.94zm-41.58 53.77c16.47 0 31.09 0 49.22 19.78a436.91 436.91 0 0 1 88.18 0C318.22 223 332.85 223 349.31 223c52.33 0 65.22 77.53 83.87 144.45 17.26 62.15-5.52 63.67-33.95 63.73-42.15-1.57-65.49-32.18-65.49-62.79-39.25 6.43-101.93 8.79-155.55 0 0 30.61-23.34 61.22-65.49 62.79-28.42-.06-51.2-1.58-33.94-63.73 18.67-67 31.56-144.45 83.88-144.45zM256 270.79s-44.38 40.77-52.35 55.21l29-1.17v25.32c0 1.55 21.34.16 23.33.16 11.65.54 23.31 1 23.31-.16v-25.28l29 1.17c-8-14.48-52.35-55.24-52.35-55.24z\"]\n};\nvar faUmbraco = {\n prefix: 'fab',\n iconName: 'umbraco',\n icon: [510, 512, [], \"f8e8\", \"M255.35 8C118.36 7.83 7.14 118.72 7 255.68c-.07 137 111 248.2 248 248.27 136.85 0 247.82-110.7 248-247.67S392.34 8.17 255.35 8zm145 266q-1.14 40.68-14 65t-43.51 35q-30.61 10.7-85.45 10.47h-4.6q-54.78.22-85.44-10.47t-43.52-35q-12.85-24.36-14-65a224.81 224.81 0 0 1 0-30.71 418.37 418.37 0 0 1 3.6-43.88c1.88-13.39 3.57-22.58 5.4-32 1-4.88 1.28-6.42 1.82-8.45a5.09 5.09 0 0 1 4.9-3.89h.69l32 5a5.07 5.07 0 0 1 4.16 5 5 5 0 0 1 0 .77l-1.7 8.78q-2.41 13.25-4.84 33.68a380.62 380.62 0 0 0-2.64 42.15q-.28 40.43 8.13 59.83a43.87 43.87 0 0 0 31.31 25.18A243 243 0 0 0 250 340.6h10.25a242.64 242.64 0 0 0 57.27-5.16 43.86 43.86 0 0 0 31.15-25.23q8.53-19.42 8.13-59.78a388 388 0 0 0-2.6-42.15q-2.48-20.38-4.89-33.68l-1.69-8.78a5 5 0 0 1 0-.77 5 5 0 0 1 4.2-5l32-5h.82a5 5 0 0 1 4.9 3.89c.55 2.05.81 3.57 1.83 8.45 1.82 9.62 3.52 18.78 5.39 32a415.71 415.71 0 0 1 3.61 43.88 228.06 228.06 0 0 1-.04 30.73z\"]\n};\nvar faGalacticSenate = {\n prefix: 'fab',\n iconName: 'galactic-senate',\n icon: [512, 512, [], \"f50d\", \"M249.86 33.48v26.07C236.28 80.17 226 168.14 225.39 274.9c11.74-15.62 19.13-33.33 19.13-48.24v-16.88c-.03-5.32.75-10.53 2.19-15.65.65-2.14 1.39-4.08 2.62-5.82 1.23-1.75 3.43-3.79 6.68-3.79 3.24 0 5.45 2.05 6.68 3.79 1.23 1.75 1.97 3.68 2.62 5.82 1.44 5.12 2.22 10.33 2.19 15.65v16.88c0 14.91 7.39 32.62 19.13 48.24-.63-106.76-10.91-194.73-24.49-215.35V33.48h-12.28zm-26.34 147.77c-9.52 2.15-18.7 5.19-27.46 9.08 8.9 16.12 9.76 32.64 1.71 37.29-8 4.62-21.85-4.23-31.36-19.82-11.58 8.79-21.88 19.32-30.56 31.09 14.73 9.62 22.89 22.92 18.32 30.66-4.54 7.7-20.03 7.14-35.47-.96-5.78 13.25-9.75 27.51-11.65 42.42 9.68.18 18.67 2.38 26.18 6.04 17.78-.3 32.77-1.96 40.49-4.22 5.55-26.35 23.02-48.23 46.32-59.51.73-25.55 1.88-49.67 3.48-72.07zm64.96 0c1.59 22.4 2.75 46.52 3.47 72.07 23.29 11.28 40.77 33.16 46.32 59.51 7.72 2.26 22.71 3.92 40.49 4.22 7.51-3.66 16.5-5.85 26.18-6.04-1.9-14.91-5.86-29.17-11.65-42.42-15.44 8.1-30.93 8.66-35.47.96-4.57-7.74 3.6-21.05 18.32-30.66-8.68-11.77-18.98-22.3-30.56-31.09-9.51 15.59-23.36 24.44-31.36 19.82-8.05-4.65-7.19-21.16 1.71-37.29a147.49 147.49 0 0 0-27.45-9.08zm-32.48 8.6c-3.23 0-5.86 8.81-6.09 19.93h-.05v16.88c0 41.42-49.01 95.04-93.49 95.04-52 0-122.75-1.45-156.37 29.17v2.51c9.42 17.12 20.58 33.17 33.18 47.97C45.7 380.26 84.77 360.4 141.2 360c45.68 1.02 79.03 20.33 90.76 40.87.01.01-.01.04 0 .05 7.67 2.14 15.85 3.23 24.04 3.21 8.19.02 16.37-1.07 24.04-3.21.01-.01-.01-.04 0-.05 11.74-20.54 45.08-39.85 90.76-40.87 56.43.39 95.49 20.26 108.02 41.35 12.6-14.8 23.76-30.86 33.18-47.97v-2.51c-33.61-30.62-104.37-29.17-156.37-29.17-44.48 0-93.49-53.62-93.49-95.04v-16.88h-.05c-.23-11.12-2.86-19.93-6.09-19.93zm0 96.59c22.42 0 40.6 18.18 40.6 40.6s-18.18 40.65-40.6 40.65-40.6-18.23-40.6-40.65c0-22.42 18.18-40.6 40.6-40.6zm0 7.64c-18.19 0-32.96 14.77-32.96 32.96S237.81 360 256 360s32.96-14.77 32.96-32.96-14.77-32.96-32.96-32.96zm0 6.14c14.81 0 26.82 12.01 26.82 26.82s-12.01 26.82-26.82 26.82-26.82-12.01-26.82-26.82 12.01-26.82 26.82-26.82zm-114.8 66.67c-10.19.07-21.6.36-30.5 1.66.43 4.42 1.51 18.63 7.11 29.76 9.11-2.56 18.36-3.9 27.62-3.9 41.28.94 71.48 34.35 78.26 74.47l.11 4.7c10.4 1.91 21.19 2.94 32.21 2.94 11.03 0 21.81-1.02 32.21-2.94l.11-4.7c6.78-40.12 36.98-73.53 78.26-74.47 9.26 0 18.51 1.34 27.62 3.9 5.6-11.13 6.68-25.34 7.11-29.76-8.9-1.3-20.32-1.58-30.5-1.66-18.76.42-35.19 4.17-48.61 9.67-12.54 16.03-29.16 30.03-49.58 33.07-.09.02-.17.04-.27.05-.05.01-.11.04-.16.05-5.24 1.07-10.63 1.6-16.19 1.6-5.55 0-10.95-.53-16.19-1.6-.05-.01-.11-.04-.16-.05-.1-.02-.17-.04-.27-.05-20.42-3.03-37.03-17.04-49.58-33.07-13.42-5.49-29.86-9.25-48.61-9.67z\"]\n};\nvar faUbuntu = {\n prefix: 'fab',\n iconName: 'ubuntu',\n icon: [496, 512, [], \"f7df\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm52.7 93c8.8-15.2 28.3-20.5 43.5-11.7 15.3 8.8 20.5 28.3 11.7 43.6-8.8 15.2-28.3 20.5-43.5 11.7-15.3-8.9-20.5-28.4-11.7-43.6zM87.4 287.9c-17.6 0-31.9-14.3-31.9-31.9 0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9 0 17.6-14.3 31.9-31.9 31.9zm28.1 3.1c22.3-17.9 22.4-51.9 0-69.9 8.6-32.8 29.1-60.7 56.5-79.1l23.7 39.6c-51.5 36.3-51.5 112.5 0 148.8L172 370c-27.4-18.3-47.8-46.3-56.5-79zm228.7 131.7c-15.3 8.8-34.7 3.6-43.5-11.7-8.8-15.3-3.6-34.8 11.7-43.6 15.2-8.8 34.7-3.6 43.5 11.7 8.8 15.3 3.6 34.8-11.7 43.6zm.3-69.5c-26.7-10.3-56.1 6.6-60.5 35-5.2 1.4-48.9 14.3-96.7-9.4l22.5-40.3c57 26.5 123.4-11.7 128.9-74.4l46.1.7c-2.3 34.5-17.3 65.5-40.3 88.4zm-5.9-105.3c-5.4-62-71.3-101.2-128.9-74.4l-22.5-40.3c47.9-23.7 91.5-10.8 96.7-9.4 4.4 28.3 33.8 45.3 60.5 35 23.1 22.9 38 53.9 40.2 88.5l-46 .6z\"]\n};\nvar faDraft2digital = {\n prefix: 'fab',\n iconName: 'draft2digital',\n icon: [480, 512, [], \"f396\", \"M480 398.1l-144-82.2v64.7h-91.3c30.8-35 81.8-95.9 111.8-149.3 35.2-62.6 16.1-123.4-12.8-153.3-4.4-4.6-62.2-62.9-166-41.2-59.1 12.4-89.4 43.4-104.3 67.3-13.1 20.9-17 39.8-18.2 47.7-5.5 33 19.4 67.1 56.7 67.1 31.7 0 57.3-25.7 57.3-57.4 0-27.1-19.7-52.1-48-56.8 1.8-7.3 17.7-21.1 26.3-24.7 41.1-17.3 78 5.2 83.3 33.5 8.3 44.3-37.1 90.4-69.7 127.6C84.5 328.1 18.3 396.8 0 415.9l336-.1V480zM369.9 371l47.1 27.2-47.1 27.2zM134.2 161.4c0 12.4-10 22.4-22.4 22.4s-22.4-10-22.4-22.4 10-22.4 22.4-22.4 22.4 10.1 22.4 22.4zM82.5 380.5c25.6-27.4 97.7-104.7 150.8-169.9 35.1-43.1 40.3-82.4 28.4-112.7-7.4-18.8-17.5-30.2-24.3-35.7 45.3 2.1 68 23.4 82.2 38.3 0 0 42.4 48.2 5.8 113.3-37 65.9-110.9 147.5-128.5 166.7z\"]\n};\nvar faStripe = {\n prefix: 'fab',\n iconName: 'stripe',\n icon: [640, 512, [], \"f429\", \"M165 144.7l-43.3 9.2-.2 142.4c0 26.3 19.8 43.3 46.1 43.3 14.6 0 25.3-2.7 31.2-5.9v-33.8c-5.7 2.3-33.7 10.5-33.7-15.7V221h33.7v-37.8h-33.7zm89.1 51.6l-2.7-13.1H213v153.2h44.3V233.3c10.5-13.8 28.2-11.1 33.9-9.3v-40.8c-6-2.1-26.7-6-37.1 13.1zm92.3-72.3l-44.6 9.5v36.2l44.6-9.5zM44.9 228.3c0-6.9 5.8-9.6 15.1-9.7 13.5 0 30.7 4.1 44.2 11.4v-41.8c-14.7-5.8-29.4-8.1-44.1-8.1-36 0-60 18.8-60 50.2 0 49.2 67.5 41.2 67.5 62.4 0 8.2-7.1 10.9-17 10.9-14.7 0-33.7-6.1-48.6-14.2v40c16.5 7.1 33.2 10.1 48.5 10.1 36.9 0 62.3-15.8 62.3-47.8 0-52.9-67.9-43.4-67.9-63.4zM640 261.6c0-45.5-22-81.4-64.2-81.4s-67.9 35.9-67.9 81.1c0 53.5 30.3 78.2 73.5 78.2 21.2 0 37.1-4.8 49.2-11.5v-33.4c-12.1 6.1-26 9.8-43.6 9.8-17.3 0-32.5-6.1-34.5-26.9h86.9c.2-2.3.6-11.6.6-15.9zm-87.9-16.8c0-20 12.3-28.4 23.4-28.4 10.9 0 22.5 8.4 22.5 28.4zm-112.9-64.6c-17.4 0-28.6 8.2-34.8 13.9l-2.3-11H363v204.8l44.4-9.4.1-50.2c6.4 4.7 15.9 11.2 31.4 11.2 31.8 0 60.8-23.2 60.8-79.6.1-51.6-29.3-79.7-60.5-79.7zm-10.6 122.5c-10.4 0-16.6-3.8-20.9-8.4l-.3-66c4.6-5.1 11-8.8 21.2-8.8 16.2 0 27.4 18.2 27.4 41.4.1 23.9-10.9 41.8-27.4 41.8zm-126.7 33.7h44.6V183.2h-44.6z\"]\n};\nvar faHouzz = {\n prefix: 'fab',\n iconName: 'houzz',\n icon: [448, 512, [], \"f27c\", \"M275.9 330.7H171.3V480H17V32h109.5v104.5l305.1 85.6V480H275.9z\"]\n};\nvar faGg = {\n prefix: 'fab',\n iconName: 'gg',\n icon: [512, 512, [], \"f260\", \"M179.2 230.4l102.4 102.4-102.4 102.4L0 256 179.2 76.8l44.8 44.8-25.6 25.6-19.2-19.2-128 128 128 128 51.5-51.5-77.1-76.5 25.6-25.6zM332.8 76.8L230.4 179.2l102.4 102.4 25.6-25.6-77.1-76.5 51.5-51.5 128 128-128 128-19.2-19.2-25.6 25.6 44.8 44.8L512 256 332.8 76.8z\"]\n};\nvar faDhl = {\n prefix: 'fab',\n iconName: 'dhl',\n icon: [640, 512, [], \"f790\", \"M238 301.2h58.7L319 271h-58.7L238 301.2zM0 282.9v6.4h81.8l4.7-6.4H0zM172.9 271c-8.7 0-6-3.6-4.6-5.5 2.8-3.8 7.6-10.4 10.4-14.1 2.8-3.7 2.8-5.9-2.8-5.9h-51l-41.1 55.8h100.1c33.1 0 51.5-22.5 57.2-30.3h-68.2zm317.5-6.9l39.3-53.4h-62.2l-39.3 53.4h62.2zM95.3 271H0v6.4h90.6l4.7-6.4zm111-26.6c-2.8 3.8-7.5 10.4-10.3 14.2-1.4 2-4.1 5.5 4.6 5.5h45.6s7.3-10 13.5-18.4c8.4-11.4.7-35-29.2-35H112.6l-20.4 27.8h111.4c5.6 0 5.5 2.2 2.7 5.9zM0 301.2h73.1l4.7-6.4H0v6.4zm323 0h58.7L404 271h-58.7c-.1 0-22.3 30.2-22.3 30.2zm222 .1h95v-6.4h-90.3l-4.7 6.4zm22.3-30.3l-4.7 6.4H640V271h-72.7zm-13.5 18.3H640v-6.4h-81.5l-4.7 6.4zm-164.2-78.6l-22.5 30.6h-26.2l22.5-30.6h-58.7l-39.3 53.4H409l39.3-53.4h-58.7zm33.5 60.3s-4.3 5.9-6.4 8.7c-7.4 10-.9 21.6 23.2 21.6h94.3l22.3-30.3H423.1z\"]\n};\nvar faSquarePinterest = {\n prefix: 'fab',\n iconName: 'square-pinterest',\n icon: [448, 512, [\"pinterest-square\"], \"f0d3\", \"M448 80v352c0 26.5-21.5 48-48 48H154.4c9.8-16.4 22.4-40 27.4-59.3 3-11.5 15.3-58.4 15.3-58.4 8 15.3 31.4 28.2 56.3 28.2 74.1 0 127.4-68.1 127.4-152.7 0-81.1-66.2-141.8-151.4-141.8-106 0-162.2 71.1-162.2 148.6 0 36 19.2 80.8 49.8 95.1 4.7 2.2 7.1 1.2 8.2-3.3.8-3.4 5-20.1 6.8-27.8.6-2.5.3-4.6-1.7-7-10.1-12.3-18.3-34.9-18.3-56 0-54.2 41-106.6 110.9-106.6 60.3 0 102.6 41.1 102.6 99.9 0 66.4-33.5 112.4-77.2 112.4-24.1 0-42.1-19.9-36.4-44.4 6.9-29.2 20.3-60.7 20.3-81.8 0-53-75.5-45.7-75.5 25 0 21.7 7.3 36.5 7.3 36.5-31.4 132.8-36.1 134.5-29.6 192.6l2.2.8H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48z\"]\n};\nvar faPinterestSquare = faSquarePinterest;\nvar faXing = {\n prefix: 'fab',\n iconName: 'xing',\n icon: [384, 512, [], \"f168\", \"M162.7 210c-1.8 3.3-25.2 44.4-70.1 123.5-4.9 8.3-10.8 12.5-17.7 12.5H9.8c-7.7 0-12.1-7.5-8.5-14.4l69-121.3c.2 0 .2-.1 0-.3l-43.9-75.6c-4.3-7.8.3-14.1 8.5-14.1H100c7.3 0 13.3 4.1 18 12.2l44.7 77.5zM382.6 46.1l-144 253v.3L330.2 466c3.9 7.1.2 14.1-8.5 14.1h-65.2c-7.6 0-13.6-4-18-12.2l-92.4-168.5c3.3-5.8 51.5-90.8 144.8-255.2 4.6-8.1 10.4-12.2 17.5-12.2h65.7c8 0 12.3 6.7 8.5 14.1z\"]\n};\nvar faBlackberry = {\n prefix: 'fab',\n iconName: 'blackberry',\n icon: [512, 512, [], \"f37b\", \"M166 116.9c0 23.4-16.4 49.1-72.5 49.1H23.4l21-88.8h67.8c42.1 0 53.8 23.3 53.8 39.7zm126.2-39.7h-67.8L205.7 166h70.1c53.8 0 70.1-25.7 70.1-49.1.1-16.4-11.6-39.7-53.7-39.7zM88.8 208.1H21L0 296.9h70.1c56.1 0 72.5-23.4 72.5-49.1 0-16.3-11.7-39.7-53.8-39.7zm180.1 0h-67.8l-18.7 88.8h70.1c53.8 0 70.1-23.4 70.1-49.1 0-16.3-11.7-39.7-53.7-39.7zm189.3-53.8h-67.8l-18.7 88.8h70.1c53.8 0 70.1-23.4 70.1-49.1.1-16.3-11.6-39.7-53.7-39.7zm-28 137.9h-67.8L343.7 381h70.1c56.1 0 70.1-23.4 70.1-49.1 0-16.3-11.6-39.7-53.7-39.7zM240.8 346H173l-18.7 88.8h70.1c56.1 0 70.1-25.7 70.1-49.1.1-16.3-11.6-39.7-53.7-39.7z\"]\n};\nvar faCreativeCommonsPd = {\n prefix: 'fab',\n iconName: 'creative-commons-pd',\n icon: [496, 512, [], \"f4ec\", \"M248 8C111 8 0 119.1 0 256c0 137 111 248 248 248s248-111 248-248C496 119.1 385 8 248 8zm0 449.5c-139.2 0-235.8-138-190.2-267.9l78.8 35.1c-2.1 10.5-3.3 21.5-3.3 32.9 0 99 73.9 126.9 120.4 126.9 22.9 0 53.5-6.7 79.4-29.5L297 311.1c-5.5 6.3-17.6 16.7-36.3 16.7-37.8 0-53.7-39.9-53.9-71.9 230.4 102.6 216.5 96.5 217.9 96.8-34.3 62.4-100.6 104.8-176.7 104.8zm194.2-150l-224-100c18.8-34 54.9-30.7 74.7-11l40.4-41.6c-27.1-23.3-58-27.5-78.1-27.5-47.4 0-80.9 20.5-100.7 51.6l-74.9-33.4c36.1-54.9 98.1-91.2 168.5-91.2 111.1 0 201.5 90.4 201.5 201.5 0 18-2.4 35.4-6.8 52-.3-.1-.4-.2-.6-.4z\"]\n};\nvar faPlaystation = {\n prefix: 'fab',\n iconName: 'playstation',\n icon: [576, 512, [], \"f3df\", \"M570.9 372.3c-11.3 14.2-38.8 24.3-38.8 24.3L327 470.2v-54.3l150.9-53.8c17.1-6.1 19.8-14.8 5.8-19.4-13.9-4.6-39.1-3.3-56.2 2.9L327 381.1v-56.4c23.2-7.8 47.1-13.6 75.7-16.8 40.9-4.5 90.9.6 130.2 15.5 44.2 14 49.2 34.7 38 48.9zm-224.4-92.5v-139c0-16.3-3-31.3-18.3-35.6-11.7-3.8-19 7.1-19 23.4v347.9l-93.8-29.8V32c39.9 7.4 98 24.9 129.2 35.4C424.1 94.7 451 128.7 451 205.2c0 74.5-46 102.8-104.5 74.6zM43.2 410.2c-45.4-12.8-53-39.5-32.3-54.8 19.1-14.2 51.7-24.9 51.7-24.9l134.5-47.8v54.5l-96.8 34.6c-17.1 6.1-19.7 14.8-5.8 19.4 13.9 4.6 39.1 3.3 56.2-2.9l46.4-16.9v48.8c-51.6 9.3-101.4 7.3-153.9-10z\"]\n};\nvar faQuinscape = {\n prefix: 'fab',\n iconName: 'quinscape',\n icon: [512, 512, [], \"f459\", \"M313.6 474.6h-1a158.1 158.1 0 0 1 0-316.2c94.9 0 168.2 83.1 157 176.6 4 5.1 8.2 9.6 11.2 15.3 13.4-30.3 20.3-62.4 20.3-97.7C501.1 117.5 391.6 8 256.5 8S12 117.5 12 252.6s109.5 244.6 244.5 244.6a237.36 237.36 0 0 0 70.4-10.1c-5.2-3.5-8.9-8.1-13.3-12.5zm-.1-.1l.4.1zm78.4-168.9a99.2 99.2 0 1 0 99.2 99.2 99.18 99.18 0 0 0-99.2-99.2z\"]\n};\nvar faLess = {\n prefix: 'fab',\n iconName: 'less',\n icon: [640, 512, [], \"f41d\", \"M612.7 219c0-20.5 3.2-32.6 3.2-54.6 0-34.2-12.6-45.2-40.5-45.2h-20.5v24.2h6.3c14.2 0 17.3 4.7 17.3 22.1 0 16.3-1.6 32.6-1.6 51.5 0 24.2 7.9 33.6 23.6 37.3v1.6c-15.8 3.7-23.6 13.1-23.6 37.3 0 18.9 1.6 34.2 1.6 51.5 0 17.9-3.7 22.6-17.3 22.6v.5h-6.3V393h20.5c27.8 0 40.5-11 40.5-45.2 0-22.6-3.2-34.2-3.2-54.6 0-11 6.8-22.6 27.3-23.6v-27.3c-20.5-.7-27.3-12.3-27.3-23.3zm-105.6 32c-15.8-6.3-30.5-10-30.5-20.5 0-7.9 6.3-12.6 17.9-12.6s22.1 4.7 33.6 13.1l21-27.8c-13.1-10-31-20.5-55.2-20.5-35.7 0-59.9 20.5-59.9 49.4 0 25.7 22.6 38.9 41.5 46.2 16.3 6.3 32.1 11.6 32.1 22.1 0 7.9-6.3 13.1-20.5 13.1-13.1 0-26.3-5.3-40.5-16.3l-21 30.5c15.8 13.1 39.9 22.1 59.9 22.1 42 0 64.6-22.1 64.6-51s-22.5-41-43-47.8zm-358.9 59.4c-3.7 0-8.4-3.2-8.4-13.1V119.1H65.2c-28.4 0-41 11-41 45.2 0 22.6 3.2 35.2 3.2 54.6 0 11-6.8 22.6-27.3 23.6v27.3c20.5.5 27.3 12.1 27.3 23.1 0 19.4-3.2 31-3.2 53.6 0 34.2 12.6 45.2 40.5 45.2h20.5v-24.2h-6.3c-13.1 0-17.3-5.3-17.3-22.6s1.6-32.1 1.6-51.5c0-24.2-7.9-33.6-23.6-37.3v-1.6c15.8-3.7 23.6-13.1 23.6-37.3 0-18.9-1.6-34.2-1.6-51.5s3.7-22.1 17.3-22.1H93v150.8c0 32.1 11 53.1 43.1 53.1 10 0 17.9-1.6 23.6-3.7l-5.3-34.2c-3.1.8-4.6.8-6.2.8zM379.9 251c-16.3-6.3-31-10-31-20.5 0-7.9 6.3-12.6 17.9-12.6 11.6 0 22.1 4.7 33.6 13.1l21-27.8c-13.1-10-31-20.5-55.2-20.5-35.7 0-59.9 20.5-59.9 49.4 0 25.7 22.6 38.9 41.5 46.2 16.3 6.3 32.1 11.6 32.1 22.1 0 7.9-6.3 13.1-20.5 13.1-13.1 0-26.3-5.3-40.5-16.3l-20.5 30.5c15.8 13.1 39.9 22.1 59.9 22.1 42 0 64.6-22.1 64.6-51 .1-28.9-22.5-41-43-47.8zm-155-68.8c-38.4 0-75.1 32.1-74.1 82.5 0 52 34.2 82.5 79.3 82.5 18.9 0 39.9-6.8 56.2-17.9l-15.8-27.8c-11.6 6.8-22.6 10-34.2 10-21 0-37.3-10-41.5-34.2H290c.5-3.7 1.6-11 1.6-19.4.6-42.6-22.6-75.7-66.7-75.7zm-30 66.2c3.2-21 15.8-31 30.5-31 18.9 0 26.3 13.1 26.3 31h-56.8z\"]\n};\nvar faBloggerB = {\n prefix: 'fab',\n iconName: 'blogger-b',\n icon: [448, 512, [], \"f37d\", \"M446.6 222.7c-1.8-8-6.8-15.4-12.5-18.5-1.8-1-13-2.2-25-2.7-20.1-.9-22.3-1.3-28.7-5-10.1-5.9-12.8-12.3-12.9-29.5-.1-33-13.8-63.7-40.9-91.3-19.3-19.7-40.9-33-65.5-40.5-5.9-1.8-19.1-2.4-63.3-2.9-69.4-.8-84.8.6-108.4 10C45.9 59.5 14.7 96.1 3.3 142.9 1.2 151.7.7 165.8.2 246.8c-.6 101.5.1 116.4 6.4 136.5 15.6 49.6 59.9 86.3 104.4 94.3 14.8 2.7 197.3 3.3 216 .8 32.5-4.4 58-17.5 81.9-41.9 17.3-17.7 28.1-36.8 35.2-62.1 4.9-17.6 4.5-142.8 2.5-151.7zm-322.1-63.6c7.8-7.9 10-8.2 58.8-8.2 43.9 0 45.4.1 51.8 3.4 9.3 4.7 13.4 11.3 13.4 21.9 0 9.5-3.8 16.2-12.3 21.6-4.6 2.9-7.3 3.1-50.3 3.3-26.5.2-47.7-.4-50.8-1.2-16.6-4.7-22.8-28.5-10.6-40.8zm191.8 199.8l-14.9 2.4-77.5.9c-68.1.8-87.3-.4-90.9-2-7.1-3.1-13.8-11.7-14.9-19.4-1.1-7.3 2.6-17.3 8.2-22.4 7.1-6.4 10.2-6.6 97.3-6.7 89.6-.1 89.1-.1 97.6 7.8 12.1 11.3 9.5 31.2-4.9 39.4z\"]\n};\nvar faOpencart = {\n prefix: 'fab',\n iconName: 'opencart',\n icon: [640, 512, [], \"f23d\", \"M423.3 440.7c0 25.3-20.3 45.6-45.6 45.6s-45.8-20.3-45.8-45.6 20.6-45.8 45.8-45.8c25.4 0 45.6 20.5 45.6 45.8zm-253.9-45.8c-25.3 0-45.6 20.6-45.6 45.8s20.3 45.6 45.6 45.6 45.8-20.3 45.8-45.6-20.5-45.8-45.8-45.8zm291.7-270C158.9 124.9 81.9 112.1 0 25.7c34.4 51.7 53.3 148.9 373.1 144.2 333.3-5 130 86.1 70.8 188.9 186.7-166.7 319.4-233.9 17.2-233.9z\"]\n};\nvar faVine = {\n prefix: 'fab',\n iconName: 'vine',\n icon: [384, 512, [], \"f1ca\", \"M384 254.7v52.1c-18.4 4.2-36.9 6.1-52.1 6.1-36.9 77.4-103 143.8-125.1 156.2-14 7.9-27.1 8.4-42.7-.8C137 452 34.2 367.7 0 102.7h74.5C93.2 261.8 139 343.4 189.3 404.5c27.9-27.9 54.8-65.1 75.6-106.9-49.8-25.3-80.1-80.9-80.1-145.6 0-65.6 37.7-115.1 102.2-115.1 114.9 0 106.2 127.9 81.6 181.5 0 0-46.4 9.2-63.5-20.5 3.4-11.3 8.2-30.8 8.2-48.5 0-31.3-11.3-46.6-28.4-46.6-18.2 0-30.8 17.1-30.8 50 .1 79.2 59.4 118.7 129.9 101.9z\"]\n};\nvar faPaypal = {\n prefix: 'fab',\n iconName: 'paypal',\n icon: [384, 512, [], \"f1ed\", \"M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9 152.3 0 165.1-3.7 204 11.4 60.1 23.3 65.6 79.5 44 140.3-21.5 62.6-72.5 89.5-140.1 90.3-43.4.7-69.5-7-75.3 24.2zM357.1 152c-1.8-1.3-2.5-1.8-3 1.3-2 11.4-5.1 22.5-8.8 33.6-39.9 113.8-150.5 103.9-204.5 103.9-6.1 0-10.1 3.3-10.9 9.4-22.6 140.4-27.1 169.7-27.1 169.7-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9.7-5.4-1.1 6.1 14.4-91.3 4.6-22 14.3-19.7 29.3-19.7 71 0 126.4-28.8 142.9-112.3 6.5-34.8 4.6-71.4-23.8-92.6z\"]\n};\nvar faGitlab = {\n prefix: 'fab',\n iconName: 'gitlab',\n icon: [512, 512, [], \"f296\", \"M503.5 204.6L502.8 202.8L433.1 21.02C431.7 17.45 429.2 14.43 425.9 12.38C423.5 10.83 420.8 9.865 417.9 9.57C415 9.275 412.2 9.653 409.5 10.68C406.8 11.7 404.4 13.34 402.4 15.46C400.5 17.58 399.1 20.13 398.3 22.9L351.3 166.9H160.8L113.7 22.9C112.9 20.13 111.5 17.59 109.6 15.47C107.6 13.35 105.2 11.72 102.5 10.7C99.86 9.675 96.98 9.295 94.12 9.587C91.26 9.878 88.51 10.83 86.08 12.38C82.84 14.43 80.33 17.45 78.92 21.02L9.267 202.8L8.543 204.6C-1.484 230.8-2.72 259.6 5.023 286.6C12.77 313.5 29.07 337.3 51.47 354.2L51.74 354.4L52.33 354.8L158.3 434.3L210.9 474L242.9 498.2C246.6 500.1 251.2 502.5 255.9 502.5C260.6 502.5 265.2 500.1 268.9 498.2L300.9 474L353.5 434.3L460.2 354.4L460.5 354.1C482.9 337.2 499.2 313.5 506.1 286.6C514.7 259.6 513.5 230.8 503.5 204.6z\"]\n};\nvar faTypo3 = {\n prefix: 'fab',\n iconName: 'typo3',\n icon: [448, 512, [], \"f42b\", \"M178.7 78.4c0-24.7 5.4-32.4 13.9-39.4-69.5 8.5-149.3 34-176.3 66.4-5.4 7.7-9.3 20.8-9.3 37.1C7 246 113.8 480 191.1 480c36.3 0 97.3-59.5 146.7-139-7 2.3-11.6 2.3-18.5 2.3-57.2 0-140.6-198.5-140.6-264.9zM301.5 32c-30.1 0-41.7 5.4-41.7 36.3 0 66.4 53.8 198.5 101.7 198.5 26.3 0 78.8-99.7 78.8-182.3 0-40.9-67-52.5-138.8-52.5z\"]\n};\nvar faRedditAlien = {\n prefix: 'fab',\n iconName: 'reddit-alien',\n icon: [512, 512, [], \"f281\", \"M440.3 203.5c-15 0-28.2 6.2-37.9 15.9-35.7-24.7-83.8-40.6-137.1-42.3L293 52.3l88.2 19.8c0 21.6 17.6 39.2 39.2 39.2 22 0 39.7-18.1 39.7-39.7s-17.6-39.7-39.7-39.7c-15.4 0-28.7 9.3-35.3 22l-97.4-21.6c-4.9-1.3-9.7 2.2-11 7.1L246.3 177c-52.9 2.2-100.5 18.1-136.3 42.8-9.7-10.1-23.4-16.3-38.4-16.3-55.6 0-73.8 74.6-22.9 100.1-1.8 7.9-2.6 16.3-2.6 24.7 0 83.8 94.4 151.7 210.3 151.7 116.4 0 210.8-67.9 210.8-151.7 0-8.4-.9-17.2-3.1-25.1 49.9-25.6 31.5-99.7-23.8-99.7zM129.4 308.9c0-22 17.6-39.7 39.7-39.7 21.6 0 39.2 17.6 39.2 39.7 0 21.6-17.6 39.2-39.2 39.2-22 .1-39.7-17.6-39.7-39.2zm214.3 93.5c-36.4 36.4-139.1 36.4-175.5 0-4-3.5-4-9.7 0-13.7 3.5-3.5 9.7-3.5 13.2 0 27.8 28.5 120 29 149 0 3.5-3.5 9.7-3.5 13.2 0 4.1 4 4.1 10.2.1 13.7zm-.8-54.2c-21.6 0-39.2-17.6-39.2-39.2 0-22 17.6-39.7 39.2-39.7 22 0 39.7 17.6 39.7 39.7-.1 21.5-17.7 39.2-39.7 39.2z\"]\n};\nvar faYahoo = {\n prefix: 'fab',\n iconName: 'yahoo',\n icon: [512, 512, [], \"f19e\", \"M223.69,141.06,167,284.23,111,141.06H14.93L120.76,390.19,82.19,480h94.17L317.27,141.06Zm105.4,135.79a58.22,58.22,0,1,0,58.22,58.22A58.22,58.22,0,0,0,329.09,276.85ZM394.65,32l-93,223.47H406.44L499.07,32Z\"]\n};\nvar faDailymotion = {\n prefix: 'fab',\n iconName: 'dailymotion',\n icon: [448, 512, [], \"e052\", \"M298.93,267a48.4,48.4,0,0,0-24.36-6.21q-19.83,0-33.44,13.27t-13.61,33.42q0,21.16,13.28,34.6t33.43,13.44q20.5,0,34.11-13.78T322,307.47A47.13,47.13,0,0,0,315.9,284,44.13,44.13,0,0,0,298.93,267ZM0,32V480H448V32ZM374.71,405.26h-53.1V381.37h-.67q-15.79,26.2-55.78,26.2-27.56,0-48.89-13.1a88.29,88.29,0,0,1-32.94-35.77q-11.6-22.68-11.59-50.89,0-27.56,11.76-50.22a89.9,89.9,0,0,1,32.93-35.78q21.18-13.09,47.72-13.1a80.87,80.87,0,0,1,29.74,5.21q13.28,5.21,25,17V153l55.79-12.09Z\"]\n};\nvar faAffiliatetheme = {\n prefix: 'fab',\n iconName: 'affiliatetheme',\n icon: [512, 512, [], \"f36b\", \"M159.7 237.4C108.4 308.3 43.1 348.2 14 326.6-15.2 304.9 2.8 230 54.2 159.1c51.3-70.9 116.6-110.8 145.7-89.2 29.1 21.6 11.1 96.6-40.2 167.5zm351.2-57.3C437.1 303.5 319 367.8 246.4 323.7c-25-15.2-41.3-41.2-49-73.8-33.6 64.8-92.8 113.8-164.1 133.2 49.8 59.3 124.1 96.9 207 96.9 150 0 271.6-123.1 271.6-274.9.1-8.5-.3-16.8-1-25z\"]\n};\nvar faPiedPiperPp = {\n prefix: 'fab',\n iconName: 'pied-piper-pp',\n icon: [448, 512, [], \"f1a7\", \"M205.3 174.6c0 21.1-14.2 38.1-31.7 38.1-7.1 0-12.8-1.2-17.2-3.7v-68c4.4-2.7 10.1-4.2 17.2-4.2 17.5 0 31.7 16.9 31.7 37.8zm52.6 67c-7.1 0-12.8 1.5-17.2 4.2v68c4.4 2.5 10.1 3.7 17.2 3.7 17.4 0 31.7-16.9 31.7-37.8 0-21.1-14.3-38.1-31.7-38.1zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM185 255.1c41 0 74.2-35.6 74.2-79.6 0-44-33.2-79.6-74.2-79.6-12 0-24.1 3.2-34.6 8.8h-45.7V311l51.8-10.1v-50.6c8.6 3.1 18.1 4.8 28.5 4.8zm158.4 25.3c0-44-33.2-79.6-73.9-79.6-3.2 0-6.4.2-9.6.7-3.7 12.5-10.1 23.8-19.2 33.4-13.8 15-32.2 23.8-51.8 24.8V416l51.8-10.1v-50.6c8.6 3.2 18.2 4.7 28.7 4.7 40.8 0 74-35.6 74-79.6z\"]\n};\nvar faBootstrap = {\n prefix: 'fab',\n iconName: 'bootstrap',\n icon: [576, 512, [], \"f836\", \"M333.5,201.4c0-22.1-15.6-34.3-43-34.3h-50.4v71.2h42.5C315.4,238.2,333.5,225,333.5,201.4z M517,188.6 c-9.5-30.9-10.9-68.8-9.8-98.1c1.1-30.5-22.7-58.5-54.7-58.5H123.7c-32.1,0-55.8,28.1-54.7,58.5c1,29.3-0.3,67.2-9.8,98.1 c-9.6,31-25.7,50.6-52.2,53.1v28.5c26.4,2.5,42.6,22.1,52.2,53.1c9.5,30.9,10.9,68.8,9.8,98.1c-1.1,30.5,22.7,58.5,54.7,58.5h328.7 c32.1,0,55.8-28.1,54.7-58.5c-1-29.3,0.3-67.2,9.8-98.1c9.6-31,25.7-50.6,52.1-53.1v-28.5C542.7,239.2,526.5,219.6,517,188.6z M300.2,375.1h-97.9V136.8h97.4c43.3,0,71.7,23.4,71.7,59.4c0,25.3-19.1,47.9-43.5,51.8v1.3c33.2,3.6,55.5,26.6,55.5,58.3 C383.4,349.7,352.1,375.1,300.2,375.1z M290.2,266.4h-50.1v78.4h52.3c34.2,0,52.3-13.7,52.3-39.5 C344.7,279.6,326.1,266.4,290.2,266.4z\"]\n};\nvar faOdnoklassniki = {\n prefix: 'fab',\n iconName: 'odnoklassniki',\n icon: [320, 512, [], \"f263\", \"M275.1 334c-27.4 17.4-65.1 24.3-90 26.9l20.9 20.6 76.3 76.3c27.9 28.6-17.5 73.3-45.7 45.7-19.1-19.4-47.1-47.4-76.3-76.6L84 503.4c-28.2 27.5-73.6-17.6-45.4-45.7 19.4-19.4 47.1-47.4 76.3-76.3l20.6-20.6c-24.6-2.6-62.9-9.1-90.6-26.9-32.6-21-46.9-33.3-34.3-59 7.4-14.6 27.7-26.9 54.6-5.7 0 0 36.3 28.9 94.9 28.9s94.9-28.9 94.9-28.9c26.9-21.1 47.1-8.9 54.6 5.7 12.4 25.7-1.9 38-34.5 59.1zM30.3 129.7C30.3 58 88.6 0 160 0s129.7 58 129.7 129.7c0 71.4-58.3 129.4-129.7 129.4s-129.7-58-129.7-129.4zm66 0c0 35.1 28.6 63.7 63.7 63.7s63.7-28.6 63.7-63.7c0-35.4-28.6-64-63.7-64s-63.7 28.6-63.7 64z\"]\n};\nvar faNfcSymbol = {\n prefix: 'fab',\n iconName: 'nfc-symbol',\n icon: [576, 512, [], \"e531\", \"M392.9 32.43C400.6 31.1 408.6 32.89 414.1 37.41C498.2 96.14 544 173.7 544 255.1C544 338.2 498.2 415.9 414.1 474.6C409.3 478.6 402.4 480.5 395.5 479.9C388.5 479.3 382 476.3 377.1 471.4L193.7 288.7C188.1 283.2 185 275.7 184.1 267.8C184.1 260 188.1 252.5 193.6 246.9C199.2 241.4 206.7 238.2 214.5 238.2C222.4 238.2 229.9 241.3 235.4 246.8L400.5 411.2C455.1 366.5 484.8 312 484.8 255.1C484.8 193.5 447.9 132.9 380.9 85.76C374.5 81.24 370.1 74.35 368.8 66.62C367.4 58.89 369.2 50.94 373.8 44.53C378.3 38.12 385.2 33.77 392.9 32.43V32.43zM186.9 479.6C179.2 480.9 171.3 479.1 164.8 474.6C81.67 415.9 35.84 338.2 35.84 255.1C35.84 173.7 81.67 96.14 164.8 37.41C170.5 33.4 177.4 31.53 184.4 32.12C191.3 32.71 197.8 35.72 202.7 40.63L386.1 223.3C391.7 228.8 394.8 236.3 394.8 244.2C394.9 251.1 391.8 259.5 386.2 265.1C380.7 270.6 373.2 273.8 365.3 273.8C357.5 273.8 349.1 270.7 344.4 265.2L179.3 100.7C124.7 145.9 95.03 199.9 95.03 255.1C95.03 318.5 131.9 379.1 198.1 426.2C205.4 430.8 209.7 437.6 211.1 445.4C212.4 453.1 210.6 461.1 206.1 467.5C201.6 473.9 194.7 478.2 186.9 479.6V479.6z\"]\n};\nvar faEthereum = {\n prefix: 'fab',\n iconName: 'ethereum',\n icon: [320, 512, [], \"f42e\", \"M311.9 260.8L160 353.6 8 260.8 160 0l151.9 260.8zM160 383.4L8 290.6 160 512l152-221.4-152 92.8z\"]\n};\nvar faSpeakerDeck = {\n prefix: 'fab',\n iconName: 'speaker-deck',\n icon: [512, 512, [], \"f83c\", \"M213.86 296H100a100 100 0 0 1 0-200h132.84a40 40 0 0 1 0 80H98c-26.47 0-26.45 40 0 40h113.82a100 100 0 0 1 0 200H40a40 40 0 0 1 0-80h173.86c26.48 0 26.46-40 0-40zM298 416a120.21 120.21 0 0 0 51.11-80h64.55a19.83 19.83 0 0 0 19.66-20V196a19.83 19.83 0 0 0-19.66-20H296.42a60.77 60.77 0 0 0 0-80h136.93c43.44 0 78.65 35.82 78.65 80v160c0 44.18-35.21 80-78.65 80z\"]\n};\nvar faCreativeCommonsNcEu = {\n prefix: 'fab',\n iconName: 'creative-commons-nc-eu',\n icon: [496, 512, [], \"f4e9\", \"M247.7 8C103.6 8 0 124.8 0 256c0 136.3 111.7 248 247.7 248C377.9 504 496 403.1 496 256 496 117 388.4 8 247.7 8zm.6 450.7c-112 0-203.6-92.5-203.6-202.7 0-23.2 3.7-45.2 10.9-66l65.7 29.1h-4.7v29.5h23.3c0 6.2-.4 3.2-.4 19.5h-22.8v29.5h27c11.4 67 67.2 101.3 124.6 101.3 26.6 0 50.6-7.9 64.8-15.8l-10-46.1c-8.7 4.6-28.2 10.8-47.3 10.8-28.2 0-58.1-10.9-67.3-50.2h90.3l128.3 56.8c-1.5 2.1-56.2 104.3-178.8 104.3zm-16.7-190.6l-.5-.4.9.4h-.4zm77.2-19.5h3.7v-29.5h-70.3l-28.6-12.6c2.5-5.5 5.4-10.5 8.8-14.3 12.9-15.8 31.1-22.4 51.1-22.4 18.3 0 35.3 5.4 46.1 10l11.6-47.3c-15-6.6-37-12.4-62.3-12.4-39 0-72.2 15.8-95.9 42.3-5.3 6.1-9.8 12.9-13.9 20.1l-81.6-36.1c64.6-96.8 157.7-93.6 170.7-93.6 113 0 203 90.2 203 203.4 0 18.7-2.1 36.3-6.3 52.9l-136.1-60.5z\"]\n};\nvar faPatreon = {\n prefix: 'fab',\n iconName: 'patreon',\n icon: [512, 512, [], \"f3d9\", \"M512 194.8c0 101.3-82.4 183.8-183.8 183.8-101.7 0-184.4-82.4-184.4-183.8 0-101.6 82.7-184.3 184.4-184.3C429.6 10.5 512 93.2 512 194.8zM0 501.5h90v-491H0v491z\"]\n};\nvar faAvianex = {\n prefix: 'fab',\n iconName: 'avianex',\n icon: [512, 512, [], \"f374\", \"M453.1 32h-312c-38.9 0-76.2 31.2-83.3 69.7L1.2 410.3C-5.9 448.8 19.9 480 58.9 480h312c38.9 0 76.2-31.2 83.3-69.7l56.7-308.5c7-38.6-18.8-69.8-57.8-69.8zm-58.2 347.3l-32 13.5-115.4-110c-14.7 10-29.2 19.5-41.7 27.1l22.1 64.2-17.9 12.7-40.6-61-52.4-48.1 15.7-15.4 58 31.1c9.3-10.5 20.8-22.6 32.8-34.9L203 228.9l-68.8-99.8 18.8-28.9 8.9-4.8L265 207.8l4.9 4.5c19.4-18.8 33.8-32.4 33.8-32.4 7.7-6.5 21.5-2.9 30.7 7.9 9 10.5 10.6 24.7 2.7 31.3-1.8 1.3-15.5 11.4-35.3 25.6l4.5 7.3 94.9 119.4-6.3 7.9z\"]\n};\nvar faEllo = {\n prefix: 'fab',\n iconName: 'ello',\n icon: [496, 512, [], \"f5f1\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm143.84 285.2C375.31 358.51 315.79 404.8 248 404.8s-127.31-46.29-143.84-111.6c-1.65-7.44 2.48-15.71 9.92-17.36 7.44-1.65 15.71 2.48 17.36 9.92 14.05 52.91 62 90.11 116.56 90.11s102.51-37.2 116.56-90.11c1.65-7.44 9.92-12.4 17.36-9.92 7.44 1.65 12.4 9.92 9.92 17.36z\"]\n};\nvar faGofore = {\n prefix: 'fab',\n iconName: 'gofore',\n icon: [400, 512, [], \"f3a7\", \"M324 319.8h-13.2v34.7c-24.5 23.1-56.3 35.8-89.9 35.8-73.2 0-132.4-60.2-132.4-134.4 0-74.1 59.2-134.4 132.4-134.4 35.3 0 68.6 14 93.6 39.4l62.3-63.3C335 55.3 279.7 32 220.7 32 98 32 0 132.6 0 256c0 122.5 97 224 220.7 224 63.2 0 124.5-26.2 171-82.5-2-27.6-13.4-77.7-67.7-77.7zm-12.1-112.5H205.6v89H324c33.5 0 60.5 15.1 76 41.8v-30.6c0-65.2-40.4-100.2-88.1-100.2z\"]\n};\nvar faBimobject = {\n prefix: 'fab',\n iconName: 'bimobject',\n icon: [448, 512, [], \"f378\", \"M416 32H32C14.4 32 0 46.4 0 64v384c0 17.6 14.4 32 32 32h384c17.6 0 32-14.4 32-32V64c0-17.6-14.4-32-32-32zm-64 257.4c0 49.4-11.4 82.6-103.8 82.6h-16.9c-44.1 0-62.4-14.9-70.4-38.8h-.9V368H96V136h64v74.7h1.1c4.6-30.5 39.7-38.8 69.7-38.8h17.3c92.4 0 103.8 33.1 103.8 82.5v35zm-64-28.9v22.9c0 21.7-3.4 33.8-38.4 33.8h-45.3c-28.9 0-44.1-6.5-44.1-35.7v-19c0-29.3 15.2-35.7 44.1-35.7h45.3c35-.2 38.4 12 38.4 33.7z\"]\n};\nvar faFacebookF = {\n prefix: 'fab',\n iconName: 'facebook-f',\n icon: [320, 512, [], \"f39e\", \"M279.14 288l14.22-92.66h-88.91v-60.13c0-25.35 12.42-50.06 52.24-50.06h40.42V6.26S260.43 0 225.36 0c-73.22 0-121.08 44.38-121.08 124.72v70.62H22.89V288h81.39v224h100.17V288z\"]\n};\nvar faSquareGooglePlus = {\n prefix: 'fab',\n iconName: 'square-google-plus',\n icon: [448, 512, [\"google-plus-square\"], \"f0d4\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM164 356c-55.3 0-100-44.7-100-100s44.7-100 100-100c27 0 49.5 9.8 67 26.2l-27.1 26.1c-7.4-7.1-20.3-15.4-39.8-15.4-34.1 0-61.9 28.2-61.9 63.2 0 34.9 27.8 63.2 61.9 63.2 39.6 0 54.4-28.5 56.8-43.1H164v-34.4h94.4c1 5 1.6 10.1 1.6 16.6 0 57.1-38.3 97.6-96 97.6zm220-81.8h-29v29h-29.2v-29h-29V245h29v-29H355v29h29v29.2z\"]\n};\nvar faGooglePlusSquare = faSquareGooglePlus;\nvar faMandalorian = {\n prefix: 'fab',\n iconName: 'mandalorian',\n icon: [448, 512, [], \"f50f\", \"M232.27 511.89c-1-3.26-1.69-15.83-1.39-24.58.55-15.89 1-24.72 1.4-28.76.64-6.2 2.87-20.72 3.28-21.38.6-1 .4-27.87-.24-33.13-.31-2.58-.63-11.9-.69-20.73-.13-16.47-.53-20.12-2.73-24.76-1.1-2.32-1.23-3.84-1-11.43a92.38 92.38 0 0 0-.34-12.71c-2-13-3.46-27.7-3.25-33.9s.43-7.15 2.06-9.67c3.05-4.71 6.51-14 8.62-23.27 2.26-9.86 3.88-17.18 4.59-20.74a109.54 109.54 0 0 1 4.42-15.05c2.27-6.25 2.49-15.39.37-15.39-.3 0-1.38 1.22-2.41 2.71s-4.76 4.8-8.29 7.36c-8.37 6.08-11.7 9.39-12.66 12.58s-1 7.23-.16 7.76c.34.21 1.29 2.4 2.11 4.88a28.83 28.83 0 0 1 .72 15.36c-.39 1.77-1 5.47-1.46 8.23s-1 6.46-1.25 8.22a9.85 9.85 0 0 1-1.55 4.26c-1 1-1.14.91-2.05-.53a14.87 14.87 0 0 1-1.44-4.75c-.25-1.74-1.63-7.11-3.08-11.93-3.28-10.9-3.52-16.15-1-21a14.24 14.24 0 0 0 1.67-4.61c0-2.39-2.2-5.32-7.41-9.89-7-6.18-8.63-7.92-10.23-11.3-1.71-3.6-3.06-4.06-4.54-1.54-1.78 3-2.6 9.11-3 22l-.34 12.19 2 2.25c3.21 3.7 12.07 16.45 13.78 19.83 3.41 6.74 4.34 11.69 4.41 23.56s.95 22.75 2 24.71c.36.66.51 1.35.34 1.52s.41 2.09 1.29 4.27a38.14 38.14 0 0 1 2.06 9 91 91 0 0 0 1.71 10.37c2.23 9.56 2.77 14.08 2.39 20.14-.2 3.27-.53 11.07-.73 17.32-1.31 41.76-1.85 58-2 61.21-.12 2-.39 11.51-.6 21.07-.36 16.3-1.3 27.37-2.42 28.65-.64.73-8.07-4.91-12.52-9.49-3.75-3.87-4-4.79-2.83-9.95.7-3 2.26-18.29 3.33-32.62.36-4.78.81-10.5 1-12.71.83-9.37 1.66-20.35 2.61-34.78.56-8.46 1.33-16.44 1.72-17.73s.89-9.89 1.13-19.11l.43-16.77-2.26-4.3c-1.72-3.28-4.87-6.94-13.22-15.34-6-6.07-11.84-12.3-12.91-13.85l-1.95-2.81.75-10.9c1.09-15.71 1.1-48.57 0-59.06l-.89-8.7-3.28-4.52c-5.86-8.08-5.8-7.75-6.22-33.27-.1-6.07-.38-11.5-.63-12.06-.83-1.87-3.05-2.66-8.54-3.05-8.86-.62-11-1.9-23.85-14.55-6.15-6-12.34-12-13.75-13.19-2.81-2.42-2.79-2-.56-9.63l1.35-4.65-1.69-3a32.22 32.22 0 0 0-2.59-4.07c-1.33-1.51-5.5-10.89-6-13.49a4.24 4.24 0 0 1 .87-3.9c2.23-2.86 3.4-5.68 4.45-10.73 2.33-11.19 7.74-26.09 10.6-29.22 3.18-3.47 7.7-1 9.41 5 1.34 4.79 1.37 9.79.1 18.55a101.2 101.2 0 0 0-1 11.11c0 4 .19 4.69 2.25 7.39 3.33 4.37 7.73 7.41 15.2 10.52a18.67 18.67 0 0 1 4.72 2.85c11.17 10.72 18.62 16.18 22.95 16.85 5.18.8 8 4.54 10 13.39 1.31 5.65 4 11.14 5.46 11.14a9.38 9.38 0 0 0 3.33-1.39c2-1.22 2.25-1.73 2.25-4.18a132.88 132.88 0 0 0-2-17.84c-.37-1.66-.78-4.06-.93-5.35s-.61-3.85-1-5.69c-2.55-11.16-3.65-15.46-4.1-16-1.55-2-4.08-10.2-4.93-15.92-1.64-11.11-4-14.23-12.91-17.39A43.15 43.15 0 0 1 165.24 78c-1.15-1-4-3.22-6.35-5.06s-4.41-3.53-4.6-3.76a22.7 22.7 0 0 0-2.69-2c-6.24-4.22-8.84-7-11.26-12l-2.44-5-.22-13-.22-13 6.91-6.55c3.95-3.75 8.48-7.35 10.59-8.43 3.31-1.69 4.45-1.89 11.37-2 8.53-.19 10.12 0 11.66 1.56s1.36 6.4-.29 8.5a6.66 6.66 0 0 0-1.34 2.32c0 .58-2.61 4.91-5.42 9a30.39 30.39 0 0 0-2.37 6.82c20.44 13.39 21.55 3.77 14.07 29L194 66.92c3.11-8.66 6.47-17.26 8.61-26.22.29-7.63-12-4.19-15.4-8.68-2.33-5.93 3.13-14.18 6.06-19.2 1.6-2.34 6.62-4.7 8.82-4.15.88.22 4.16-.35 7.37-1.28a45.3 45.3 0 0 1 7.55-1.68 29.57 29.57 0 0 0 6-1.29c3.65-1.11 4.5-1.17 6.35-.4a29.54 29.54 0 0 0 5.82 1.36 18.18 18.18 0 0 1 6 1.91 22.67 22.67 0 0 0 5 2.17c2.51.68 3 .57 7.05-1.67l4.35-2.4L268.32 5c10.44-.4 10.81-.47 15.26-2.68L288.16 0l2.46 1.43c1.76 1 3.14 2.73 4.85 6 2.36 4.51 2.38 4.58 1.37 7.37-.88 2.44-.89 3.3-.1 6.39a35.76 35.76 0 0 0 2.1 5.91 13.55 13.55 0 0 1 1.31 4c.31 4.33 0 5.3-2.41 6.92-2.17 1.47-7 7.91-7 9.34a14.77 14.77 0 0 1-1.07 3c-5 11.51-6.76 13.56-14.26 17-9.2 4.2-12.3 5.19-16.21 5.19-3.1 0-4 .25-4.54 1.26a18.33 18.33 0 0 1-4.09 3.71 13.62 13.62 0 0 0-4.38 4.78 5.89 5.89 0 0 1-2.49 2.91 6.88 6.88 0 0 0-2.45 1.71 67.62 67.62 0 0 1-7 5.38c-3.33 2.34-6.87 5-7.87 6A7.27 7.27 0 0 1 224 100a5.76 5.76 0 0 0-2.13 1.65c-1.31 1.39-1.49 2.11-1.14 4.6a36.45 36.45 0 0 0 1.42 5.88c1.32 3.8 1.31 7.86 0 10.57s-.89 6.65 1.35 9.59c2 2.63 2.16 4.56.71 8.84a33.45 33.45 0 0 0-1.06 8.91c0 4.88.22 6.28 1.46 8.38s1.82 2.48 3.24 2.32c2-.23 2.3-1.05 4.71-12.12 2.18-10 3.71-11.92 13.76-17.08 2.94-1.51 7.46-4 10-5.44s6.79-3.69 9.37-4.91a40.09 40.09 0 0 0 15.22-11.67c7.11-8.79 10-16.22 12.85-33.3a18.37 18.37 0 0 1 2.86-7.73 20.39 20.39 0 0 0 2.89-7.31c1-5.3 2.85-9.08 5.58-11.51 4.7-4.18 6-1.09 4.59 10.87-.46 3.86-1.1 10.33-1.44 14.38l-.61 7.36 4.45 4.09 4.45 4.09.11 8.42c.06 4.63.47 9.53.92 10.89l.82 2.47-6.43 6.28c-8.54 8.33-12.88 13.93-16.76 21.61-1.77 3.49-3.74 7.11-4.38 8-2.18 3.11-6.46 13-8.76 20.26l-2.29 7.22-7 6.49c-3.83 3.57-8 7.25-9.17 8.17-3.05 2.32-4.26 5.15-4.26 10a14.62 14.62 0 0 0 1.59 7.26 42 42 0 0 1 2.09 4.83 9.28 9.28 0 0 0 1.57 2.89c1.4 1.59 1.92 16.12.83 23.22-.68 4.48-3.63 12-4.7 12-1.79 0-4.06 9.27-5.07 20.74-.18 2-.62 5.94-1 8.7s-1 10-1.35 16.05c-.77 12.22-.19 18.77 2 23.15 3.41 6.69.52 12.69-11 22.84l-4 3.49.07 5.19a40.81 40.81 0 0 0 1.14 8.87c4.61 16 4.73 16.92 4.38 37.13-.46 26.4-.26 40.27.63 44.15a61.31 61.31 0 0 1 1.08 7c.17 2 .66 5.33 1.08 7.36.47 2.26.78 11 .79 22.74v19.06l-1.81 2.63c-2.71 3.91-15.11 13.54-15.49 12.29zm29.53-45.11c-.18-.3-.33-6.87-.33-14.59 0-14.06-.89-27.54-2.26-34.45-.4-2-.81-9.7-.9-17.06-.15-11.93-1.4-24.37-2.64-26.38-.66-1.07-3-17.66-3-21.3 0-4.23 1-6 5.28-9.13s4.86-3.14 5.48-.72c.28 1.1 1.45 5.62 2.6 10 3.93 15.12 4.14 16.27 4.05 21.74-.1 5.78-.13 6.13-1.74 17.73-1 7.07-1.17 12.39-1 28.43.17 19.4-.64 35.73-2 41.27-.71 2.78-2.8 5.48-3.43 4.43zm-71-37.58a101 101 0 0 1-1.73-10.79 100.5 100.5 0 0 0-1.73-10.79 37.53 37.53 0 0 1-1-6.49c-.31-3.19-.91-7.46-1.33-9.48-1-4.79-3.35-19.35-3.42-21.07 0-.74-.34-4.05-.7-7.36-.67-6.21-.84-27.67-.22-28.29 1-1 6.63 2.76 11.33 7.43l5.28 5.25-.45 6.47c-.25 3.56-.6 10.23-.78 14.83s-.49 9.87-.67 11.71-.61 9.36-.94 16.72c-.79 17.41-1.94 31.29-2.65 32a.62.62 0 0 1-1-.14zm-87.18-266.59c21.07 12.79 17.84 14.15 28.49 17.66 13 4.29 18.87 7.13 23.15 16.87C111.6 233.28 86.25 255 78.55 268c-31 52-6 101.59 62.75 87.21-14.18 29.23-78 28.63-98.68-4.9-24.68-39.95-22.09-118.3 61-187.66zm210.79 179c56.66 6.88 82.32-37.74 46.54-89.23 0 0-26.87-29.34-64.28-68 3-15.45 9.49-32.12 30.57-53.82 89.2 63.51 92 141.61 92.46 149.36 4.3 70.64-78.7 91.18-105.29 61.71z\"]\n};\nvar faFirstOrderAlt = {\n prefix: 'fab',\n iconName: 'first-order-alt',\n icon: [496, 512, [], \"f50a\", \"M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm0 488.21C115.34 496.21 7.79 388.66 7.79 256S115.34 15.79 248 15.79 488.21 123.34 488.21 256 380.66 496.21 248 496.21zm0-459.92C126.66 36.29 28.29 134.66 28.29 256S126.66 475.71 248 475.71 467.71 377.34 467.71 256 369.34 36.29 248 36.29zm0 431.22c-116.81 0-211.51-94.69-211.51-211.51S131.19 44.49 248 44.49 459.51 139.19 459.51 256 364.81 467.51 248 467.51zm186.23-162.98a191.613 191.613 0 0 1-20.13 48.69l-74.13-35.88 61.48 54.82a193.515 193.515 0 0 1-37.2 37.29l-54.8-61.57 35.88 74.27a190.944 190.944 0 0 1-48.63 20.23l-27.29-78.47 4.79 82.93c-8.61 1.18-17.4 1.8-26.33 1.8s-17.72-.62-26.33-1.8l4.76-82.46-27.15 78.03a191.365 191.365 0 0 1-48.65-20.2l35.93-74.34-54.87 61.64a193.85 193.85 0 0 1-37.22-37.28l61.59-54.9-74.26 35.93a191.638 191.638 0 0 1-20.14-48.69l77.84-27.11-82.23 4.76c-1.16-8.57-1.78-17.32-1.78-26.21 0-9 .63-17.84 1.82-26.51l82.38 4.77-77.94-27.16a191.726 191.726 0 0 1 20.23-48.67l74.22 35.92-61.52-54.86a193.85 193.85 0 0 1 37.28-37.22l54.76 61.53-35.83-74.17a191.49 191.49 0 0 1 48.65-20.13l26.87 77.25-4.71-81.61c8.61-1.18 17.39-1.8 26.32-1.8s17.71.62 26.32 1.8l-4.74 82.16 27.05-77.76c17.27 4.5 33.6 11.35 48.63 20.17l-35.82 74.12 54.72-61.47a193.13 193.13 0 0 1 37.24 37.23l-61.45 54.77 74.12-35.86a191.515 191.515 0 0 1 20.2 48.65l-77.81 27.1 82.24-4.75c1.19 8.66 1.82 17.5 1.82 26.49 0 8.88-.61 17.63-1.78 26.19l-82.12-4.75 77.72 27.09z\"]\n};\nvar faOsi = {\n prefix: 'fab',\n iconName: 'osi',\n icon: [512, 512, [], \"f41a\", \"M8 266.44C10.3 130.64 105.4 34 221.8 18.34c138.8-18.6 255.6 75.8 278 201.1 21.3 118.8-44 230-151.6 274-9.3 3.8-14.4 1.7-18-7.7q-26.7-69.45-53.4-139c-3.1-8.1-1-13.2 7-16.8 24.2-11 39.3-29.4 43.3-55.8a71.47 71.47 0 0 0-64.5-82.2c-39-3.4-71.8 23.7-77.5 59.7-5.2 33 11.1 63.7 41.9 77.7 9.6 4.4 11.5 8.6 7.8 18.4q-26.85 69.9-53.7 139.9c-2.6 6.9-8.3 9.3-15.5 6.5-52.6-20.3-101.4-61-130.8-119-24.9-49.2-25.2-87.7-26.8-108.7zm20.9-1.9c.4 6.6.6 14.3 1.3 22.1 6.3 71.9 49.6 143.5 131 183.1 3.2 1.5 4.4.8 5.6-2.3q22.35-58.65 45-117.3c1.3-3.3.6-4.8-2.4-6.7-31.6-19.9-47.3-48.5-45.6-86 1-21.6 9.3-40.5 23.8-56.3 30-32.7 77-39.8 115.5-17.6a91.64 91.64 0 0 1 45.2 90.4c-3.6 30.6-19.3 53.9-45.7 69.8-2.7 1.6-3.5 2.9-2.3 6q22.8 58.8 45.2 117.7c1.2 3.1 2.4 3.8 5.6 2.3 35.5-16.6 65.2-40.3 88.1-72 34.8-48.2 49.1-101.9 42.3-161-13.7-117.5-119.4-214.8-255.5-198-106.1 13-195.3 102.5-197.1 225.8z\"]\n};\nvar faGoogleWallet = {\n prefix: 'fab',\n iconName: 'google-wallet',\n icon: [448, 512, [], \"f1ee\", \"M156.8 126.8c37.6 60.6 64.2 113.1 84.3 162.5-8.3 33.8-18.8 66.5-31.3 98.3-13.2-52.3-26.5-101.3-56-148.5 6.5-36.4 2.3-73.6 3-112.3zM109.3 200H16.1c-6.5 0-10.5 7.5-6.5 12.7C51.8 267 81.3 330.5 101.3 400h103.5c-16.2-69.7-38.7-133.7-82.5-193.5-3-4-8-6.5-13-6.5zm47.8-88c68.5 108 130 234.5 138.2 368H409c-12-138-68.4-265-143.2-368H157.1zm251.8-68.5c-1.8-6.8-8.2-11.5-15.2-11.5h-88.3c-5.3 0-9 5-7.8 10.3 13.2 46.5 22.3 95.5 26.5 146 48.2 86.2 79.7 178.3 90.6 270.8 15.8-60.5 25.3-133.5 25.3-203 0-73.6-12.1-145.1-31.1-212.6z\"]\n};\nvar faDAndDBeyond = {\n prefix: 'fab',\n iconName: 'd-and-d-beyond',\n icon: [640, 512, [], \"f6ca\", \"M313.8 241.5c13.8 0 21-10.1 24.8-17.9-1-1.1-5-4.2-7.4-6.6-2.4 4.3-8.2 10.7-13.9 10.7-10.2 0-15.4-14.7-3.2-26.6-.5-.2-4.3-1.8-8 2.4 0-3 1-5.1 2.1-6.6-3.5 1.3-9.8 5.6-11.4 7.9.2-5.8 1.6-7.5.6-9l-.2-.2s-8.5 5.6-9.3 14.7c0 0 1.1-1.6 2.1-1.9.6-.3 1.3 0 .6 1.9-.2.6-5.8 15.7 5.1 26-.6-1.6-1.9-7.6 2.4-1.9-.3.1 5.8 7.1 15.7 7.1zm52.4-21.1c0-4-4.9-4.4-5.6-4.5 2 3.9.9 7.5.2 9 2.5-.4 5.4-1.6 5.4-4.5zm10.3 5.2c0-6.4-6.2-11.4-13.5-10.7 8 1.3 5.6 13.8-5 11.4 3.7-2.6 3.2-9.9-1.3-12.5 1.4 4.2-3 8.2-7.4 4.6-2.4-1.9-8-6.6-10.6-8.6-2.4-2.1-5.5-1-6.6-1.8-1.3-1.1-.5-3.8-2.2-5-1.6-.8-3-.3-4.8-1-1.6-.6-2.7-1.9-2.6-3.5-2.5 4.4 3.4 6.3 4.5 8.5 1 1.9-.8 4.8 4 8.5 14.8 11.6 9.1 8 10.4 18.1.6 4.3 4.2 6.7 6.4 7.4-2.1-1.9-2.9-6.4 0-9.3 0 13.9 19.2 13.3 23.1 6.4-2.4 1.1-7-.2-9-1.9 7.7 1 14.2-4.1 14.6-10.6zm-39.4-18.4c2 .8 1.6.7 6.4 4.5 10.2-24.5 21.7-15.7 22-15.5 2.2-1.9 9.8-3.8 13.8-2.7-2.4-2.7-7.5-6.2-13.3-6.2-4.7 0-7.4 2.2-8 1.3-.8-1.4 3.2-3.4 3.2-3.4-5.4.2-9.6 6.7-11.2 5.9-1.1-.5 1.4-3.7 1.4-3.7-5.1 2.9-9.3 9.1-10.2 13 4.6-5.8 13.8-9.8 19.7-9-10.5.5-19.5 9.7-23.8 15.8zm242.5 51.9c-20.7 0-40 1.3-50.3 2.1l7.4 8.2v77.2l-7.4 8.2c10.4.8 30.9 2.1 51.6 2.1 42.1 0 59.1-20.7 59.1-48.9 0-29.3-23.2-48.9-60.4-48.9zm-15.1 75.6v-53.3c30.1-3.3 46.8 3.8 46.8 26.3 0 25.6-21.4 30.2-46.8 27zM301.6 181c-1-3.4-.2-6.9 1.1-9.4 1 3 2.6 6.4 7.5 9-.5-2.4-.2-5.6.5-8-1.4-5.4 2.1-9.9 6.4-9.9 6.9 0 8.5 8.8 4.7 14.4 2.1 3.2 5.5 5.6 7.7 7.8 3.2-3.7 5.5-9.5 5.5-13.8 0-8.2-5.5-15.9-16.7-16.5-20-.9-20.2 16.6-20 18.9.5 5.2 3.4 7.8 3.3 7.5zm-.4 6c-.5 1.8-7 3.7-10.2 6.9 4.8-1 7-.2 7.8 1.8.5 1.4-.2 3.4-.5 5.6 1.6-1.8 7-5.5 11-6.2-1-.3-3.4-.8-4.3-.8 2.9-3.4 9.3-4.5 12.8-3.7-2.2-.2-6.7 1.1-8.5 2.6 1.6.3 3 .6 4.3 1.1-2.1.8-4.8 3.4-5.8 6.1 7-5 13.1 5.2 7 8.2.8.2 2.7 0 3.5-.5-.3 1.1-1.9 3-3 3.4 2.9 0 7-1.9 8.2-4.6 0 0-1.8.6-2.6-.2s.3-4.3.3-4.3c-2.3 2.9-3.4-1.3-1.3-4.2-1-.3-3.5-.6-4.6-.5 3.2-1.1 10.4-1.8 11.2-.3.6 1.1-1 3.4-1 3.4 4-.5 8.3 1.1 6.7 5.1 2.9-1.4 5.5-5.9 4.8-10.4-.3 1-1.6 2.4-2.9 2.7.2-1.4-1-2.2-1.9-2.6 1.7-9.6-14.6-14.2-14.1-23.9-1 1.3-1.8 5-.8 7.1 2.7 3.2 8.7 6.7 10.1 12.2-2.6-6.4-15.1-11.4-14.6-20.2-1.6 1.6-2.6 7.8-1.3 11 2.4 1.4 4.5 3.8 4.8 6.1-2.2-5.1-11.4-6.1-13.9-12.2-.6 2.2-.3 5 1 6.7 0 0-2.2-.8-7-.6 1.7.6 5.1 3.5 4.8 5.2zm25.9 7.4c-2.7 0-3.5-2.1-4.2-4.3 3.3 1.3 4.2 4.3 4.2 4.3zm38.9 3.7l-1-.6c-1.1-1-2.9-1.4-4.7-1.4-2.9 0-5.8 1.3-7.5 3.4-.8.8-1.4 1.8-2.1 2.6v15.7c3.5 2.6 7.1-2.9 3-7.2 1.5.3 4.6 2.7 5.1 3.2 0 0 2.6-.5 5-.5 2.1 0 3.9.3 5.6 1.1V196c-1.1.5-2.2 1-2.7 1.4zM79.9 305.9c17.2-4.6 16.2-18 16.2-19.9 0-20.6-24.1-25-37-25H3l8.3 8.6v29.5H0l11.4 14.6V346L3 354.6c61.7 0 73.8 1.5 86.4-5.9 6.7-4 9.9-9.8 9.9-17.6 0-5.1 2.6-18.8-19.4-25.2zm-41.3-27.5c20 0 29.6-.8 29.6 9.1v3c0 12.1-19 8.8-29.6 8.8zm0 59.2V315c12.2 0 32.7-2.3 32.7 8.8v4.5h.2c0 11.2-12.5 9.3-32.9 9.3zm101.2-19.3l23.1.2v-.2l14.1-21.2h-37.2v-14.9h52.4l-14.1-21v-.2l-73.5.2 7.4 8.2v77.1l-7.4 8.2h81.2l14.1-21.2-60.1.2zm214.7-60.1c-73.9 0-77.5 99.3-.3 99.3 77.9 0 74.1-99.3.3-99.3zm-.3 77.5c-37.4 0-36.9-55.3.2-55.3 36.8.1 38.8 55.3-.2 55.3zm-91.3-8.3l44.1-66.2h-41.7l6.1 7.2-20.5 37.2h-.3l-21-37.2 6.4-7.2h-44.9l44.1 65.8.2 19.4-7.7 8.2h42.6l-7.2-8.2zm-28.4-151.3c1.6 1.3 2.9 2.4 2.9 6.6v38.8c0 4.2-.8 5.3-2.7 6.4-.1.1-7.5 4.5-7.9 4.6h35.1c10 0 17.4-1.5 26-8.6-.6-5 .2-9.5.8-12 0-.2-1.8 1.4-2.7 3.5 0-5.7 1.6-15.4 9.6-20.5-.1 0-3.7-.8-9 1.1 2-3.1 10-7.9 10.4-7.9-8.2-26-38-22.9-32.2-22.9-30.9 0-32.6.3-39.9-4 .1.8.5 8.2 9.6 14.9zm21.5 5.5c4.6 0 23.1-3.3 23.1 17.3 0 20.7-18.4 17.3-23.1 17.3zm228.9 79.6l7 8.3V312h-.3c-5.4-14.4-42.3-41.5-45.2-50.9h-31.6l7.4 8.5v76.9l-7.2 8.3h39l-7.4-8.2v-47.4h.3c3.7 10.6 44.5 42.9 48.5 55.6h21.3v-85.2l7.4-8.3zm-106.7-96.1c-32.2 0-32.8.2-39.9-4 .1.7.5 8.3 9.6 14.9 3.1 2 2.9 4.3 2.9 9.5 1.8-1.1 3.8-2.2 6.1-3-1.1 1.1-2.7 2.7-3.5 4.5 1-1.1 7.5-5.1 14.6-3.5-1.6.3-4 1.1-6.1 2.9.1 0 2.1-1.1 7.5-.3v-4.3c4.7 0 23.1-3.4 23.1 17.3 0 20.5-18.5 17.3-19.7 17.3 5.7 4.4 5.8 12 2.2 16.3h.3c33.4 0 36.7-27.3 36.7-34 0-3.8-1.1-32-33.8-33.6z\"]\n};\nvar faPeriscope = {\n prefix: 'fab',\n iconName: 'periscope',\n icon: [448, 512, [], \"f3da\", \"M370 63.6C331.4 22.6 280.5 0 226.6 0 111.9 0 18.5 96.2 18.5 214.4c0 75.1 57.8 159.8 82.7 192.7C137.8 455.5 192.6 512 226.6 512c41.6 0 112.9-94.2 120.9-105 24.6-33.1 82-118.3 82-192.6 0-56.5-21.1-110.1-59.5-150.8zM226.6 493.9c-42.5 0-190-167.3-190-279.4 0-107.4 83.9-196.3 190-196.3 100.8 0 184.7 89 184.7 196.3.1 112.1-147.4 279.4-184.7 279.4zM338 206.8c0 59.1-51.1 109.7-110.8 109.7-100.6 0-150.7-108.2-92.9-181.8v.4c0 24.5 20.1 44.4 44.8 44.4 24.7 0 44.8-19.9 44.8-44.4 0-18.2-11.1-33.8-26.9-40.7 76.6-19.2 141 39.3 141 112.4z\"]\n};\nvar faFulcrum = {\n prefix: 'fab',\n iconName: 'fulcrum',\n icon: [320, 512, [], \"f50b\", \"M95.75 164.14l-35.38 43.55L25 164.14l35.38-43.55zM144.23 0l-20.54 198.18L72.72 256l51 57.82L144.23 512V300.89L103.15 256l41.08-44.89zm79.67 164.14l35.38 43.55 35.38-43.55-35.38-43.55zm-48.48 47L216.5 256l-41.08 44.89V512L196 313.82 247 256l-51-57.82L175.42 0z\"]\n};\nvar faCloudscale = {\n prefix: 'fab',\n iconName: 'cloudscale',\n icon: [448, 512, [], \"f383\", \"M318.1 154l-9.4 7.6c-22.5-19.3-51.5-33.6-83.3-33.6C153.8 128 96 188.8 96 260.3c0 6.6.4 13.1 1.4 19.4-2-56 41.8-97.4 92.6-97.4 24.2 0 46.2 9.4 62.6 24.7l-25.2 20.4c-8.3-.9-16.8 1.8-23.1 8.1-11.1 11-11.1 28.9 0 40 11.1 11 28.9 11 40 0 6.3-6.3 9-14.9 8.1-23.1l75.2-88.8c6.3-6.5-3.3-15.9-9.5-9.6zm-83.8 111.5c-5.6 5.5-14.6 5.5-20.2 0-5.6-5.6-5.6-14.6 0-20.2s14.6-5.6 20.2 0 5.6 14.7 0 20.2zM224 32C100.5 32 0 132.5 0 256s100.5 224 224 224 224-100.5 224-224S347.5 32 224 32zm0 384c-88.2 0-160-71.8-160-160S135.8 96 224 96s160 71.8 160 160-71.8 160-160 160z\"]\n};\nvar faForumbee = {\n prefix: 'fab',\n iconName: 'forumbee',\n icon: [448, 512, [], \"f211\", \"M5.8 309.7C2 292.7 0 275.5 0 258.3 0 135 99.8 35 223.1 35c16.6 0 33.3 2 49.3 5.5C149 87.5 51.9 186 5.8 309.7zm392.9-189.2C385 103 369 87.8 350.9 75.2c-149.6 44.3-266.3 162.1-309.7 312 12.5 18.1 28 35.6 45.2 49 43.1-151.3 161.2-271.7 312.3-315.7zm15.8 252.7c15.2-25.1 25.4-53.7 29.5-82.8-79.4 42.9-145 110.6-187.6 190.3 30-4.4 58.9-15.3 84.6-31.3 35 13.1 70.9 24.3 107 33.6-9.3-36.5-20.4-74.5-33.5-109.8zm29.7-145.5c-2.6-19.5-7.9-38.7-15.8-56.8C290.5 216.7 182 327.5 137.1 466c18.1 7.6 37 12.5 56.6 15.2C240 367.1 330.5 274.4 444.2 227.7z\"]\n};\nvar faMizuni = {\n prefix: 'fab',\n iconName: 'mizuni',\n icon: [496, 512, [], \"f3cc\", \"M248 8C111 8 0 119.1 0 256c0 137 111 248 248 248s248-111 248-248C496 119.1 385 8 248 8zm-80 351.9c-31.4 10.6-58.8 27.3-80 48.2V136c0-22.1 17.9-40 40-40s40 17.9 40 40v223.9zm120-9.9c-12.9-2-26.2-3.1-39.8-3.1-13.8 0-27.2 1.1-40.2 3.1V136c0-22.1 17.9-40 40-40s40 17.9 40 40v214zm120 57.7c-21.2-20.8-48.6-37.4-80-48V136c0-22.1 17.9-40 40-40s40 17.9 40 40v271.7z\"]\n};\nvar faSchlix = {\n prefix: 'fab',\n iconName: 'schlix',\n icon: [448, 512, [], \"f3ea\", \"M350.5 157.7l-54.2-46.1 73.4-39 78.3 44.2-97.5 40.9zM192 122.1l45.7-28.2 34.7 34.6-55.4 29-25-35.4zm-65.1 6.6l31.9-22.1L176 135l-36.7 22.5-12.4-28.8zm-23.3 88.2l-8.8-34.8 29.6-18.3 13.1 35.3-33.9 17.8zm-21.2-83.7l23.9-18.1 8.9 24-26.7 18.3-6.1-24.2zM59 206.5l-3.6-28.4 22.3-15.5 6.1 28.7L59 206.5zm-30.6 16.6l20.8-12.8 3.3 33.4-22.9 12-1.2-32.6zM1.4 268l19.2-10.2.4 38.2-21 8.8L1.4 268zm59.1 59.3l-28.3 8.3-1.6-46.8 25.1-10.7 4.8 49.2zM99 263.2l-31.1 13-5.2-40.8L90.1 221l8.9 42.2zM123.2 377l-41.6 5.9-8.1-63.5 35.2-10.8 14.5 68.4zm28.5-139.9l21.2 57.1-46.2 13.6-13.7-54.1 38.7-16.6zm85.7 230.5l-70.9-3.3-24.3-95.8 55.2-8.6 40 107.7zm-84.9-279.7l42.2-22.4 28 45.9-50.8 21.3-19.4-44.8zm41 94.9l61.3-18.7 52.8 86.6-79.8 11.3-34.3-79.2zm51.4-85.6l67.3-28.8 65.5 65.4-88.6 26.2-44.2-62.8z\"]\n};\nvar faSquareXing = {\n prefix: 'fab',\n iconName: 'square-xing',\n icon: [448, 512, [\"xing-square\"], \"f169\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM140.4 320.2H93.8c-5.5 0-8.7-5.3-6-10.3l49.3-86.7c.1 0 .1-.1 0-.2l-31.4-54c-3-5.6.2-10.1 6-10.1h46.6c5.2 0 9.5 2.9 12.9 8.7l31.9 55.3c-1.3 2.3-18 31.7-50.1 88.2-3.5 6.2-7.7 9.1-12.6 9.1zm219.7-214.1L257.3 286.8v.2l65.5 119c2.8 5.1.1 10.1-6 10.1h-46.6c-5.5 0-9.7-2.9-12.9-8.7l-66-120.3c2.3-4.1 36.8-64.9 103.4-182.3 3.3-5.8 7.4-8.7 12.5-8.7h46.9c5.7-.1 8.8 4.7 6 10z\"]\n};\nvar faXingSquare = faSquareXing;\nvar faBandcamp = {\n prefix: 'fab',\n iconName: 'bandcamp',\n icon: [512, 512, [], \"f2d5\", \"M256,8C119,8,8,119,8,256S119,504,256,504,504,393,504,256,393,8,256,8Zm48.2,326.1h-181L207.9,178h181Z\"]\n};\nvar faWpforms = {\n prefix: 'fab',\n iconName: 'wpforms',\n icon: [448, 512, [], \"f298\", \"M448 75.2v361.7c0 24.3-19 43.2-43.2 43.2H43.2C19.3 480 0 461.4 0 436.8V75.2C0 51.1 18.8 32 43.2 32h361.7c24 0 43.1 18.8 43.1 43.2zm-37.3 361.6V75.2c0-3-2.6-5.8-5.8-5.8h-9.3L285.3 144 224 94.1 162.8 144 52.5 69.3h-9.3c-3.2 0-5.8 2.8-5.8 5.8v361.7c0 3 2.6 5.8 5.8 5.8h361.7c3.2.1 5.8-2.7 5.8-5.8zM150.2 186v37H76.7v-37h73.5zm0 74.4v37.3H76.7v-37.3h73.5zm11.1-147.3l54-43.7H96.8l64.5 43.7zm210 72.9v37h-196v-37h196zm0 74.4v37.3h-196v-37.3h196zm-84.6-147.3l64.5-43.7H232.8l53.9 43.7zM371.3 335v37.3h-99.4V335h99.4z\"]\n};\nvar faCloudversify = {\n prefix: 'fab',\n iconName: 'cloudversify',\n icon: [616, 512, [], \"f385\", \"M148.6 304c8.2 68.5 67.4 115.5 146 111.3 51.2 43.3 136.8 45.8 186.4-5.6 69.2 1.1 118.5-44.6 131.5-99.5 14.8-62.5-18.2-132.5-92.1-155.1-33-88.1-131.4-101.5-186.5-85-57.3 17.3-84.3 53.2-99.3 109.7-7.8 2.7-26.5 8.9-45 24.1 11.7 0 15.2 8.9 15.2 19.5v20.4c0 10.7-8.7 19.5-19.5 19.5h-20.2c-10.7 0-19.5-6-19.5-16.7V240H98.8C95 240 88 244.3 88 251.9v40.4c0 6.4 5.3 11.8 11.7 11.8h48.9zm227.4 8c-10.7 46.3 21.7 72.4 55.3 86.8C324.1 432.6 259.7 348 296 288c-33.2 21.6-33.7 71.2-29.2 92.9-17.9-12.4-53.8-32.4-57.4-79.8-3-39.9 21.5-75.7 57-93.9C297 191.4 369.9 198.7 400 248c-14.1-48-53.8-70.1-101.8-74.8 30.9-30.7 64.4-50.3 114.2-43.7 69.8 9.3 133.2 82.8 67.7 150.5 35-16.3 48.7-54.4 47.5-76.9l10.5 19.6c11.8 22 15.2 47.6 9.4 72-9.2 39-40.6 68.8-79.7 76.5-32.1 6.3-83.1-5.1-91.8-59.2zM128 208H88.2c-8.9 0-16.2-7.3-16.2-16.2v-39.6c0-8.9 7.3-16.2 16.2-16.2H128c8.9 0 16.2 7.3 16.2 16.2v39.6c0 8.9-7.3 16.2-16.2 16.2zM10.1 168C4.5 168 0 163.5 0 157.9v-27.8c0-5.6 4.5-10.1 10.1-10.1h27.7c5.5 0 10.1 4.5 10.1 10.1v27.8c0 5.6-4.5 10.1-10.1 10.1H10.1zM168 142.7v-21.4c0-5.1 4.2-9.3 9.3-9.3h21.4c5.1 0 9.3 4.2 9.3 9.3v21.4c0 5.1-4.2 9.3-9.3 9.3h-21.4c-5.1 0-9.3-4.2-9.3-9.3zM56 235.5v25c0 6.3-5.1 11.5-11.4 11.5H19.4C13.1 272 8 266.8 8 260.5v-25c0-6.3 5.1-11.5 11.4-11.5h25.1c6.4 0 11.5 5.2 11.5 11.5z\"]\n};\nvar faUsps = {\n prefix: 'fab',\n iconName: 'usps',\n icon: [576, 512, [], \"f7e1\", \"M460.3 241.7c25.8-41.3 15.2-48.8-11.7-48.8h-27c-.1 0-1.5-1.4-10.9 8-11.2 5.6-37.9 6.3-37.9 8.7 0 4.5 70.3-3.1 88.1 0 9.5 1.5-1.5 20.4-4.4 32-.5 4.5 2.4 2.3 3.8.1zm-112.1 22.6c64-21.3 97.3-23.9 102-26.2 4.4-2.9-4.4-6.6-26.2-5.8-51.7 2.2-137.6 37.1-172.6 53.9l-30.7-93.3h196.6c-2.7-28.2-152.9-22.6-337.9-22.6L27 415.8c196.4-97.3 258.9-130.3 321.2-151.5zM94.7 96c253.3 53.7 330 65.7 332.1 85.2 36.4 0 45.9 0 52.4 6.6 21.1 19.7-14.6 67.7-14.6 67.7-4.4 2.9-406.4 160.2-406.4 160.2h423.1L549 96z\"]\n};\nvar faMegaport = {\n prefix: 'fab',\n iconName: 'megaport',\n icon: [496, 512, [], \"f5a3\", \"M214.5 209.6v66.2l33.5 33.5 33.3-33.3v-66.4l-33.4-33.4zM248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm145.1 414.4L367 441.6l-26-19.2v-65.5l-33.4-33.4-33.4 33.4v65.5L248 441.6l-26.1-19.2v-65.5l-33.4-33.4-33.5 33.4v65.5l-26.1 19.2-26.1-19.2v-87l59.5-59.5V188l59.5-59.5V52.9l26.1-19.2L274 52.9v75.6l59.5 59.5v87.6l59.7 59.7v87.1z\"]\n};\nvar faMagento = {\n prefix: 'fab',\n iconName: 'magento',\n icon: [448, 512, [], \"f3c4\", \"M445.7 127.9V384l-63.4 36.5V164.7L223.8 73.1 65.2 164.7l.4 255.9L2.3 384V128.1L224.2 0l221.5 127.9zM255.6 420.5L224 438.9l-31.8-18.2v-256l-63.3 36.6.1 255.9 94.9 54.9 95.1-54.9v-256l-63.4-36.6v255.9z\"]\n};\nvar faSpotify = {\n prefix: 'fab',\n iconName: 'spotify',\n icon: [496, 512, [], \"f1bc\", \"M248 8C111.1 8 0 119.1 0 256s111.1 248 248 248 248-111.1 248-248S384.9 8 248 8zm100.7 364.9c-4.2 0-6.8-1.3-10.7-3.6-62.4-37.6-135-39.2-206.7-24.5-3.9 1-9 2.6-11.9 2.6-9.7 0-15.8-7.7-15.8-15.8 0-10.3 6.1-15.2 13.6-16.8 81.9-18.1 165.6-16.5 237 26.2 6.1 3.9 9.7 7.4 9.7 16.5s-7.1 15.4-15.2 15.4zm26.9-65.6c-5.2 0-8.7-2.3-12.3-4.2-62.5-37-155.7-51.9-238.6-29.4-4.8 1.3-7.4 2.6-11.9 2.6-10.7 0-19.4-8.7-19.4-19.4s5.2-17.8 15.5-20.7c27.8-7.8 56.2-13.6 97.8-13.6 64.9 0 127.6 16.1 177 45.5 8.1 4.8 11.3 11 11.3 19.7-.1 10.8-8.5 19.5-19.4 19.5zm31-76.2c-5.2 0-8.4-1.3-12.9-3.9-71.2-42.5-198.5-52.7-280.9-29.7-3.6 1-8.1 2.6-12.9 2.6-13.2 0-23.3-10.3-23.3-23.6 0-13.6 8.4-21.3 17.4-23.9 35.2-10.3 74.6-15.2 117.5-15.2 73 0 149.5 15.2 205.4 47.8 7.8 4.5 12.9 10.7 12.9 22.6 0 13.6-11 23.3-23.2 23.3z\"]\n};\nvar faOptinMonster = {\n prefix: 'fab',\n iconName: 'optin-monster',\n icon: [576, 512, [], \"f23c\", \"M572.6 421.4c5.6-9.5 4.7-15.2-5.4-11.6-3-4.9-7-9.5-11.1-13.8 2.9-9.7-.7-14.2-10.8-9.2-4.6-3.2-10.3-6.5-15.9-9.2 0-15.1-11.6-11.6-17.6-5.7-10.4-1.5-18.7-.3-26.8 5.7.3-6.5.3-13 .3-19.7 12.6 0 40.2-11 45.9-36.2 1.4-6.8 1.6-13.8-.3-21.9-3-13.5-14.3-21.3-25.1-25.7-.8-5.9-7.6-14.3-14.9-15.9s-12.4 4.9-14.1 10.3c-8.5 0-19.2 2.8-21.1 8.4-5.4-.5-11.1-1.4-16.8-1.9 2.7-1.9 5.4-3.5 8.4-4.6 5.4-9.2 14.6-11.4 25.7-11.6V256c19.5-.5 43-5.9 53.8-18.1 12.7-13.8 14.6-37.3 12.4-55.1-2.4-17.3-9.7-37.6-24.6-48.1-8.4-5.9-21.6-.8-22.7 9.5-2.2 19.6 1.2 30-38.6 25.1-10.3-23.8-24.6-44.6-42.7-60C341 49.6 242.9 55.5 166.4 71.7c19.7 4.6 41.1 8.6 59.7 16.5-26.2 2.4-52.7 11.3-76.2 23.2-32.8 17-44 29.9-56.7 42.4 14.9-2.2 28.9-5.1 43.8-3.8-9.7 5.4-18.4 12.2-26.5 20-25.8.9-23.8-5.3-26.2-25.9-1.1-10.5-14.3-15.4-22.7-9.7-28.1 19.9-33.5 79.9-12.2 103.5 10.8 12.2 35.1 17.3 54.9 17.8-.3 1.1-.3 1.9-.3 2.7 10.8.5 19.5 2.7 24.6 11.6 3 1.1 5.7 2.7 8.1 4.6-5.4.5-11.1 1.4-16.5 1.9-3.3-6.6-13.7-8.1-21.1-8.1-1.6-5.7-6.5-12.2-14.1-10.3-6.8 1.9-14.1 10-14.9 15.9-22.5 9.5-30.1 26.8-25.1 47.6 5.3 24.8 33 36.2 45.9 36.2v19.7c-6.6-5-14.3-7.5-26.8-5.7-5.5-5.5-17.3-10.1-17.3 5.7-5.9 2.7-11.4 5.9-15.9 9.2-9.8-4.9-13.6-1.7-11.1 9.2-4.1 4.3-7.8 8.6-11.1 13.8-10.2-3.7-11 2.2-5.4 11.6-1.1 3.5-1.6 7-1.9 10.8-.5 31.6 44.6 64 73.5 65.1 17.3.5 34.6-8.4 43-23.5 113.2 4.9 226.7 4.1 340.2 0 8.1 15.1 25.4 24.3 42.7 23.5 29.2-1.1 74.3-33.5 73.5-65.1.2-3.7-.7-7.2-1.7-10.7zm-73.8-254c1.1-3 2.4-8.4 2.4-14.6 0-5.9 6.8-8.1 14.1-.8 11.1 11.6 14.9 40.5 13.8 51.1-4.1-13.6-13-29-30.3-35.7zm-4.6 6.7c19.5 6.2 28.6 27.6 29.7 48.9-1.1 2.7-3 5.4-4.9 7.6-5.7 5.9-15.4 10-26.2 12.2 4.3-21.3.3-47.3-12.7-63 4.9-.8 10.9-2.4 14.1-5.7zm-24.1 6.8c13.8 11.9 20 39.2 14.1 63.5-4.1.5-8.1.8-11.6.8-1.9-21.9-6.8-44-14.3-64.6 3.7.3 8.1.3 11.8.3zM47.5 203c-1.1-10.5 2.4-39.5 13.8-51.1 7-7.3 14.1-5.1 14.1.8 0 6.2 1.4 11.6 2.4 14.6-17.3 6.8-26.2 22.2-30.3 35.7zm9.7 27.6c-1.9-2.2-3.5-4.9-4.9-7.6 1.4-21.3 10.3-42.7 29.7-48.9 3.2 3.2 9.2 4.9 14.1 5.7-13 15.7-17 41.6-12.7 63-10.8-2.2-20.5-6-26.2-12.2zm47.9 14.6c-4.1 0-8.1-.3-12.7-.8-4.6-18.6-1.9-38.9 5.4-53v.3l12.2-5.1c4.9-1.9 9.7-3.8 14.9-4.9-10.7 19.7-17.4 41.3-19.8 63.5zm184-162.7c41.9 0 76.2 34 76.2 75.9 0 42.2-34.3 76.2-76.2 76.2s-76.2-34-76.2-76.2c0-41.8 34.3-75.9 76.2-75.9zm115.6 174.3c-.3 17.8-7 48.9-23 57-13.2 6.6-6.5-7.5-16.5-58.1 13.3.3 26.6.3 39.5 1.1zm-54-1.6c.8 4.9 3.8 40.3-1.6 41.9-11.6 3.5-40 4.3-51.1-1.1-4.1-3-4.6-35.9-4.3-41.1v.3c18.9-.3 38.1-.3 57 0zM278.3 309c-13 3.5-41.6 4.1-54.6-1.6-6.5-2.7-3.8-42.4-1.9-51.6 19.2-.5 38.4-.5 57.8-.8v.3c1.1 8.3 3.3 51.2-1.3 53.7zm-106.5-51.1c12.2-.8 24.6-1.4 36.8-1.6-2.4 15.4-3 43.5-4.9 52.2-1.1 6.8-4.3 6.8-9.7 4.3-21.9-9.8-27.6-35.2-22.2-54.9zm-35.4 31.3c7.8-1.1 15.7-1.9 23.5-2.7 1.6 6.2 3.8 11.9 7 17.6 10 17 44 35.7 45.1 7 6.2 14.9 40.8 12.2 54.9 10.8 15.7-1.4 23.8-1.4 26.8-14.3 12.4 4.3 30.8 4.1 44 3 11.3-.8 20.8-.5 24.6-8.9 1.1 5.1 1.9 11.6 4.6 16.8 10.8 21.3 37.3 1.4 46.8-31.6 8.6.8 17.6 1.9 26.5 2.7-.4 1.3-3.8 7.3 7.3 11.6-47.6 47-95.7 87.8-163.2 107-63.2-20.8-112.1-59.5-155.9-106.5 9.6-3.4 10.4-8.8 8-12.5zm-21.6 172.5c-3.8 17.8-21.9 29.7-39.7 28.9-19.2-.8-46.5-17-59.2-36.5-2.7-31.1 43.8-61.3 66.2-54.6 14.9 4.3 27.8 30.8 33.5 54 0 3-.3 5.7-.8 8.2zm-8.7-66c-.5-13.5-.5-27-.3-40.5h.3c2.7-1.6 5.7-3.8 7.8-6.5 6.5-1.6 13-5.1 15.1-9.2 3.3-7.1-7-7.5-5.4-12.4 2.7-1.1 5.7-2.2 7.8-3.5 29.2 29.2 58.6 56.5 97.3 77-36.8 11.3-72.4 27.6-105.9 47-1.2-18.6-7.7-35.9-16.7-51.9zm337.6 64.6c-103 3.5-206.2 4.1-309.4 0 0 .3 0 .3-.3.3v-.3h.3c35.1-21.6 72.2-39.2 112.4-50.8 11.6 5.1 23 9.5 34.9 13.2 2.2.8 2.2.8 4.3 0 14.3-4.1 28.4-9.2 42.2-15.4 41.5 11.7 78.8 31.7 115.6 53zm10.5-12.4c-35.9-19.5-73-35.9-111.9-47.6 38.1-20 71.9-47.3 103.5-76.7 2.2 1.4 4.6 2.4 7.6 3.2 0 .8.3 1.9.5 2.4-4.6 2.7-7.8 6.2-5.9 10.3 2.2 3.8 8.6 7.6 15.1 8.9 2.4 2.7 5.1 5.1 8.1 6.8 0 13.8-.3 27.6-.8 41.3l.3-.3c-9.3 15.9-15.5 37-16.5 51.7zm105.9 6.2c-12.7 19.5-40 35.7-59.2 36.5-19.3.9-40.5-13.2-40.5-37 5.7-23.2 18.9-49.7 33.5-54 22.7-6.9 69.2 23.4 66.2 54.5zM372.9 75.2c-3.8-72.1-100.8-79.7-126-23.5 44.6-24.3 90.3-15.7 126 23.5zM74.8 407.1c-15.7 1.6-49.5 25.4-49.5 43.2 0 11.6 15.7 19.5 32.2 14.9 12.2-3.2 31.1-17.6 35.9-27.3 6-11.6-3.7-32.7-18.6-30.8zm215.9-176.2c28.6 0 51.9-21.6 51.9-48.4 0-36.1-40.5-58.1-72.2-44.3 9.5 3 16.5 11.6 16.5 21.6 0 23.3-33.3 32-46.5 11.3-7.3 34.1 19.4 59.8 50.3 59.8zM68 474.1c.5 6.5 12.2 12.7 21.6 9.5 6.8-2.7 14.6-10.5 17.3-16.2 3-7-1.1-20-9.7-18.4-8.9 1.6-29.7 16.7-29.2 25.1zm433.2-67c-14.9-1.9-24.6 19.2-18.9 30.8 4.9 9.7 24.1 24.1 36.2 27.3 16.5 4.6 32.2-3.2 32.2-14.9 0-17.8-33.8-41.6-49.5-43.2zM478.8 449c-8.4-1.6-12.4 11.3-9.5 18.4 2.4 5.7 10.3 13.5 17.3 16.2 9.2 3.2 21.1-3 21.3-9.5.9-8.4-20.2-23.5-29.1-25.1z\"]\n};\nvar faFly = {\n prefix: 'fab',\n iconName: 'fly',\n icon: [384, 512, [], \"f417\", \"M197.8 427.8c12.9 11.7 33.7 33.3 33.2 50.7 0 .8-.1 1.6-.1 2.5-1.8 19.8-18.8 31.1-39.1 31-25-.1-39.9-16.8-38.7-35.8 1-16.2 20.5-36.7 32.4-47.6 2.3-2.1 2.7-2.7 5.6-3.6 3.4 0 3.9.3 6.7 2.8zM331.9 67.3c-16.3-25.7-38.6-40.6-63.3-52.1C243.1 4.5 214-.2 192 0c-44.1 0-71.2 13.2-81.1 17.3C57.3 45.2 26.5 87.2 28 158.6c7.1 82.2 97 176 155.8 233.8 1.7 1.6 4.5 4.5 6.2 5.1l3.3.1c2.1-.7 1.8-.5 3.5-2.1 52.3-49.2 140.7-145.8 155.9-215.7 7-39.2 3.1-72.5-20.8-112.5zM186.8 351.9c-28-51.1-65.2-130.7-69.3-189-3.4-47.5 11.4-131.2 69.3-136.7v325.7zM328.7 180c-16.4 56.8-77.3 128-118.9 170.3C237.6 298.4 275 217 277 158.4c1.6-45.9-9.8-105.8-48-131.4 88.8 18.3 115.5 98.1 99.7 153z\"]\n};\nvar faAviato = {\n prefix: 'fab',\n iconName: 'aviato',\n icon: [640, 512, [], \"f421\", \"M107.2 283.5l-19-41.8H36.1l-19 41.8H0l62.2-131.4 62.2 131.4h-17.2zm-45-98.1l-19.6 42.5h39.2l-19.6-42.5zm112.7 102.4l-62.2-131.4h17.1l45.1 96 45.1-96h17l-62.1 131.4zm80.6-4.3V156.4H271v127.1h-15.5zm209.1-115.6v115.6h-17.3V167.9h-41.2v-11.5h99.6v11.5h-41.1zM640 218.8c0 9.2-1.7 17.8-5.1 25.8-3.4 8-8.2 15.1-14.2 21.1-6 6-13.1 10.8-21.1 14.2-8 3.4-16.6 5.1-25.8 5.1s-17.8-1.7-25.8-5.1c-8-3.4-15.1-8.2-21.1-14.2-6-6-10.8-13-14.2-21.1-3.4-8-5.1-16.6-5.1-25.8s1.7-17.8 5.1-25.8c3.4-8 8.2-15.1 14.2-21.1 6-6 13-8.4 21.1-11.9 8-3.4 16.6-5.1 25.8-5.1s17.8 1.7 25.8 5.1c8 3.4 15.1 5.8 21.1 11.9 6 6 10.7 13.1 14.2 21.1 3.4 8 5.1 16.6 5.1 25.8zm-15.5 0c0-7.3-1.3-14-3.9-20.3-2.6-6.3-6.2-11.7-10.8-16.3-4.6-4.6-10-8.2-16.2-10.9-6.2-2.7-12.8-4-19.8-4s-13.6 1.3-19.8 4c-6.2 2.7-11.6 6.3-16.2 10.9-4.6 4.6-8.2 10-10.8 16.3-2.6 6.3-3.9 13.1-3.9 20.3 0 7.3 1.3 14 3.9 20.3 2.6 6.3 6.2 11.7 10.8 16.3 4.6 4.6 10 8.2 16.2 10.9 6.2 2.7 12.8 4 19.8 4s13.6-1.3 19.8-4c6.2-2.7 11.6-6.3 16.2-10.9 4.6-4.6 8.2-10 10.8-16.3 2.6-6.3 3.9-13.1 3.9-20.3zm-94.8 96.7v-6.3l88.9-10-242.9 13.4c.6-2.2 1.1-4.6 1.4-7.2.3-2 .5-4.2.6-6.5l64.8-8.1-64.9 1.9c0-.4-.1-.7-.1-1.1-2.8-17.2-25.5-23.7-25.5-23.7l-1.1-26.3h23.8l19 41.8h17.1L348.6 152l-62.2 131.4h17.1l19-41.8h23.6L345 268s-22.7 6.5-25.5 23.7c-.1.3-.1.7-.1 1.1l-64.9-1.9 64.8 8.1c.1 2.3.3 4.4.6 6.5.3 2.6.8 5 1.4 7.2L78.4 299.2l88.9 10v6.3c-5.9.9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4 6.8 0 12.4-5.6 12.4-12.4 0-6.2-4.6-11.3-10.5-12.2v-5.8l80.3 9v5.4c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2 6.8 0 12.4-3.4 12.4-10.2 0-6-4.3-11-9.9-12.1v-4.9l28.4 3.2v23.7h-5.9V360h5.9v-6.6h5v6.6h5.9v-13.8h-5.9V323l38.3 4.3c8.1 11.4 19 13.6 19 13.6l-.1 6.7-5.1.2-.1 12.1h4.1l.1-5h5.2l.1 5h4.1l-.1-12.1-5.1-.2-.1-6.7s10.9-2.1 19-13.6l38.3-4.3v23.2h-5.9V360h5.9v-6.6h5v6.6h5.9v-13.8h-5.9v-23.7l28.4-3.2v4.9c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2 6.8 0 12.4-3.4 12.4-10.2 0-6-4.3-11-9.9-12.1v-5.4l80.3-9v5.8c-5.9.9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4 6.8 0 12.4-5.6 12.4-12.4-.2-6.3-4.7-11.4-10.7-12.3zm-200.8-87.6l19.6-42.5 19.6 42.5h-17.9l-1.7-40.3-1.7 40.3h-17.9z\"]\n};\nvar faItunes = {\n prefix: 'fab',\n iconName: 'itunes',\n icon: [448, 512, [], \"f3b4\", \"M223.6 80.3C129 80.3 52.5 157 52.5 251.5S129 422.8 223.6 422.8s171.2-76.7 171.2-171.2c0-94.6-76.7-171.3-171.2-171.3zm79.4 240c-3.2 13.6-13.5 21.2-27.3 23.8-12.1 2.2-22.2 2.8-31.9-5-11.8-10-12-26.4-1.4-36.8 8.4-8 20.3-9.6 38-12.8 3-.5 5.6-1.2 7.7-3.7 3.2-3.6 2.2-2 2.2-80.8 0-5.6-2.7-7.1-8.4-6.1-4 .7-91.9 17.1-91.9 17.1-5 1.1-6.7 2.6-6.7 8.3 0 116.1.5 110.8-1.2 118.5-2.1 9-7.6 15.8-14.9 19.6-8.3 4.6-23.4 6.6-31.4 5.2-21.4-4-28.9-28.7-14.4-42.9 8.4-8 20.3-9.6 38-12.8 3-.5 5.6-1.2 7.7-3.7 5-5.7.9-127 2.6-133.7.4-2.6 1.5-4.8 3.5-6.4 2.1-1.7 5.8-2.7 6.7-2.7 101-19 113.3-21.4 115.1-21.4 5.7-.4 9 3 9 8.7-.1 170.6.4 161.4-1 167.6zM345.2 32H102.8C45.9 32 0 77.9 0 134.8v242.4C0 434.1 45.9 480 102.8 480h242.4c57 0 102.8-45.9 102.8-102.8V134.8C448 77.9 402.1 32 345.2 32zM223.6 444c-106.3 0-192.5-86.2-192.5-192.5S117.3 59 223.6 59s192.5 86.2 192.5 192.5S329.9 444 223.6 444z\"]\n};\nvar faCuttlefish = {\n prefix: 'fab',\n iconName: 'cuttlefish',\n icon: [440, 512, [], \"f38c\", \"M344 305.5c-17.5 31.6-57.4 54.5-96 54.5-56.6 0-104-47.4-104-104s47.4-104 104-104c38.6 0 78.5 22.9 96 54.5 13.7-50.9 41.7-93.3 87-117.8C385.7 39.1 320.5 8 248 8 111 8 0 119 0 256s111 248 248 248c72.5 0 137.7-31.1 183-80.7-45.3-24.5-73.3-66.9-87-117.8z\"]\n};\nvar faBlogger = {\n prefix: 'fab',\n iconName: 'blogger',\n icon: [448, 512, [], \"f37c\", \"M162.4 196c4.8-4.9 6.2-5.1 36.4-5.1 27.2 0 28.1.1 32.1 2.1 5.8 2.9 8.3 7 8.3 13.6 0 5.9-2.4 10-7.6 13.4-2.8 1.8-4.5 1.9-31.1 2.1-16.4.1-29.5-.2-31.5-.8-10.3-2.9-14.1-17.7-6.6-25.3zm61.4 94.5c-53.9 0-55.8.2-60.2 4.1-3.5 3.1-5.7 9.4-5.1 13.9.7 4.7 4.8 10.1 9.2 12 2.2 1 14.1 1.7 56.3 1.2l47.9-.6 9.2-1.5c9-5.1 10.5-17.4 3.1-24.4-5.3-4.7-5-4.7-60.4-4.7zm223.4 130.1c-3.5 28.4-23 50.4-51.1 57.5-7.2 1.8-9.7 1.9-172.9 1.8-157.8 0-165.9-.1-172-1.8-8.4-2.2-15.6-5.5-22.3-10-5.6-3.8-13.9-11.8-17-16.4-3.8-5.6-8.2-15.3-10-22C.1 423 0 420.3 0 256.3 0 93.2 0 89.7 1.8 82.6 8.1 57.9 27.7 39 53 33.4c7.3-1.6 332.1-1.9 340-.3 21.2 4.3 37.9 17.1 47.6 36.4 7.7 15.3 7-1.5 7.3 180.6.2 115.8 0 164.5-.7 170.5zm-85.4-185.2c-1.1-5-4.2-9.6-7.7-11.5-1.1-.6-8-1.3-15.5-1.7-12.4-.6-13.8-.8-17.8-3.1-6.2-3.6-7.9-7.6-8-18.3 0-20.4-8.5-39.4-25.3-56.5-12-12.2-25.3-20.5-40.6-25.1-3.6-1.1-11.8-1.5-39.2-1.8-42.9-.5-52.5.4-67.1 6.2-27 10.7-46.3 33.4-53.4 62.4-1.3 5.4-1.6 14.2-1.9 64.3-.4 62.8 0 72.1 4 84.5 9.7 30.7 37.1 53.4 64.6 58.4 9.2 1.7 122.2 2.1 133.7.5 20.1-2.7 35.9-10.8 50.7-25.9 10.7-10.9 17.4-22.8 21.8-38.5 3.2-10.9 2.9-88.4 1.7-93.9z\"]\n};\nvar faFlickr = {\n prefix: 'fab',\n iconName: 'flickr',\n icon: [448, 512, [], \"f16e\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM144.5 319c-35.1 0-63.5-28.4-63.5-63.5s28.4-63.5 63.5-63.5 63.5 28.4 63.5 63.5-28.4 63.5-63.5 63.5zm159 0c-35.1 0-63.5-28.4-63.5-63.5s28.4-63.5 63.5-63.5 63.5 28.4 63.5 63.5-28.4 63.5-63.5 63.5z\"]\n};\nvar faViber = {\n prefix: 'fab',\n iconName: 'viber',\n icon: [512, 512, [], \"f409\", \"M444 49.9C431.3 38.2 379.9.9 265.3.4c0 0-135.1-8.1-200.9 52.3C27.8 89.3 14.9 143 13.5 209.5c-1.4 66.5-3.1 191.1 117 224.9h.1l-.1 51.6s-.8 20.9 13 25.1c16.6 5.2 26.4-10.7 42.3-27.8 8.7-9.4 20.7-23.2 29.8-33.7 82.2 6.9 145.3-8.9 152.5-11.2 16.6-5.4 110.5-17.4 125.7-142 15.8-128.6-7.6-209.8-49.8-246.5zM457.9 287c-12.9 104-89 110.6-103 115.1-6 1.9-61.5 15.7-131.2 11.2 0 0-52 62.7-68.2 79-5.3 5.3-11.1 4.8-11-5.7 0-6.9.4-85.7.4-85.7-.1 0-.1 0 0 0-101.8-28.2-95.8-134.3-94.7-189.8 1.1-55.5 11.6-101 42.6-131.6 55.7-50.5 170.4-43 170.4-43 96.9.4 143.3 29.6 154.1 39.4 35.7 30.6 53.9 103.8 40.6 211.1zm-139-80.8c.4 8.6-12.5 9.2-12.9.6-1.1-22-11.4-32.7-32.6-33.9-8.6-.5-7.8-13.4.7-12.9 27.9 1.5 43.4 17.5 44.8 46.2zm20.3 11.3c1-42.4-25.5-75.6-75.8-79.3-8.5-.6-7.6-13.5.9-12.9 58 4.2 88.9 44.1 87.8 92.5-.1 8.6-13.1 8.2-12.9-.3zm47 13.4c.1 8.6-12.9 8.7-12.9.1-.6-81.5-54.9-125.9-120.8-126.4-8.5-.1-8.5-12.9 0-12.9 73.7.5 133 51.4 133.7 139.2zM374.9 329v.2c-10.8 19-31 40-51.8 33.3l-.2-.3c-21.1-5.9-70.8-31.5-102.2-56.5-16.2-12.8-31-27.9-42.4-42.4-10.3-12.9-20.7-28.2-30.8-46.6-21.3-38.5-26-55.7-26-55.7-6.7-20.8 14.2-41 33.3-51.8h.2c9.2-4.8 18-3.2 23.9 3.9 0 0 12.4 14.8 17.7 22.1 5 6.8 11.7 17.7 15.2 23.8 6.1 10.9 2.3 22-3.7 26.6l-12 9.6c-6.1 4.9-5.3 14-5.3 14s17.8 67.3 84.3 84.3c0 0 9.1.8 14-5.3l9.6-12c4.6-6 15.7-9.8 26.6-3.7 14.7 8.3 33.4 21.2 45.8 32.9 7 5.7 8.6 14.4 3.8 23.6z\"]\n};\nvar faSoundcloud = {\n prefix: 'fab',\n iconName: 'soundcloud',\n icon: [640, 512, [], \"f1be\", \"M111.4 256.3l5.8 65-5.8 68.3c-.3 2.5-2.2 4.4-4.4 4.4s-4.2-1.9-4.2-4.4l-5.6-68.3 5.6-65c0-2.2 1.9-4.2 4.2-4.2 2.2 0 4.1 2 4.4 4.2zm21.4-45.6c-2.8 0-4.7 2.2-5 5l-5 105.6 5 68.3c.3 2.8 2.2 5 5 5 2.5 0 4.7-2.2 4.7-5l5.8-68.3-5.8-105.6c0-2.8-2.2-5-4.7-5zm25.5-24.1c-3.1 0-5.3 2.2-5.6 5.3l-4.4 130 4.4 67.8c.3 3.1 2.5 5.3 5.6 5.3 2.8 0 5.3-2.2 5.3-5.3l5.3-67.8-5.3-130c0-3.1-2.5-5.3-5.3-5.3zM7.2 283.2c-1.4 0-2.2 1.1-2.5 2.5L0 321.3l4.7 35c.3 1.4 1.1 2.5 2.5 2.5s2.2-1.1 2.5-2.5l5.6-35-5.6-35.6c-.3-1.4-1.1-2.5-2.5-2.5zm23.6-21.9c-1.4 0-2.5 1.1-2.5 2.5l-6.4 57.5 6.4 56.1c0 1.7 1.1 2.8 2.5 2.8s2.5-1.1 2.8-2.5l7.2-56.4-7.2-57.5c-.3-1.4-1.4-2.5-2.8-2.5zm25.3-11.4c-1.7 0-3.1 1.4-3.3 3.3L47 321.3l5.8 65.8c.3 1.7 1.7 3.1 3.3 3.1 1.7 0 3.1-1.4 3.1-3.1l6.9-65.8-6.9-68.1c0-1.9-1.4-3.3-3.1-3.3zm25.3-2.2c-1.9 0-3.6 1.4-3.6 3.6l-5.8 70 5.8 67.8c0 2.2 1.7 3.6 3.6 3.6s3.6-1.4 3.9-3.6l6.4-67.8-6.4-70c-.3-2.2-2-3.6-3.9-3.6zm241.4-110.9c-1.1-.8-2.8-1.4-4.2-1.4-2.2 0-4.2.8-5.6 1.9-1.9 1.7-3.1 4.2-3.3 6.7v.8l-3.3 176.7 1.7 32.5 1.7 31.7c.3 4.7 4.2 8.6 8.9 8.6s8.6-3.9 8.6-8.6l3.9-64.2-3.9-177.5c-.4-3-2-5.8-4.5-7.2zm-26.7 15.3c-1.4-.8-2.8-1.4-4.4-1.4s-3.1.6-4.4 1.4c-2.2 1.4-3.6 3.9-3.6 6.7l-.3 1.7-2.8 160.8s0 .3 3.1 65.6v.3c0 1.7.6 3.3 1.7 4.7 1.7 1.9 3.9 3.1 6.4 3.1 2.2 0 4.2-1.1 5.6-2.5 1.7-1.4 2.5-3.3 2.5-5.6l.3-6.7 3.1-58.6-3.3-162.8c-.3-2.8-1.7-5.3-3.9-6.7zm-111.4 22.5c-3.1 0-5.8 2.8-5.8 6.1l-4.4 140.6 4.4 67.2c.3 3.3 2.8 5.8 5.8 5.8 3.3 0 5.8-2.5 6.1-5.8l5-67.2-5-140.6c-.2-3.3-2.7-6.1-6.1-6.1zm376.7 62.8c-10.8 0-21.1 2.2-30.6 6.1-6.4-70.8-65.8-126.4-138.3-126.4-17.8 0-35 3.3-50.3 9.4-6.1 2.2-7.8 4.4-7.8 9.2v249.7c0 5 3.9 8.6 8.6 9.2h218.3c43.3 0 78.6-35 78.6-78.3.1-43.6-35.2-78.9-78.5-78.9zm-296.7-60.3c-4.2 0-7.5 3.3-7.8 7.8l-3.3 136.7 3.3 65.6c.3 4.2 3.6 7.5 7.8 7.5 4.2 0 7.5-3.3 7.5-7.5l3.9-65.6-3.9-136.7c-.3-4.5-3.3-7.8-7.5-7.8zm-53.6-7.8c-3.3 0-6.4 3.1-6.4 6.7l-3.9 145.3 3.9 66.9c.3 3.6 3.1 6.4 6.4 6.4 3.6 0 6.4-2.8 6.7-6.4l4.4-66.9-4.4-145.3c-.3-3.6-3.1-6.7-6.7-6.7zm26.7 3.4c-3.9 0-6.9 3.1-6.9 6.9L227 321.3l3.9 66.4c.3 3.9 3.1 6.9 6.9 6.9s6.9-3.1 6.9-6.9l4.2-66.4-4.2-141.7c0-3.9-3-6.9-6.9-6.9z\"]\n};\nvar faDigg = {\n prefix: 'fab',\n iconName: 'digg',\n icon: [512, 512, [], \"f1a6\", \"M81.7 172.3H0v174.4h132.7V96h-51v76.3zm0 133.4H50.9v-92.3h30.8v92.3zm297.2-133.4v174.4h81.8v28.5h-81.8V416H512V172.3H378.9zm81.8 133.4h-30.8v-92.3h30.8v92.3zm-235.6 41h82.1v28.5h-82.1V416h133.3V172.3H225.1v174.4zm51.2-133.3h30.8v92.3h-30.8v-92.3zM153.3 96h51.3v51h-51.3V96zm0 76.3h51.3v174.4h-51.3V172.3z\"]\n};\nvar faTencentWeibo = {\n prefix: 'fab',\n iconName: 'tencent-weibo',\n icon: [384, 512, [], \"f1d5\", \"M72.3 495.8c1.4 19.9-27.6 22.2-29.7 2.9C31 368.8 73.7 259.2 144 185.5c-15.6-34 9.2-77.1 50.6-77.1 30.3 0 55.1 24.6 55.1 55.1 0 44-49.5 70.8-86.9 45.1-65.7 71.3-101.4 169.8-90.5 287.2zM192 .1C66.1.1-12.3 134.3 43.7 242.4 52.4 259.8 79 246.9 70 229 23.7 136.4 91 29.8 192 29.8c75.4 0 136.9 61.4 136.9 136.9 0 90.8-86.9 153.9-167.7 133.1-19.1-4.1-25.6 24.4-6.6 29.1 110.7 23.2 204-60 204-162.3C358.6 74.7 284 .1 192 .1z\"]\n};\nvar faSymfony = {\n prefix: 'fab',\n iconName: 'symfony',\n icon: [512, 512, [], \"f83d\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm133.74 143.54c-11.47.41-19.4-6.45-19.77-16.87-.27-9.18 6.68-13.44 6.53-18.85-.23-6.55-10.16-6.82-12.87-6.67-39.78 1.29-48.59 57-58.89 113.85 21.43 3.15 36.65-.72 45.14-6.22 12-7.75-3.34-15.72-1.42-24.56 4-18.16 32.55-19 32 5.3-.36 17.86-25.92 41.81-77.6 35.7-10.76 59.52-18.35 115-58.2 161.72-29 34.46-58.4 39.82-71.58 40.26-24.65.85-41-12.31-41.58-29.84-.56-17 14.45-26.26 24.31-26.59 21.89-.75 30.12 25.67 14.88 34-12.09 9.71.11 12.61 2.05 12.55 10.42-.36 17.34-5.51 22.18-9 24-20 33.24-54.86 45.35-118.35 8.19-49.66 17-78 18.23-82-16.93-12.75-27.08-28.55-49.85-34.72-15.61-4.23-25.12-.63-31.81 7.83-7.92 10-5.29 23 2.37 30.7l12.63 14c15.51 17.93 24 31.87 20.8 50.62-5.06 29.93-40.72 52.9-82.88 39.94-36-11.11-42.7-36.56-38.38-50.62 7.51-24.15 42.36-11.72 34.62 13.6-2.79 8.6-4.92 8.68-6.28 13.07-4.56 14.77 41.85 28.4 51-1.39 4.47-14.52-5.3-21.71-22.25-39.85-28.47-31.75-16-65.49 2.95-79.67C204.23 140.13 251.94 197 262 205.29c37.17-109 100.53-105.46 102.43-105.53 25.16-.81 44.19 10.59 44.83 28.65.25 7.69-4.17 22.59-19.52 23.13z\"]\n};\nvar faMaxcdn = {\n prefix: 'fab',\n iconName: 'maxcdn',\n icon: [512, 512, [], \"f136\", \"M461.1 442.7h-97.4L415.6 200c2.3-10.2.9-19.5-4.4-25.7-5-6.1-13.7-9.6-24.2-9.6h-49.3l-59.5 278h-97.4l59.5-278h-83.4l-59.5 278H0l59.5-278-44.6-95.4H387c39.4 0 75.3 16.3 98.3 44.9 23.3 28.6 31.8 67.4 23.6 105.9l-47.8 222.6z\"]\n};\nvar faEtsy = {\n prefix: 'fab',\n iconName: 'etsy',\n icon: [384, 512, [], \"f2d7\", \"M384 348c-1.75 10.75-13.75 110-15.5 132-117.879-4.299-219.895-4.743-368.5 0v-25.5c45.457-8.948 60.627-8.019 61-35.25 1.793-72.322 3.524-244.143 0-322-1.029-28.46-12.13-26.765-61-36v-25.5c73.886 2.358 255.933 8.551 362.999-3.75-3.5 38.25-7.75 126.5-7.75 126.5H332C320.947 115.665 313.241 68 277.25 68h-137c-10.25 0-10.75 3.5-10.75 9.75V241.5c58 .5 88.5-2.5 88.5-2.5 29.77-.951 27.56-8.502 40.75-65.251h25.75c-4.407 101.351-3.91 61.829-1.75 160.25H257c-9.155-40.086-9.065-61.045-39.501-61.5 0 0-21.5-2-88-2v139c0 26 14.25 38.25 44.25 38.25H263c63.636 0 66.564-24.996 98.751-99.75H384z\"]\n};\nvar faFacebookMessenger = {\n prefix: 'fab',\n iconName: 'facebook-messenger',\n icon: [512, 512, [], \"f39f\", \"M256.55 8C116.52 8 8 110.34 8 248.57c0 72.3 29.71 134.78 78.07 177.94 8.35 7.51 6.63 11.86 8.05 58.23A19.92 19.92 0 0 0 122 502.31c52.91-23.3 53.59-25.14 62.56-22.7C337.85 521.8 504 423.7 504 248.57 504 110.34 396.59 8 256.55 8zm149.24 185.13l-73 115.57a37.37 37.37 0 0 1-53.91 9.93l-58.08-43.47a15 15 0 0 0-18 0l-78.37 59.44c-10.46 7.93-24.16-4.6-17.11-15.67l73-115.57a37.36 37.36 0 0 1 53.91-9.93l58.06 43.46a15 15 0 0 0 18 0l78.41-59.38c10.44-7.98 24.14 4.54 17.09 15.62z\"]\n};\nvar faAudible = {\n prefix: 'fab',\n iconName: 'audible',\n icon: [640, 512, [], \"f373\", \"M640 199.9v54l-320 200L0 254v-54l320 200 320-200.1zm-194.5 72l47.1-29.4c-37.2-55.8-100.7-92.6-172.7-92.6-72 0-135.5 36.7-172.6 92.4h.3c2.5-2.3 5.1-4.5 7.7-6.7 89.7-74.4 219.4-58.1 290.2 36.3zm-220.1 18.8c16.9-11.9 36.5-18.7 57.4-18.7 34.4 0 65.2 18.4 86.4 47.6l45.4-28.4c-20.9-29.9-55.6-49.5-94.8-49.5-38.9 0-73.4 19.4-94.4 49zM103.6 161.1c131.8-104.3 318.2-76.4 417.5 62.1l.7 1 48.8-30.4C517.1 112.1 424.8 58.1 319.9 58.1c-103.5 0-196.6 53.5-250.5 135.6 9.9-10.5 22.7-23.5 34.2-32.6zm467 32.7z\"]\n};\nvar faThinkPeaks = {\n prefix: 'fab',\n iconName: 'think-peaks',\n icon: [576, 512, [], \"f731\", \"M465.4 409.4l87.1-150.2-32-.3-55.1 95L259.2 0 23 407.4l32 .3L259.2 55.6zm-355.3-44.1h32.1l117.4-202.5L463 511.9l32.5.1-235.8-404.6z\"]\n};\nvar faBilibili = {\n prefix: 'fab',\n iconName: 'bilibili',\n icon: [512, 512, [], \"e3d9\", \"M488.6 104.1C505.3 122.2 513 143.8 511.9 169.8V372.2C511.5 398.6 502.7 420.3 485.4 437.3C468.2 454.3 446.3 463.2 419.9 464H92.02C65.57 463.2 43.81 454.2 26.74 436.8C9.682 419.4 .7667 396.5 0 368.2V169.8C.7667 143.8 9.682 122.2 26.74 104.1C43.81 87.75 65.57 78.77 92.02 78H121.4L96.05 52.19C90.3 46.46 87.42 39.19 87.42 30.4C87.42 21.6 90.3 14.34 96.05 8.603C101.8 2.868 109.1 0 117.9 0C126.7 0 134 2.868 139.8 8.603L213.1 78H301.1L375.6 8.603C381.7 2.868 389.2 0 398 0C406.8 0 414.1 2.868 419.9 8.603C425.6 14.34 428.5 21.6 428.5 30.4C428.5 39.19 425.6 46.46 419.9 52.19L394.6 78L423.9 78C450.3 78.77 471.9 87.75 488.6 104.1H488.6zM449.8 173.8C449.4 164.2 446.1 156.4 439.1 150.3C433.9 144.2 425.1 140.9 416.4 140.5H96.05C86.46 140.9 78.6 144.2 72.47 150.3C66.33 156.4 63.07 164.2 62.69 173.8V368.2C62.69 377.4 65.95 385.2 72.47 391.7C78.99 398.2 86.85 401.5 96.05 401.5H416.4C425.6 401.5 433.4 398.2 439.7 391.7C446 385.2 449.4 377.4 449.8 368.2L449.8 173.8zM185.5 216.5C191.8 222.8 195.2 230.6 195.6 239.7V273C195.2 282.2 191.9 289.9 185.8 296.2C179.6 302.5 171.8 305.7 162.2 305.7C152.6 305.7 144.7 302.5 138.6 296.2C132.5 289.9 129.2 282.2 128.8 273V239.7C129.2 230.6 132.6 222.8 138.9 216.5C145.2 210.2 152.1 206.9 162.2 206.5C171.4 206.9 179.2 210.2 185.5 216.5H185.5zM377 216.5C383.3 222.8 386.7 230.6 387.1 239.7V273C386.7 282.2 383.4 289.9 377.3 296.2C371.2 302.5 363.3 305.7 353.7 305.7C344.1 305.7 336.3 302.5 330.1 296.2C323.1 289.9 320.7 282.2 320.4 273V239.7C320.7 230.6 324.1 222.8 330.4 216.5C336.7 210.2 344.5 206.9 353.7 206.5C362.9 206.9 370.7 210.2 377 216.5H377z\"]\n};\nvar faErlang = {\n prefix: 'fab',\n iconName: 'erlang',\n icon: [640, 512, [], \"f39d\", \"M87.2 53.5H0v405h100.4c-49.7-52.6-78.8-125.3-78.7-212.1-.1-76.7 24-142.7 65.5-192.9zm238.2 9.7c-45.9.1-85.1 33.5-89.2 83.2h169.9c-1.1-49.7-34.5-83.1-80.7-83.2zm230.7-9.6h.3l-.1-.1zm.3 0c31.4 42.7 48.7 97.5 46.2 162.7.5 6 .5 11.7 0 24.1H230.2c-.2 109.7 38.9 194.9 138.6 195.3 68.5-.3 118-51 151.9-106.1l96.4 48.2c-17.4 30.9-36.5 57.8-57.9 80.8H640v-405z\"]\n};\nvar faCottonBureau = {\n prefix: 'fab',\n iconName: 'cotton-bureau',\n icon: [512, 512, [], \"f89e\", \"M474.31 330.41c-23.66 91.85-94.23 144.59-201.9 148.35V429.6c0-48 26.41-74.39 74.39-74.39 62 0 99.2-37.2 99.2-99.21 0-61.37-36.53-98.28-97.38-99.06-33-69.32-146.5-64.65-177.24 0C110.52 157.72 74 194.63 74 256c0 62.13 37.27 99.41 99.4 99.41 48 0 74.55 26.23 74.55 74.39V479c-134.43-5-211.1-85.07-211.1-223 0-141.82 81.35-223.2 223.2-223.2 114.77 0 189.84 53.2 214.69 148.81H500C473.88 71.51 388.22 8 259.82 8 105 8 12 101.19 12 255.82 12 411.14 105.19 504.34 259.82 504c128.27 0 213.87-63.81 239.67-173.59zM357 182.33c41.37 3.45 64.2 29 64.2 73.67 0 48-26.43 74.41-74.4 74.41-28.61 0-49.33-9.59-61.59-27.33 83.06-16.55 75.59-99.67 71.79-120.75zm-81.68 97.36c-2.46-10.34-16.33-87 56.23-97 2.27 10.09 16.52 87.11-56.26 97zM260 132c28.61 0 49 9.67 61.44 27.61-28.36 5.48-49.36 20.59-61.59 43.45-12.23-22.86-33.23-38-61.6-43.45 12.41-17.69 33.27-27.35 61.57-27.35zm-71.52 50.72c73.17 10.57 58.91 86.81 56.49 97-72.41-9.84-59-86.95-56.25-97zM173.2 330.41c-48 0-74.4-26.4-74.4-74.41 0-44.36 22.86-70 64.22-73.67-6.75 37.2-1.38 106.53 71.65 120.75-12.14 17.63-32.84 27.3-61.14 27.3zm53.21 12.39A80.8 80.8 0 0 0 260 309.25c7.77 14.49 19.33 25.54 33.82 33.55a80.28 80.28 0 0 0-33.58 33.83c-8-14.5-19.07-26.23-33.56-33.83z\"]\n};\nvar faDashcube = {\n prefix: 'fab',\n iconName: 'dashcube',\n icon: [448, 512, [], \"f210\", \"M326.6 104H110.4c-51.1 0-91.2 43.3-91.2 93.5V427c0 50.5 40.1 85 91.2 85h227.2c51.1 0 91.2-34.5 91.2-85V0L326.6 104zM153.9 416.5c-17.7 0-32.4-15.1-32.4-32.8V240.8c0-17.7 14.7-32.5 32.4-32.5h140.7c17.7 0 32 14.8 32 32.5v123.5l51.1 52.3H153.9z\"]\n};\nvar fa42Group = {\n prefix: 'fab',\n iconName: '42-group',\n icon: [640, 512, [\"innosoft\"], \"e080\", \"M320 96V416C341.011 416 361.818 411.861 381.23 403.821C400.641 395.78 418.28 383.995 433.138 369.138C447.995 354.28 459.78 336.641 467.821 317.23C475.861 297.818 480 277.011 480 256C480 234.989 475.861 214.182 467.821 194.771C459.78 175.359 447.995 157.72 433.138 142.863C418.28 128.005 400.641 116.22 381.23 108.179C361.818 100.139 341.011 96 320 96ZM0 256L160.002 416L320.003 256L160.002 96L0 256ZM480 256C480 277.011 484.138 297.818 492.179 317.23C500.219 336.643 512.005 354.28 526.862 369.138C541.72 383.995 559.357 395.781 578.77 403.821C598.182 411.862 618.989 416 640 416V96C597.565 96 556.869 112.858 526.862 142.863C496.857 172.869 480 213.565 480 256Z\"]\n};\nvar faInnosoft = fa42Group;\nvar faStackExchange = {\n prefix: 'fab',\n iconName: 'stack-exchange',\n icon: [448, 512, [], \"f18d\", \"M17.7 332.3h412.7v22c0 37.7-29.3 68-65.3 68h-19L259.3 512v-89.7H83c-36 0-65.3-30.3-65.3-68v-22zm0-23.6h412.7v-85H17.7v85zm0-109.4h412.7v-85H17.7v85zM365 0H83C47 0 17.7 30.3 17.7 67.7V90h412.7V67.7C430.3 30.3 401 0 365 0z\"]\n};\nvar faElementor = {\n prefix: 'fab',\n iconName: 'elementor',\n icon: [512, 512, [], \"f430\", \"M.361 256C.361 397 114 511 255 511C397 511 511 397 511 256C511 116 397 2.05 255 2.05C114 2.05 .361 116 .361 256zM192 150V363H149V150H192zM234 150H362V193H234V150zM362 235V278H234V235H362zM234 320H362V363H234V320z\"]\n};\nvar faSquarePiedPiper = {\n prefix: 'fab',\n iconName: 'square-pied-piper',\n icon: [448, 512, [\"pied-piper-square\"], \"e01e\", \"M32 419L0 479.2l.8-328C.8 85.3 54 32 120 32h327.2c-93 28.9-189.9 94.2-253.9 168.6C122.7 282 82.6 338 32 419M448 32S305.2 98.8 261.6 199.1c-23.2 53.6-28.9 118.1-71 158.6-28.9 27.8-69.8 38.2-105.3 56.3-23.2 12-66.4 40.5-84.9 66h328.4c66 0 119.3-53.3 119.3-119.2-.1 0-.1-328.8-.1-328.8z\"]\n};\nvar faPiedPiperSquare = faSquarePiedPiper;\nvar faCreativeCommonsNd = {\n prefix: 'fab',\n iconName: 'creative-commons-nd',\n icon: [496, 512, [], \"f4eb\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm94 144.3v42.5H162.1V197h180.3zm0 79.8v42.5H162.1v-42.5h180.3z\"]\n};\nvar faPalfed = {\n prefix: 'fab',\n iconName: 'palfed',\n icon: [576, 512, [], \"f3d8\", \"M384.9 193.9c0-47.4-55.2-44.2-95.4-29.8-1.3 39.4-2.5 80.7-3 119.8.7 2.8 2.6 6.2 15.1 6.2 36.8 0 83.4-42.8 83.3-96.2zm-194.5 72.2c.2 0 6.5-2.7 11.2-2.7 26.6 0 20.7 44.1-14.4 44.1-21.5 0-37.1-18.1-37.1-43 0-42 42.9-95.6 100.7-126.5 1-12.4 3-22 10.5-28.2 11.2-9 26.6-3.5 29.5 11.1 72.2-22.2 135.2 1 135.2 72 0 77.9-79.3 152.6-140.1 138.2-.1 39.4.9 74.4 2.7 100v.2c.2 3.4.6 12.5-5.3 19.1-9.6 10.6-33.4 10-36.4-22.3-4.1-44.4.2-206.1 1.4-242.5-21.5 15-58.5 50.3-58.5 75.9.2 2.5.4 4 .6 4.6zM8 181.1s-.1 37.4 38.4 37.4h30l22.4 217.2s0 44.3 44.7 44.3h288.9s44.7-.4 44.7-44.3l22.4-217.2h30s38.4 1.2 38.4-37.4c0 0 .1-37.4-38.4-37.4h-30.1c-7.3-25.6-30.2-74.3-119.4-74.3h-28V50.3s-2.7-18.4-21.1-18.4h-85.8s-21.1 0-21.1 18.4v19.1h-28.1s-105 4.2-120.5 74.3h-29S8 142.5 8 181.1z\"]\n};\nvar faSuperpowers = {\n prefix: 'fab',\n iconName: 'superpowers',\n icon: [448, 512, [], \"f2dd\", \"M448 32c-83.3 11-166.8 22-250 33-92 12.5-163.3 86.7-169 180-3.3 55.5 18 109.5 57.8 148.2L0 480c83.3-11 166.5-22 249.8-33 91.8-12.5 163.3-86.8 168.7-179.8 3.5-55.5-18-109.5-57.7-148.2L448 32zm-79.7 232.3c-4.2 79.5-74 139.2-152.8 134.5-79.5-4.7-140.7-71-136.3-151 4.5-79.2 74.3-139.3 153-134.5 79.3 4.7 140.5 71 136.1 151z\"]\n};\nvar faResolving = {\n prefix: 'fab',\n iconName: 'resolving',\n icon: [496, 512, [], \"f3e7\", \"M281.2 278.2c46-13.3 49.6-23.5 44-43.4L314 195.5c-6.1-20.9-18.4-28.1-71.1-12.8L54.7 236.8l28.6 98.6 197.9-57.2zM248.5 8C131.4 8 33.2 88.7 7.2 197.5l221.9-63.9c34.8-10.2 54.2-11.7 79.3-8.2 36.3 6.1 52.7 25 61.4 55.2l10.7 37.8c8.2 28.1 1 50.6-23.5 73.6-19.4 17.4-31.2 24.5-61.4 33.2L203 351.8l220.4 27.1 9.7 34.2-48.1 13.3-286.8-37.3 23 80.2c36.8 22 80.3 34.7 126.3 34.7 137 0 248.5-111.4 248.5-248.3C497 119.4 385.5 8 248.5 8zM38.3 388.6L0 256.8c0 48.5 14.3 93.4 38.3 131.8z\"]\n};\nvar faXbox = {\n prefix: 'fab',\n iconName: 'xbox',\n icon: [512, 512, [], \"f412\", \"M369.9 318.2c44.3 54.3 64.7 98.8 54.4 118.7-7.9 15.1-56.7 44.6-92.6 55.9-29.6 9.3-68.4 13.3-100.4 10.2-38.2-3.7-76.9-17.4-110.1-39C93.3 445.8 87 438.3 87 423.4c0-29.9 32.9-82.3 89.2-142.1 32-33.9 76.5-73.7 81.4-72.6 9.4 2.1 84.3 75.1 112.3 109.5zM188.6 143.8c-29.7-26.9-58.1-53.9-86.4-63.4-15.2-5.1-16.3-4.8-28.7 8.1-29.2 30.4-53.5 79.7-60.3 122.4-5.4 34.2-6.1 43.8-4.2 60.5 5.6 50.5 17.3 85.4 40.5 120.9 9.5 14.6 12.1 17.3 9.3 9.9-4.2-11-.3-37.5 9.5-64 14.3-39 53.9-112.9 120.3-194.4zm311.6 63.5C483.3 127.3 432.7 77 425.6 77c-7.3 0-24.2 6.5-36 13.9-23.3 14.5-41 31.4-64.3 52.8C367.7 197 427.5 283.1 448.2 346c6.8 20.7 9.7 41.1 7.4 52.3-1.7 8.5-1.7 8.5 1.4 4.6 6.1-7.7 19.9-31.3 25.4-43.5 7.4-16.2 15-40.2 18.6-58.7 4.3-22.5 3.9-70.8-.8-93.4zM141.3 43C189 40.5 251 77.5 255.6 78.4c.7.1 10.4-4.2 21.6-9.7 63.9-31.1 94-25.8 107.4-25.2-63.9-39.3-152.7-50-233.9-11.7-23.4 11.1-24 11.9-9.4 11.2z\"]\n};\nvar faSearchengin = {\n prefix: 'fab',\n iconName: 'searchengin',\n icon: [460, 512, [], \"f3eb\", \"M220.6 130.3l-67.2 28.2V43.2L98.7 233.5l54.7-24.2v130.3l67.2-209.3zm-83.2-96.7l-1.3 4.7-15.2 52.9C80.6 106.7 52 145.8 52 191.5c0 52.3 34.3 95.9 83.4 105.5v53.6C57.5 340.1 0 272.4 0 191.6c0-80.5 59.8-147.2 137.4-158zm311.4 447.2c-11.2 11.2-23.1 12.3-28.6 10.5-5.4-1.8-27.1-19.9-60.4-44.4-33.3-24.6-33.6-35.7-43-56.7-9.4-20.9-30.4-42.6-57.5-52.4l-9.7-14.7c-24.7 16.9-53 26.9-81.3 28.7l2.1-6.6 15.9-49.5c46.5-11.9 80.9-54 80.9-104.2 0-54.5-38.4-102.1-96-107.1V32.3C254.4 37.4 320 106.8 320 191.6c0 33.6-11.2 64.7-29 90.4l14.6 9.6c9.8 27.1 31.5 48 52.4 57.4s32.2 9.7 56.8 43c24.6 33.2 42.7 54.9 44.5 60.3s.7 17.3-10.5 28.5zm-9.9-17.9c0-4.4-3.6-8-8-8s-8 3.6-8 8 3.6 8 8 8 8-3.6 8-8z\"]\n};\nvar faTiktok = {\n prefix: 'fab',\n iconName: 'tiktok',\n icon: [448, 512, [], \"e07b\", \"M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z\"]\n};\nvar faSquareFacebook = {\n prefix: 'fab',\n iconName: 'square-facebook',\n icon: [448, 512, [\"facebook-square\"], \"f082\", \"M400 32H48A48 48 0 0 0 0 80v352a48 48 0 0 0 48 48h137.25V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.27c-30.81 0-40.42 19.12-40.42 38.73V256h68.78l-11 71.69h-57.78V480H400a48 48 0 0 0 48-48V80a48 48 0 0 0-48-48z\"]\n};\nvar faFacebookSquare = faSquareFacebook;\nvar faRenren = {\n prefix: 'fab',\n iconName: 'renren',\n icon: [512, 512, [], \"f18b\", \"M214 169.1c0 110.4-61 205.4-147.6 247.4C30 373.2 8 317.7 8 256.6 8 133.9 97.1 32.2 214 12.5v156.6zM255 504c-42.9 0-83.3-11-118.5-30.4C193.7 437.5 239.9 382.9 255 319c15.5 63.9 61.7 118.5 118.8 154.7C338.7 493 298.3 504 255 504zm190.6-87.5C359 374.5 298 279.6 298 169.1V12.5c116.9 19.7 206 121.4 206 244.1 0 61.1-22 116.6-58.4 159.9z\"]\n};\nvar faLinux = {\n prefix: 'fab',\n iconName: 'linux',\n icon: [448, 512, [], \"f17c\", \"M220.8 123.3c1 .5 1.8 1.7 3 1.7 1.1 0 2.8-.4 2.9-1.5.2-1.4-1.9-2.3-3.2-2.9-1.7-.7-3.9-1-5.5-.1-.4.2-.8.7-.6 1.1.3 1.3 2.3 1.1 3.4 1.7zm-21.9 1.7c1.2 0 2-1.2 3-1.7 1.1-.6 3.1-.4 3.5-1.6.2-.4-.2-.9-.6-1.1-1.6-.9-3.8-.6-5.5.1-1.3.6-3.4 1.5-3.2 2.9.1 1 1.8 1.5 2.8 1.4zM420 403.8c-3.6-4-5.3-11.6-7.2-19.7-1.8-8.1-3.9-16.8-10.5-22.4-1.3-1.1-2.6-2.1-4-2.9-1.3-.8-2.7-1.5-4.1-2 9.2-27.3 5.6-54.5-3.7-79.1-11.4-30.1-31.3-56.4-46.5-74.4-17.1-21.5-33.7-41.9-33.4-72C311.1 85.4 315.7.1 234.8 0 132.4-.2 158 103.4 156.9 135.2c-1.7 23.4-6.4 41.8-22.5 64.7-18.9 22.5-45.5 58.8-58.1 96.7-6 17.9-8.8 36.1-6.2 53.3-6.5 5.8-11.4 14.7-16.6 20.2-4.2 4.3-10.3 5.9-17 8.3s-14 6-18.5 14.5c-2.1 3.9-2.8 8.1-2.8 12.4 0 3.9.6 7.9 1.2 11.8 1.2 8.1 2.5 15.7.8 20.8-5.2 14.4-5.9 24.4-2.2 31.7 3.8 7.3 11.4 10.5 20.1 12.3 17.3 3.6 40.8 2.7 59.3 12.5 19.8 10.4 39.9 14.1 55.9 10.4 11.6-2.6 21.1-9.6 25.9-20.2 12.5-.1 26.3-5.4 48.3-6.6 14.9-1.2 33.6 5.3 55.1 4.1.6 2.3 1.4 4.6 2.5 6.7v.1c8.3 16.7 23.8 24.3 40.3 23 16.6-1.3 34.1-11 48.3-27.9 13.6-16.4 36-23.2 50.9-32.2 7.4-4.5 13.4-10.1 13.9-18.3.4-8.2-4.4-17.3-15.5-29.7zM223.7 87.3c9.8-22.2 34.2-21.8 44-.4 6.5 14.2 3.6 30.9-4.3 40.4-1.6-.8-5.9-2.6-12.6-4.9 1.1-1.2 3.1-2.7 3.9-4.6 4.8-11.8-.2-27-9.1-27.3-7.3-.5-13.9 10.8-11.8 23-4.1-2-9.4-3.5-13-4.4-1-6.9-.3-14.6 2.9-21.8zM183 75.8c10.1 0 20.8 14.2 19.1 33.5-3.5 1-7.1 2.5-10.2 4.6 1.2-8.9-3.3-20.1-9.6-19.6-8.4.7-9.8 21.2-1.8 28.1 1 .8 1.9-.2-5.9 5.5-15.6-14.6-10.5-52.1 8.4-52.1zm-13.6 60.7c6.2-4.6 13.6-10 14.1-10.5 4.7-4.4 13.5-14.2 27.9-14.2 7.1 0 15.6 2.3 25.9 8.9 6.3 4.1 11.3 4.4 22.6 9.3 8.4 3.5 13.7 9.7 10.5 18.2-2.6 7.1-11 14.4-22.7 18.1-11.1 3.6-19.8 16-38.2 14.9-3.9-.2-7-1-9.6-2.1-8-3.5-12.2-10.4-20-15-8.6-4.8-13.2-10.4-14.7-15.3-1.4-4.9 0-9 4.2-12.3zm3.3 334c-2.7 35.1-43.9 34.4-75.3 18-29.9-15.8-68.6-6.5-76.5-21.9-2.4-4.7-2.4-12.7 2.6-26.4v-.2c2.4-7.6.6-16-.6-23.9-1.2-7.8-1.8-15 .9-20 3.5-6.7 8.5-9.1 14.8-11.3 10.3-3.7 11.8-3.4 19.6-9.9 5.5-5.7 9.5-12.9 14.3-18 5.1-5.5 10-8.1 17.7-6.9 8.1 1.2 15.1 6.8 21.9 16l19.6 35.6c9.5 19.9 43.1 48.4 41 68.9zm-1.4-25.9c-4.1-6.6-9.6-13.6-14.4-19.6 7.1 0 14.2-2.2 16.7-8.9 2.3-6.2 0-14.9-7.4-24.9-13.5-18.2-38.3-32.5-38.3-32.5-13.5-8.4-21.1-18.7-24.6-29.9s-3-23.3-.3-35.2c5.2-22.9 18.6-45.2 27.2-59.2 2.3-1.7.8 3.2-8.7 20.8-8.5 16.1-24.4 53.3-2.6 82.4.6-20.7 5.5-41.8 13.8-61.5 12-27.4 37.3-74.9 39.3-112.7 1.1.8 4.6 3.2 6.2 4.1 4.6 2.7 8.1 6.7 12.6 10.3 12.4 10 28.5 9.2 42.4 1.2 6.2-3.5 11.2-7.5 15.9-9 9.9-3.1 17.8-8.6 22.3-15 7.7 30.4 25.7 74.3 37.2 95.7 6.1 11.4 18.3 35.5 23.6 64.6 3.3-.1 7 .4 10.9 1.4 13.8-35.7-11.7-74.2-23.3-84.9-4.7-4.6-4.9-6.6-2.6-6.5 12.6 11.2 29.2 33.7 35.2 59 2.8 11.6 3.3 23.7.4 35.7 16.4 6.8 35.9 17.9 30.7 34.8-2.2-.1-3.2 0-4.2 0 3.2-10.1-3.9-17.6-22.8-26.1-19.6-8.6-36-8.6-38.3 12.5-12.1 4.2-18.3 14.7-21.4 27.3-2.8 11.2-3.6 24.7-4.4 39.9-.5 7.7-3.6 18-6.8 29-32.1 22.9-76.7 32.9-114.3 7.2zm257.4-11.5c-.9 16.8-41.2 19.9-63.2 46.5-13.2 15.7-29.4 24.4-43.6 25.5s-26.5-4.8-33.7-19.3c-4.7-11.1-2.4-23.1 1.1-36.3 3.7-14.2 9.2-28.8 9.9-40.6.8-15.2 1.7-28.5 4.2-38.7 2.6-10.3 6.6-17.2 13.7-21.1.3-.2.7-.3 1-.5.8 13.2 7.3 26.6 18.8 29.5 12.6 3.3 30.7-7.5 38.4-16.3 9-.3 15.7-.9 22.6 5.1 9.9 8.5 7.1 30.3 17.1 41.6 10.6 11.6 14 19.5 13.7 24.6zM173.3 148.7c2 1.9 4.7 4.5 8 7.1 6.6 5.2 15.8 10.6 27.3 10.6 11.6 0 22.5-5.9 31.8-10.8 4.9-2.6 10.9-7 14.8-10.4s5.9-6.3 3.1-6.6-2.6 2.6-6 5.1c-4.4 3.2-9.7 7.4-13.9 9.8-7.4 4.2-19.5 10.2-29.9 10.2s-18.7-4.8-24.9-9.7c-3.1-2.5-5.7-5-7.7-6.9-1.5-1.4-1.9-4.6-4.3-4.9-1.4-.1-1.8 3.7 1.7 6.5z\"]\n};\nvar faGlide = {\n prefix: 'fab',\n iconName: 'glide',\n icon: [448, 512, [], \"f2a5\", \"M252.8 148.6c0 8.8-1.6 17.7-3.4 26.4-5.8 27.8-11.6 55.8-17.3 83.6-1.4 6.3-8.3 4.9-13.7 4.9-23.8 0-30.5-26-30.5-45.5 0-29.3 11.2-68.1 38.5-83.1 4.3-2.5 9.2-4.2 14.1-4.2 11.4 0 12.3 8.3 12.3 17.9zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zm-64 187c0-5.1-20.8-37.7-25.5-39.5-2.2-.9-7.2-2.3-9.6-2.3-23.1 0-38.7 10.5-58.2 21.5l-.5-.5c4.3-29.4 14.6-57.2 14.6-87.4 0-44.6-23.8-62.7-67.5-62.7-71.7 0-108 70.8-108 123.5 0 54.7 32 85 86.3 85 7.5 0 6.9-.6 6.9 2.3-10.5 80.3-56.5 82.9-56.5 58.9 0-24.4 28-36.5 28.3-38-.2-7.6-29.3-17.2-36.7-17.2-21.1 0-32.7 33-32.7 50.6 0 32.3 20.4 54.7 53.3 54.7 48.2 0 83.4-49.7 94.3-91.7 9.4-37.7 7-39.4 12.3-42.1 20-10.1 35.8-16.8 58.4-16.8 11.1 0 19 2.3 36.7 5.2 1.8.1 4.1-1.7 4.1-3.5z\"]\n};\nvar faLinkedin = {\n prefix: 'fab',\n iconName: 'linkedin',\n icon: [448, 512, [], \"f08c\", \"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\"]\n};\nvar faHubspot = {\n prefix: 'fab',\n iconName: 'hubspot',\n icon: [512, 512, [], \"f3b2\", \"M267.4 211.6c-25.1 23.7-40.8 57.3-40.8 94.6 0 29.3 9.7 56.3 26 78L203.1 434c-4.4-1.6-9.1-2.5-14-2.5-10.8 0-20.9 4.2-28.5 11.8-7.6 7.6-11.8 17.8-11.8 28.6s4.2 20.9 11.8 28.5c7.6 7.6 17.8 11.6 28.5 11.6 10.8 0 20.9-3.9 28.6-11.6 7.6-7.6 11.8-17.8 11.8-28.5 0-4.2-.6-8.2-1.9-12.1l50-50.2c22 16.9 49.4 26.9 79.3 26.9 71.9 0 130-58.3 130-130.2 0-65.2-47.7-119.2-110.2-128.7V116c17.5-7.4 28.2-23.8 28.2-42.9 0-26.1-20.9-47.9-47-47.9S311.2 47 311.2 73.1c0 19.1 10.7 35.5 28.2 42.9v61.2c-15.2 2.1-29.6 6.7-42.7 13.6-27.6-20.9-117.5-85.7-168.9-124.8 1.2-4.4 2-9 2-13.8C129.8 23.4 106.3 0 77.4 0 48.6 0 25.2 23.4 25.2 52.2c0 28.9 23.4 52.3 52.2 52.3 9.8 0 18.9-2.9 26.8-7.6l163.2 114.7zm89.5 163.6c-38.1 0-69-30.9-69-69s30.9-69 69-69 69 30.9 69 69-30.9 69-69 69z\"]\n};\nvar faDeploydog = {\n prefix: 'fab',\n iconName: 'deploydog',\n icon: [512, 512, [], \"f38e\", \"M382.2 136h51.7v239.6h-51.7v-20.7c-19.8 24.8-52.8 24.1-73.8 14.7-26.2-11.7-44.3-38.1-44.3-71.8 0-29.8 14.8-57.9 43.3-70.8 20.2-9.1 52.7-10.6 74.8 12.9V136zm-64.7 161.8c0 18.2 13.6 33.5 33.2 33.5 19.8 0 33.2-16.4 33.2-32.9 0-17.1-13.7-33.2-33.2-33.2-19.6 0-33.2 16.4-33.2 32.6zM188.5 136h51.7v239.6h-51.7v-20.7c-19.8 24.8-52.8 24.1-73.8 14.7-26.2-11.7-44.3-38.1-44.3-71.8 0-29.8 14.8-57.9 43.3-70.8 20.2-9.1 52.7-10.6 74.8 12.9V136zm-64.7 161.8c0 18.2 13.6 33.5 33.2 33.5 19.8 0 33.2-16.4 33.2-32.9 0-17.1-13.7-33.2-33.2-33.2-19.7 0-33.2 16.4-33.2 32.6zM448 96c17.5 0 32 14.4 32 32v256c0 17.5-14.4 32-32 32H64c-17.5 0-32-14.4-32-32V128c0-17.5 14.4-32 32-32h384m0-32H64C28.8 64 0 92.8 0 128v256c0 35.2 28.8 64 64 64h384c35.2 0 64-28.8 64-64V128c0-35.2-28.8-64-64-64z\"]\n};\nvar faTwitch = {\n prefix: 'fab',\n iconName: 'twitch',\n icon: [512, 512, [], \"f1e8\", \"M391.17,103.47H352.54v109.7h38.63ZM285,103H246.37V212.75H285ZM120.83,0,24.31,91.42V420.58H140.14V512l96.53-91.42h77.25L487.69,256V0ZM449.07,237.75l-77.22,73.12H294.61l-67.6,64v-64H140.14V36.58H449.07Z\"]\n};\nvar faRavelry = {\n prefix: 'fab',\n iconName: 'ravelry',\n icon: [512, 512, [], \"f2d9\", \"M498.252,234.223c-1.208-10.34-1.7-20.826-3.746-31a310.306,310.306,0,0,0-9.622-36.6,184.068,184.068,0,0,0-30.874-57.5,251.154,251.154,0,0,0-18.818-21.689,237.362,237.362,0,0,0-47.113-36.116A240.8,240.8,0,0,0,331.356,26.65c-11.018-3.1-22.272-5.431-33.515-7.615-6.78-1.314-13.749-1.667-20.627-2.482-.316-.036-.6-.358-.9-.553q-16.143.009-32.288.006c-2.41.389-4.808.925-7.236,1.15a179.331,179.331,0,0,0-34.256,7.1,221.5,221.5,0,0,0-39.768,16.355,281.385,281.385,0,0,0-38.08,24.158c-6.167,4.61-12.268,9.36-17.974,14.518C96.539,88.494,86.34,97.72,76.785,107.555a243.878,243.878,0,0,0-33.648,43.95,206.488,206.488,0,0,0-20.494,44.6,198.2,198.2,0,0,0-7.691,34.759A201.13,201.13,0,0,0,13.4,266.385a299.716,299.716,0,0,0,4.425,40.24,226.865,226.865,0,0,0,16.73,53.3,210.543,210.543,0,0,0,24,39.528,213.589,213.589,0,0,0,26.358,28.416A251.313,251.313,0,0,0,126.7,458.455a287.831,287.831,0,0,0,55.9,25.277,269.5,269.5,0,0,0,40.641,9.835c6.071,1.01,12.275,1.253,18.412,1.873a4.149,4.149,0,0,1,1.19.56h32.289c2.507-.389,5-.937,7.527-1.143,16.336-1.332,32.107-5.335,47.489-10.717A219.992,219.992,0,0,0,379.1,460.322c9.749-6.447,19.395-13.077,28.737-20.1,5.785-4.348,10.988-9.5,16.3-14.457,3.964-3.7,7.764-7.578,11.51-11.5a232.162,232.162,0,0,0,31.427-41.639c9.542-16.045,17.355-32.905,22.3-50.926,2.859-10.413,4.947-21.045,7.017-31.652,1.032-5.279,1.251-10.723,1.87-16.087.036-.317.358-.6.552-.9V236.005A9.757,9.757,0,0,1,498.252,234.223Zm-161.117-1.15s-16.572-2.98-28.47-2.98c-27.2,0-33.57,14.9-33.57,37.04V360.8H201.582V170.062H275.1v31.931c8.924-26.822,26.771-36.189,62.04-36.189Z\"]\n};\nvar faMixer = {\n prefix: 'fab',\n iconName: 'mixer',\n icon: [512, 512, [], \"e056\", \"M114.57,76.07a45.71,45.71,0,0,0-67.51-6.41c-17.58,16.18-19,43.52-4.75,62.77l91.78,123L41.76,379.58c-14.23,19.25-13.11,46.59,4.74,62.77A45.71,45.71,0,0,0,114,435.94L242.89,262.7a12.14,12.14,0,0,0,0-14.23ZM470.24,379.58,377.91,255.45l91.78-123c14.22-19.25,12.83-46.59-4.75-62.77a45.71,45.71,0,0,0-67.51,6.41l-128,172.12a12.14,12.14,0,0,0,0,14.23L398,435.94a45.71,45.71,0,0,0,67.51,6.41C483.35,426.17,484.47,398.83,470.24,379.58Z\"]\n};\nvar faSquareLastfm = {\n prefix: 'fab',\n iconName: 'square-lastfm',\n icon: [448, 512, [\"lastfm-square\"], \"f203\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-92.2 312.9c-63.4 0-85.4-28.6-97.1-64.1-16.3-51-21.5-84.3-63-84.3-22.4 0-45.1 16.1-45.1 61.2 0 35.2 18 57.2 43.3 57.2 28.6 0 47.6-21.3 47.6-21.3l11.7 31.9s-19.8 19.4-61.2 19.4c-51.3 0-79.9-30.1-79.9-85.8 0-57.9 28.6-92 82.5-92 73.5 0 80.8 41.4 100.8 101.9 8.8 26.8 24.2 46.2 61.2 46.2 24.9 0 38.1-5.5 38.1-19.1 0-19.9-21.8-22-49.9-28.6-30.4-7.3-42.5-23.1-42.5-48 0-40 32.3-52.4 65.2-52.4 37.4 0 60.1 13.6 63 46.6l-36.7 4.4c-1.5-15.8-11-22.4-28.6-22.4-16.1 0-26 7.3-26 19.8 0 11 4.8 17.6 20.9 21.3 32.7 7.1 71.8 12 71.8 57.5.1 36.7-30.7 50.6-76.1 50.6z\"]\n};\nvar faLastfmSquare = faSquareLastfm;\nvar faVimeo = {\n prefix: 'fab',\n iconName: 'vimeo',\n icon: [448, 512, [], \"f40a\", \"M403.2 32H44.8C20.1 32 0 52.1 0 76.8v358.4C0 459.9 20.1 480 44.8 480h358.4c24.7 0 44.8-20.1 44.8-44.8V76.8c0-24.7-20.1-44.8-44.8-44.8zM377 180.8c-1.4 31.5-23.4 74.7-66 129.4-44 57.2-81.3 85.8-111.7 85.8-18.9 0-34.8-17.4-47.9-52.3-25.5-93.3-36.4-148-57.4-148-2.4 0-10.9 5.1-25.4 15.2l-15.2-19.6c37.3-32.8 72.9-69.2 95.2-71.2 25.2-2.4 40.7 14.8 46.5 51.7 20.7 131.2 29.9 151 67.6 91.6 13.5-21.4 20.8-37.7 21.8-48.9 3.5-33.2-25.9-30.9-45.8-22.4 15.9-52.1 46.3-77.4 91.2-76 33.3.9 49 22.5 47.1 64.7z\"]\n};\nvar faMendeley = {\n prefix: 'fab',\n iconName: 'mendeley',\n icon: [640, 512, [], \"f7b3\", \"M624.6 325.2c-12.3-12.4-29.7-19.2-48.4-17.2-43.3-1-49.7-34.9-37.5-98.8 22.8-57.5-14.9-131.5-87.4-130.8-77.4.7-81.7 82-130.9 82-48.1 0-54-81.3-130.9-82-72.9-.8-110.1 73.3-87.4 130.8 12.2 63.9 5.8 97.8-37.5 98.8-21.2-2.3-37 6.5-53 22.5-19.9 19.7-19.3 94.8 42.6 102.6 47.1 5.9 81.6-42.9 61.2-87.8-47.3-103.7 185.9-106.1 146.5-8.2-.1.1-.2.2-.3.4-26.8 42.8 6.8 97.4 58.8 95.2 52.1 2.1 85.4-52.6 58.8-95.2-.1-.2-.2-.3-.3-.4-39.4-97.9 193.8-95.5 146.5 8.2-4.6 10-6.7 21.3-5.7 33 4.9 53.4 68.7 74.1 104.9 35.2 17.8-14.8 23.1-65.6 0-88.3zm-303.9-19.1h-.6c-43.4 0-62.8-37.5-62.8-62.8 0-34.7 28.2-62.8 62.8-62.8h.6c34.7 0 62.8 28.1 62.8 62.8 0 25-19.2 62.8-62.8 62.8z\"]\n};\nvar faUniregistry = {\n prefix: 'fab',\n iconName: 'uniregistry',\n icon: [384, 512, [], \"f404\", \"M192 480c39.5 0 76.2-11.8 106.8-32.2H85.3C115.8 468.2 152.5 480 192 480zm-89.1-193.1v-12.4H0v12.4c0 2.5 0 5 .1 7.4h103.1c-.2-2.4-.3-4.9-.3-7.4zm20.5 57H8.5c2.6 8.5 5.8 16.8 9.6 24.8h138.3c-12.9-5.7-24.1-14.2-33-24.8zm-17.7-34.7H1.3c.9 7.6 2.2 15 3.9 22.3h109.7c-4-6.9-7.2-14.4-9.2-22.3zm-2.8-69.3H0v17.3h102.9zm0-173.2H0v4.9h102.9zm0-34.7H0v2.5h102.9zm0 69.3H0v7.4h102.9zm0 104H0v14.8h102.9zm0-69.3H0v9.9h102.9zm0 34.6H0V183h102.9zm166.2 160.9h109.7c1.8-7.3 3.1-14.7 3.9-22.3H278.3c-2.1 7.9-5.2 15.4-9.2 22.3zm12-185.7H384V136H281.1zm0 37.2H384v-12.4H281.1zm0-74.3H384v-7.4H281.1zm0-76.7v2.5H384V32zm-203 410.9h227.7c11.8-8.7 22.7-18.6 32.2-29.7H44.9c9.6 11 21.4 21 33.2 29.7zm203-371.3H384v-4.9H281.1zm0 148.5H384v-14.8H281.1zM38.8 405.7h305.3c6.7-8.5 12.6-17.6 17.8-27.2H23c5.2 9.6 9.2 18.7 15.8 27.2zm188.8-37.1H367c3.7-8 5.8-16.2 8.5-24.8h-115c-8.8 10.7-20.1 19.2-32.9 24.8zm53.5-81.7c0 2.5-.1 5-.4 7.4h103.1c.1-2.5.2-4.9.2-7.4v-12.4H281.1zm0-29.7H384v-17.3H281.1z\"]\n};\nvar faFigma = {\n prefix: 'fab',\n iconName: 'figma',\n icon: [384, 512, [], \"f799\", \"M14 95.7924C14 42.8877 56.8878 0 109.793 0H274.161C327.066 0 369.954 42.8877 369.954 95.7924C369.954 129.292 352.758 158.776 326.711 175.897C352.758 193.019 369.954 222.502 369.954 256.002C369.954 308.907 327.066 351.795 274.161 351.795H272.081C247.279 351.795 224.678 342.369 207.666 326.904V415.167C207.666 468.777 163.657 512 110.309 512C57.5361 512 14 469.243 14 416.207C14 382.709 31.1945 353.227 57.2392 336.105C31.1945 318.983 14 289.5 14 256.002C14 222.502 31.196 193.019 57.2425 175.897C31.196 158.776 14 129.292 14 95.7924ZM176.288 191.587H109.793C74.2172 191.587 45.3778 220.427 45.3778 256.002C45.3778 291.44 73.9948 320.194 109.381 320.416C109.518 320.415 109.655 320.415 109.793 320.415H176.288V191.587ZM207.666 256.002C207.666 291.577 236.505 320.417 272.081 320.417H274.161C309.737 320.417 338.576 291.577 338.576 256.002C338.576 220.427 309.737 191.587 274.161 191.587H272.081C236.505 191.587 207.666 220.427 207.666 256.002ZM109.793 351.795C109.655 351.795 109.518 351.794 109.381 351.794C73.9948 352.015 45.3778 380.769 45.3778 416.207C45.3778 451.652 74.6025 480.622 110.309 480.622C146.591 480.622 176.288 451.186 176.288 415.167V351.795H109.793ZM109.793 31.3778C74.2172 31.3778 45.3778 60.2173 45.3778 95.7924C45.3778 131.368 74.2172 160.207 109.793 160.207H176.288V31.3778H109.793ZM207.666 160.207H274.161C309.737 160.207 338.576 131.368 338.576 95.7924C338.576 60.2173 309.737 31.3778 274.161 31.3778H207.666V160.207Z\"]\n};\nvar faCreativeCommonsRemix = {\n prefix: 'fab',\n iconName: 'creative-commons-remix',\n icon: [496, 512, [], \"f4ee\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm161.7 207.7l4.9 2.2v70c-7.2 3.6-63.4 27.5-67.3 28.8-6.5-1.8-113.7-46.8-137.3-56.2l-64.2 26.6-63.3-27.5v-63.8l59.3-24.8c-.7-.7-.4 5-.4-70.4l67.3-29.7L361 178.5v61.6l49.1 20.3zm-70.4 81.5v-43.8h-.4v-1.8l-113.8-46.5V295l113.8 46.9v-.4l.4.4zm7.5-57.6l39.9-16.4-36.8-15.5-39 16.4 35.9 15.5zm52.3 38.1v-43L355.2 298v43.4l44.3-19z\"]\n};\nvar faCcAmazonPay = {\n prefix: 'fab',\n iconName: 'cc-amazon-pay',\n icon: [576, 512, [], \"f42d\", \"M124.7 201.8c.1-11.8 0-23.5 0-35.3v-35.3c0-1.3.4-2 1.4-2.7 11.5-8 24.1-12.1 38.2-11.1 12.5.9 22.7 7 28.1 21.7 3.3 8.9 4.1 18.2 4.1 27.7 0 8.7-.7 17.3-3.4 25.6-5.7 17.8-18.7 24.7-35.7 23.9-11.7-.5-21.9-5-31.4-11.7-.9-.8-1.4-1.6-1.3-2.8zm154.9 14.6c4.6 1.8 9.3 2 14.1 1.5 11.6-1.2 21.9-5.7 31.3-12.5.9-.6 1.3-1.3 1.3-2.5-.1-3.9 0-7.9 0-11.8 0-4-.1-8 0-12 0-1.4-.4-2-1.8-2.2-7-.9-13.9-2.2-20.9-2.9-7-.6-14-.3-20.8 1.9-6.7 2.2-11.7 6.2-13.7 13.1-1.6 5.4-1.6 10.8.1 16.2 1.6 5.5 5.2 9.2 10.4 11.2zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zm-207.5 23.9c.4 1.7.9 3.4 1.6 5.1 16.5 40.6 32.9 81.3 49.5 121.9 1.4 3.5 1.7 6.4.2 9.9-2.8 6.2-4.9 12.6-7.8 18.7-2.6 5.5-6.7 9.5-12.7 11.2-4.2 1.1-8.5 1.3-12.9.9-2.1-.2-4.2-.7-6.3-.8-2.8-.2-4.2 1.1-4.3 4-.1 2.8-.1 5.6 0 8.3.1 4.6 1.6 6.7 6.2 7.5 4.7.8 9.4 1.6 14.2 1.7 14.3.3 25.7-5.4 33.1-17.9 2.9-4.9 5.6-10.1 7.7-15.4 19.8-50.1 39.5-100.3 59.2-150.5.6-1.5 1.1-3 1.3-4.6.4-2.4-.7-3.6-3.1-3.7-5.6-.1-11.1 0-16.7 0-3.1 0-5.3 1.4-6.4 4.3-.4 1.1-.9 2.3-1.3 3.4l-29.1 83.7c-2.1 6.1-4.2 12.1-6.5 18.6-.4-.9-.6-1.4-.8-1.9-10.8-29.9-21.6-59.9-32.4-89.8-1.7-4.7-3.5-9.5-5.3-14.2-.9-2.5-2.7-4-5.4-4-6.4-.1-12.8-.2-19.2-.1-2.2 0-3.3 1.6-2.8 3.7zM242.4 206c1.7 11.7 7.6 20.8 18 26.6 9.9 5.5 20.7 6.2 31.7 4.6 12.7-1.9 23.9-7.3 33.8-15.5.4-.3.8-.6 1.4-1 .5 3.2.9 6.2 1.5 9.2.5 2.6 2.1 4.3 4.5 4.4 4.6.1 9.1.1 13.7 0 2.3-.1 3.8-1.6 4-3.9.1-.8.1-1.6.1-2.3v-88.8c0-3.6-.2-7.2-.7-10.8-1.6-10.8-6.2-19.7-15.9-25.4-5.6-3.3-11.8-5-18.2-5.9-3-.4-6-.7-9.1-1.1h-10c-.8.1-1.6.3-2.5.3-8.2.4-16.3 1.4-24.2 3.5-5.1 1.3-10 3.2-15 4.9-3 1-4.5 3.2-4.4 6.5.1 2.8-.1 5.6 0 8.3.1 4.1 1.8 5.2 5.7 4.1 6.5-1.7 13.1-3.5 19.7-4.8 10.3-1.9 20.7-2.7 31.1-1.2 5.4.8 10.5 2.4 14.1 7 3.1 4 4.2 8.8 4.4 13.7.3 6.9.2 13.9.3 20.8 0 .4-.1.7-.2 1.2-.4 0-.8 0-1.1-.1-8.8-2.1-17.7-3.6-26.8-4.1-9.5-.5-18.9.1-27.9 3.2-10.8 3.8-19.5 10.3-24.6 20.8-4.1 8.3-4.6 17-3.4 25.8zM98.7 106.9v175.3c0 .8 0 1.7.1 2.5.2 2.5 1.7 4.1 4.1 4.2 5.9.1 11.8.1 17.7 0 2.5 0 4-1.7 4.1-4.1.1-.8.1-1.7.1-2.5v-60.7c.9.7 1.4 1.2 1.9 1.6 15 12.5 32.2 16.6 51.1 12.9 17.1-3.4 28.9-13.9 36.7-29.2 5.8-11.6 8.3-24.1 8.7-37 .5-14.3-1-28.4-6.8-41.7-7.1-16.4-18.9-27.3-36.7-30.9-2.7-.6-5.5-.8-8.2-1.2h-7c-1.2.2-2.4.3-3.6.5-11.7 1.4-22.3 5.8-31.8 12.7-2 1.4-3.9 3-5.9 4.5-.1-.5-.3-.8-.4-1.2-.4-2.3-.7-4.6-1.1-6.9-.6-3.9-2.5-5.5-6.4-5.6h-9.7c-5.9-.1-6.9 1-6.9 6.8zM493.6 339c-2.7-.7-5.1 0-7.6 1-43.9 18.4-89.5 30.2-136.8 35.8-14.5 1.7-29.1 2.8-43.7 3.2-26.6.7-53.2-.8-79.6-4.3-17.8-2.4-35.5-5.7-53-9.9-37-8.9-72.7-21.7-106.7-38.8-8.8-4.4-17.4-9.3-26.1-14-3.8-2.1-6.2-1.5-8.2 2.1v1.7c1.2 1.6 2.2 3.4 3.7 4.8 36 32.2 76.6 56.5 122 72.9 21.9 7.9 44.4 13.7 67.3 17.5 14 2.3 28 3.8 42.2 4.5 3 .1 6 .2 9 .4.7 0 1.4.2 2.1.3h17.7c.7-.1 1.4-.3 2.1-.3 14.9-.4 29.8-1.8 44.6-4 21.4-3.2 42.4-8.1 62.9-14.7 29.6-9.6 57.7-22.4 83.4-40.1 2.8-1.9 5.7-3.8 8-6.2 4.3-4.4 2.3-10.4-3.3-11.9zm50.4-27.7c-.8-4.2-4-5.8-7.6-7-5.7-1.9-11.6-2.8-17.6-3.3-11-.9-22-.4-32.8 1.6-12 2.2-23.4 6.1-33.5 13.1-1.2.8-2.4 1.8-3.1 3-.6.9-.7 2.3-.5 3.4.3 1.3 1.7 1.6 3 1.5.6 0 1.2 0 1.8-.1l19.5-2.1c9.6-.9 19.2-1.5 28.8-.8 4.1.3 8.1 1.2 12 2.2 4.3 1.1 6.2 4.4 6.4 8.7.3 6.7-1.2 13.1-2.9 19.5-3.5 12.9-8.3 25.4-13.3 37.8-.3.8-.7 1.7-.8 2.5-.4 2.5 1 4 3.4 3.5 1.4-.3 3-1.1 4-2.1 3.7-3.6 7.5-7.2 10.6-11.2 10.7-13.8 17-29.6 20.7-46.6.7-3 1.2-6.1 1.7-9.1.2-4.7.2-9.6.2-14.5z\"]\n};\nvar faDropbox = {\n prefix: 'fab',\n iconName: 'dropbox',\n icon: [528, 512, [], \"f16b\", \"M264.4 116.3l-132 84.3 132 84.3-132 84.3L0 284.1l132.3-84.3L0 116.3 132.3 32l132.1 84.3zM131.6 395.7l132-84.3 132 84.3-132 84.3-132-84.3zm132.8-111.6l132-84.3-132-83.6L395.7 32 528 116.3l-132.3 84.3L528 284.8l-132.3 84.3-131.3-85z\"]\n};\nvar faInstagram = {\n prefix: 'fab',\n iconName: 'instagram',\n icon: [448, 512, [], \"f16d\", \"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\"]\n};\nvar faCmplid = {\n prefix: 'fab',\n iconName: 'cmplid',\n icon: [640, 512, [], \"e360\", \"M226.119,388.165a3.816,3.816,0,0,0-2.294-3.5,3.946,3.946,0,0,0-1.629-.385L72.6,384.3a19.243,19.243,0,0,1-17.924-26.025L81.585,255.692a35.72,35.72,0,0,1,32.373-26H262.525a7.07,7.07,0,0,0,6.392-5.194l10.769-41.131a3.849,3.849,0,0,0-2.237-4.937,3.755,3.755,0,0,0-1.377-.261c-.063,0-.126,0-.189.005H127.38a106.8,106.8,0,0,0-96.99,77.1L3.483,358.824A57.469,57.469,0,0,0,57.314,436q1.43,0,2.86-.072H208.742a7.131,7.131,0,0,0,6.391-5.193L225.839,389.6A3.82,3.82,0,0,0,226.119,388.165ZM306.658,81.2a3.861,3.861,0,0,0,.251-1.367A3.813,3.813,0,0,0,303.079,76c-.064,0-.128,0-.192,0h-41A7.034,7.034,0,0,0,255.5,81.2l-21.347,80.915h51.131ZM180.364,368.249H231.5L263.452,245.69H212.321ZM511.853,79.723a3.809,3.809,0,0,0-3.8-3.661c-.058,0-.137,0-.23.007h-41a7.1,7.1,0,0,0-6.584,5.129L368.91,430.634a3.54,3.54,0,0,0-.262,1.335,3.873,3.873,0,0,0,3.864,3.863c.056,0,.112,0,.169,0h41a7.068,7.068,0,0,0,6.392-5.193L511.533,81.2A3.624,3.624,0,0,0,511.853,79.723ZM324.649,384.47h-41a7.2,7.2,0,0,0-6.392,5.194L266.52,430.8a3.662,3.662,0,0,0-.268,1.374A3.783,3.783,0,0,0,270.023,436c.06,0,.166,0,.3-.012h40.905a7.036,7.036,0,0,0,6.391-5.193l10.769-41.131a3.75,3.75,0,0,0-3.445-5.208c-.108,0-.217,0-.326.014Zm311.324-308.4h-41a7.066,7.066,0,0,0-6.392,5.129l-91.46,349.436a4.073,4.073,0,0,0-.229,1.347,3.872,3.872,0,0,0,3.863,3.851c.056,0,.112,0,.169,0h40.968a7.1,7.1,0,0,0,6.392-5.193L639.68,81.2a3.624,3.624,0,0,0,.32-1.475,3.841,3.841,0,0,0-3.821-3.564c-.068,0-.137,0-.206.006ZM371.562,225.236l10.8-41.1a4.369,4.369,0,0,0,.227-1.388,3.869,3.869,0,0,0-3.861-3.842c-.057,0-.113,0-.169,0h-41.1a7.292,7.292,0,0,0-6.391,5.226l-10.834,41.1a4.417,4.417,0,0,0-.26,1.493c0,.069,0,.138,0,.206a3.776,3.776,0,0,0,3.757,3.507c.076,0,.18,0,.3-.012h41.129A7.034,7.034,0,0,0,371.562,225.236Z\"]\n};\nvar faFacebook = {\n prefix: 'fab',\n iconName: 'facebook',\n icon: [512, 512, [62000], \"f09a\", \"M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z\"]\n};\nvar faGripfire = {\n prefix: 'fab',\n iconName: 'gripfire',\n icon: [384, 512, [], \"f3ac\", \"M112.5 301.4c0-73.8 105.1-122.5 105.1-203 0-47.1-34-88-39.1-90.4.4 3.3.6 6.7.6 10C179.1 110.1 32 171.9 32 286.6c0 49.8 32.2 79.2 66.5 108.3 65.1 46.7 78.1 71.4 78.1 86.6 0 10.1-4.8 17-4.8 22.3 13.1-16.7 17.4-31.9 17.5-46.4 0-29.6-21.7-56.3-44.2-86.5-16-22.3-32.6-42.6-32.6-69.5zm205.3-39c-12.1-66.8-78-124.4-94.7-130.9l4 7.2c2.4 5.1 3.4 10.9 3.4 17.1 0 44.7-54.2 111.2-56.6 116.7-2.2 5.1-3.2 10.5-3.2 15.8 0 20.1 15.2 42.1 17.9 42.1 2.4 0 56.6-55.4 58.1-87.7 6.4 11.7 9.1 22.6 9.1 33.4 0 41.2-41.8 96.9-41.8 96.9 0 11.6 31.9 53.2 35.5 53.2 1 0 2.2-1.4 3.2-2.4 37.9-39.3 67.3-85 67.3-136.8 0-8-.7-16.2-2.2-24.6z\"]\n};\nvar faJediOrder = {\n prefix: 'fab',\n iconName: 'jedi-order',\n icon: [448, 512, [], \"f50e\", \"M398.5 373.6c95.9-122.1 17.2-233.1 17.2-233.1 45.4 85.8-41.4 170.5-41.4 170.5 105-171.5-60.5-271.5-60.5-271.5 96.9 72.7-10.1 190.7-10.1 190.7 85.8 158.4-68.6 230.1-68.6 230.1s-.4-16.9-2.2-85.7c4.3 4.5 34.5 36.2 34.5 36.2l-24.2-47.4 62.6-9.1-62.6-9.1 20.2-55.5-31.4 45.9c-2.2-87.7-7.8-305.1-7.9-306.9v-2.4 1-1 2.4c0 1-5.6 219-7.9 306.9l-31.4-45.9 20.2 55.5-62.6 9.1 62.6 9.1-24.2 47.4 34.5-36.2c-1.8 68.8-2.2 85.7-2.2 85.7s-154.4-71.7-68.6-230.1c0 0-107-118.1-10.1-190.7 0 0-165.5 99.9-60.5 271.5 0 0-86.8-84.8-41.4-170.5 0 0-78.7 111 17.2 233.1 0 0-26.2-16.1-49.4-77.7 0 0 16.9 183.3 222 185.7h4.1c205-2.4 222-185.7 222-185.7-23.6 61.5-49.9 77.7-49.9 77.7z\"]\n};\nvar faUikit = {\n prefix: 'fab',\n iconName: 'uikit',\n icon: [448, 512, [], \"f403\", \"M443.9 128v256L218 512 0 384V169.7l87.6 45.1v117l133.5 75.5 135.8-75.5v-151l-101.1-57.6 87.6-53.1L443.9 128zM308.6 49.1L223.8 0l-88.6 54.8 86 47.3 87.4-53z\"]\n};\nvar faFortAwesomeAlt = {\n prefix: 'fab',\n iconName: 'fort-awesome-alt',\n icon: [512, 512, [], \"f3a3\", \"M208 237.4h-22.2c-2.1 0-3.7 1.6-3.7 3.7v51.7c0 2.1 1.6 3.7 3.7 3.7H208c2.1 0 3.7-1.6 3.7-3.7v-51.7c0-2.1-1.6-3.7-3.7-3.7zm118.2 0H304c-2.1 0-3.7 1.6-3.7 3.7v51.7c0 2.1 1.6 3.7 3.7 3.7h22.2c2.1 0 3.7-1.6 3.7-3.7v-51.7c-.1-2.1-1.7-3.7-3.7-3.7zm132-125.1c-2.3-3.2-4.6-6.4-7.1-9.5-9.8-12.5-20.8-24-32.8-34.4-4.5-3.9-9.1-7.6-13.9-11.2-1.6-1.2-3.2-2.3-4.8-3.5C372 34.1 340.3 20 306 13c-16.2-3.3-32.9-5-50-5s-33.9 1.7-50 5c-34.3 7.1-66 21.2-93.3 40.8-1.6 1.1-3.2 2.3-4.8 3.5-4.8 3.6-9.4 7.3-13.9 11.2-3 2.6-5.9 5.3-8.8 8s-5.7 5.5-8.4 8.4c-5.5 5.7-10.7 11.8-15.6 18-2.4 3.1-4.8 6.3-7.1 9.5C25.2 153 8.3 202.5 8.3 256c0 2 .1 4 .1 6 .1.7.1 1.3.1 2 .1 1.3.1 2.7.2 4 0 .8.1 1.5.1 2.3 0 1.3.1 2.5.2 3.7.1.8.1 1.6.2 2.4.1 1.1.2 2.3.3 3.5 0 .8.1 1.6.2 2.4.1 1.2.3 2.4.4 3.6.1.8.2 1.5.3 2.3.1 1.3.3 2.6.5 3.9.1.6.2 1.3.3 1.9l.9 5.7c.1.6.2 1.1.3 1.7.3 1.3.5 2.7.8 4 .2.8.3 1.6.5 2.4.2 1 .5 2.1.7 3.2.2.9.4 1.7.6 2.6.2 1 .4 2 .7 3 .2.9.5 1.8.7 2.7.3 1 .5 1.9.8 2.9.3.9.5 1.8.8 2.7.2.9.5 1.9.8 2.8s.5 1.8.8 2.7c.3 1 .6 1.9.9 2.8.6 1.6 1.1 3.3 1.7 4.9.4 1 .7 1.9 1 2.8.3 1 .7 2 1.1 3 .3.8.6 1.5.9 2.3l1.2 3c.3.7.6 1.5.9 2.2.4 1 .9 2 1.3 3l.9 2.1c.5 1 .9 2 1.4 3 .3.7.6 1.3.9 2 .5 1 1 2.1 1.5 3.1.2.6.5 1.1.8 1.7.6 1.1 1.1 2.2 1.7 3.3.1.2.2.3.3.5 2.2 4.1 4.4 8.2 6.8 12.2.2.4.5.8.7 1.2.7 1.1 1.3 2.2 2 3.3.3.5.6.9.9 1.4.6 1.1 1.3 2.1 2 3.2.3.5.6.9.9 1.4.7 1.1 1.4 2.1 2.1 3.2.2.4.5.8.8 1.2.7 1.1 1.5 2.2 2.3 3.3.2.2.3.5.5.7 37.5 51.7 94.4 88.5 160 99.4.9.1 1.7.3 2.6.4 1 .2 2.1.4 3.1.5s1.9.3 2.8.4c1 .2 2 .3 3 .4.9.1 1.9.2 2.9.3s1.9.2 2.9.3 2.1.2 3.1.3c.9.1 1.8.1 2.7.2 1.1.1 2.3.1 3.4.2.8 0 1.7.1 2.5.1 1.3 0 2.6.1 3.9.1.7.1 1.4.1 2.1.1 2 .1 4 .1 6 .1s4-.1 6-.1c.7 0 1.4-.1 2.1-.1 1.3 0 2.6 0 3.9-.1.8 0 1.7-.1 2.5-.1 1.1-.1 2.3-.1 3.4-.2.9 0 1.8-.1 2.7-.2 1-.1 2.1-.2 3.1-.3s1.9-.2 2.9-.3c.9-.1 1.9-.2 2.9-.3s2-.3 3-.4 1.9-.3 2.8-.4c1-.2 2.1-.3 3.1-.5.9-.1 1.7-.3 2.6-.4 65.6-11 122.5-47.7 160.1-102.4.2-.2.3-.5.5-.7.8-1.1 1.5-2.2 2.3-3.3.2-.4.5-.8.8-1.2.7-1.1 1.4-2.1 2.1-3.2.3-.5.6-.9.9-1.4.6-1.1 1.3-2.1 2-3.2.3-.5.6-.9.9-1.4.7-1.1 1.3-2.2 2-3.3.2-.4.5-.8.7-1.2 2.4-4 4.6-8.1 6.8-12.2.1-.2.2-.3.3-.5.6-1.1 1.1-2.2 1.7-3.3.2-.6.5-1.1.8-1.7.5-1 1-2.1 1.5-3.1.3-.7.6-1.3.9-2 .5-1 1-2 1.4-3l.9-2.1c.5-1 .9-2 1.3-3 .3-.7.6-1.5.9-2.2l1.2-3c.3-.8.6-1.5.9-2.3.4-1 .7-2 1.1-3s.7-1.9 1-2.8c.6-1.6 1.2-3.3 1.7-4.9.3-1 .6-1.9.9-2.8s.5-1.8.8-2.7c.2-.9.5-1.9.8-2.8s.6-1.8.8-2.7c.3-1 .5-1.9.8-2.9.2-.9.5-1.8.7-2.7.2-1 .5-2 .7-3 .2-.9.4-1.7.6-2.6.2-1 .5-2.1.7-3.2.2-.8.3-1.6.5-2.4.3-1.3.6-2.7.8-4 .1-.6.2-1.1.3-1.7l.9-5.7c.1-.6.2-1.3.3-1.9.1-1.3.3-2.6.5-3.9.1-.8.2-1.5.3-2.3.1-1.2.3-2.4.4-3.6 0-.8.1-1.6.2-2.4.1-1.1.2-2.3.3-3.5.1-.8.1-1.6.2-2.4.1 1.7.1.5.2-.7 0-.8.1-1.5.1-2.3.1-1.3.2-2.7.2-4 .1-.7.1-1.3.1-2 .1-2 .1-4 .1-6 0-53.5-16.9-103-45.8-143.7zM448 371.5c-9.4 15.5-20.6 29.9-33.6 42.9-20.6 20.6-44.5 36.7-71.2 48-13.9 5.8-28.2 10.3-42.9 13.2v-75.8c0-58.6-88.6-58.6-88.6 0v75.8c-14.7-2.9-29-7.3-42.9-13.2-26.7-11.3-50.6-27.4-71.2-48-13-13-24.2-27.4-33.6-42.9v-71.3c0-2.1 1.6-3.7 3.7-3.7h22.1c2.1 0 3.7 1.6 3.7 3.7V326h29.6V182c0-2.1 1.6-3.7 3.7-3.7h22.1c2.1 0 3.7 1.6 3.7 3.7v25.9h29.5V182c0-2.1 1.6-3.7 3.7-3.7H208c2.1 0 3.7 1.6 3.7 3.7v25.9h29.5V182c0-4.8 6.5-3.7 9.5-3.7V88.1c-4.4-2-7.4-6.7-7.4-11.5 0-16.8 25.4-16.8 25.4 0 0 4.8-3 9.4-7.4 11.5V92c6.3-1.4 12.7-2.3 19.2-2.3 9.4 0 18.4 3.5 26.3 3.5 7.2 0 15.2-3.5 19.4-3.5 2.1 0 3.7 1.6 3.7 3.7v48.4c0 5.6-18.7 6.5-22.4 6.5-8.6 0-16.6-3.5-25.4-3.5-7 0-14.1 1.2-20.8 2.8v30.7c3 0 9.5-1.1 9.5 3.7v25.9h29.5V182c0-2.1 1.6-3.7 3.7-3.7h22.2c2.1 0 3.7 1.6 3.7 3.7v25.9h29.5V182c0-2.1 1.6-3.7 3.7-3.7h22.1c2.1 0 3.7 1.6 3.7 3.7v144h29.5v-25.8c0-2.1 1.6-3.7 3.7-3.7h22.2c2.1 0 3.7 1.6 3.7 3.7z\"]\n};\nvar faPhabricator = {\n prefix: 'fab',\n iconName: 'phabricator',\n icon: [496, 512, [], \"f3db\", \"M323 262.1l-.1-13s21.7-19.8 21.1-21.2l-9.5-20c-.6-1.4-29.5-.5-29.5-.5l-9.4-9.3s.2-28.5-1.2-29.1l-20.1-9.2c-1.4-.6-20.7 21-20.7 21l-13.1-.2s-20.5-21.4-21.9-20.8l-20 8.3c-1.4.5.2 28.9.2 28.9l-9.1 9.1s-29.2-.9-29.7.4l-8.1 19.8c-.6 1.4 21 21 21 21l.1 12.9s-21.7 19.8-21.1 21.2l9.5 20c.6 1.4 29.5.5 29.5.5l9.4 9.3s-.2 31.8 1.2 32.3l20.1 8.3c1.4.6 20.7-23.5 20.7-23.5l13.1.2s20.5 23.8 21.8 23.3l20-7.5c1.4-.6-.2-32.1-.2-32.1l9.1-9.1s29.2.9 29.7-.5l8.1-19.8c.7-1.1-20.9-20.7-20.9-20.7zm-44.9-8.7c.7 17.1-12.8 31.6-30.1 32.4-17.3.8-32.1-12.5-32.8-29.6-.7-17.1 12.8-31.6 30.1-32.3 17.3-.8 32.1 12.5 32.8 29.5zm201.2-37.9l-97-97-.1.1c-75.1-73.3-195.4-72.8-269.8 1.6-50.9 51-27.8 27.9-95.7 95.3-22.3 22.3-22.3 58.7 0 81 69.9 69.4 46.4 46 97.4 97l.1-.1c75.1 73.3 195.4 72.9 269.8-1.6 51-50.9 27.9-27.9 95.3-95.3 22.3-22.3 22.3-58.7 0-81zM140.4 363.8c-59.6-59.5-59.6-156 0-215.5 59.5-59.6 156-59.5 215.6 0 59.5 59.5 59.6 156 0 215.6-59.6 59.5-156 59.4-215.6-.1z\"]\n};\nvar faUssunnah = {\n prefix: 'fab',\n iconName: 'ussunnah',\n icon: [512, 512, [], \"f407\", \"M156.8 285.1l5.7 14.4h-8.2c-1.3-3.2-3.1-7.7-3.8-9.5-2.5-6.3-1.1-8.4 0-10 1.9-2.7 3.2-4.4 3.6-5.2 0 2.2.8 5.7 2.7 10.3zm297.3 18.8c-2.1 13.8-5.7 27.1-10.5 39.7l43 23.4-44.8-18.8c-5.3 13.2-12 25.6-19.9 37.2l34.2 30.2-36.8-26.4c-8.4 11.8-18 22.6-28.7 32.3l24.9 34.7-28.1-31.8c-11 9.6-23.1 18-36.1 25.1l15.7 37.2-19.3-35.3c-13.1 6.8-27 12.1-41.6 15.9l6.7 38.4-10.5-37.4c-14.3 3.4-29.2 5.3-44.5 5.4L256 512l-1.9-38.4c-15.3-.1-30.2-2-44.5-5.3L199 505.6l6.7-38.2c-14.6-3.7-28.6-9.1-41.7-15.8l-19.2 35.1 15.6-37c-13-7-25.2-15.4-36.2-25.1l-27.9 31.6 24.7-34.4c-10.7-9.7-20.4-20.5-28.8-32.3l-36.5 26.2 33.9-29.9c-7.9-11.6-14.6-24.1-20-37.3l-44.4 18.7L67.8 344c-4.8-12.7-8.4-26.1-10.5-39.9l-51 9 50.3-14.2c-1.1-8.5-1.7-17.1-1.7-25.9 0-4.7.2-9.4.5-14.1L0 256l56-2.8c1.3-13.1 3.8-25.8 7.5-38.1L6.4 199l58.9 10.4c4-12 9.1-23.5 15.2-34.4l-55.1-30 58.3 24.6C90 159 97.2 149.2 105.3 140L55.8 96.4l53.9 38.7c8.1-8.6 17-16.5 26.6-23.6l-40-55.6 45.6 51.6c9.5-6.6 19.7-12.3 30.3-17.2l-27.3-64.9 33.8 62.1c10.5-4.4 21.4-7.9 32.7-10.4L199 6.4l19.5 69.2c11-2.1 22.3-3.2 33.8-3.4L256 0l3.6 72.2c11.5.2 22.8 1.4 33.8 3.5L313 6.4l-12.4 70.7c11.3 2.6 22.2 6.1 32.6 10.5l33.9-62.2-27.4 65.1c10.6 4.9 20.7 10.7 30.2 17.2l45.8-51.8-40.1 55.9c9.5 7.1 18.4 15 26.5 23.6l54.2-38.9-49.7 43.9c8 9.1 15.2 18.9 21.5 29.4l58.7-24.7-55.5 30.2c6.1 10.9 11.1 22.3 15.1 34.3l59.3-10.4-57.5 16.2c3.7 12.2 6.2 24.9 7.5 37.9L512 256l-56 2.8c.3 4.6.5 9.3.5 14.1 0 8.7-.6 17.3-1.6 25.8l50.7 14.3-51.5-9.1zm-21.8-31c0-97.5-79-176.5-176.5-176.5s-176.5 79-176.5 176.5 79 176.5 176.5 176.5 176.5-79 176.5-176.5zm-24 0c0 84.3-68.3 152.6-152.6 152.6s-152.6-68.3-152.6-152.6 68.3-152.6 152.6-152.6 152.6 68.3 152.6 152.6zM195 241c0 2.1 1.3 3.8 3.6 5.1 3.3 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.5 6.8-9.6 10.9-9.6 12.6zm-40.7-19c0 2.1 1.3 3.8 3.6 5.1 3.5 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.5 6.8-9.6 10.9-9.6 12.6zm-19 0c0 2.1 1.3 3.8 3.6 5.1 3.3 1.9 6.2 4.6 8.2 8.2 2.8-5.7 4.3-9.5 4.3-11.2 0-2.2-1.1-4.4-3.2-7-2.1-2.5-3.2-5.2-3.3-7.7-6.4 6.8-9.6 10.9-9.6 12.6zm204.9 87.9c-8.4-3-8.7-6.8-8.7-15.6V182c-8.2 12.5-14.2 18.6-18 18.6 6.3 14.4 9.5 23.9 9.5 28.3v64.3c0 2.2-2.2 6.5-4.7 6.5h-18c-2.8-7.5-10.2-26.9-15.3-40.3-2 2.5-7.2 9.2-10.7 13.7 2.4 1.6 4.1 3.6 5.2 6.3 2.6 6.7 6.4 16.5 7.9 20.2h-9.2c-3.9-10.4-9.6-25.4-11.8-31.1-2 2.5-7.2 9.2-10.7 13.7 2.4 1.6 4.1 3.6 5.2 6.3.8 2 2.8 7.3 4.3 10.9H256c-1.5-4.1-5.6-14.6-8.4-22-2 2.5-7.2 9.2-10.7 13.7 2.5 1.6 4.3 3.6 5.2 6.3.2.6.5 1.4.6 1.7H225c-4.6-13.9-11.4-27.7-11.4-34.1 0-2.2.3-5.1 1.1-8.2-8.8 10.8-14 15.9-14 25 0 7.5 10.4 28.3 10.4 33.3 0 1.7-.5 3.3-1.4 4.9-9.6-12.7-15.5-20.7-18.8-20.7h-12l-11.2-28c-3.8-9.6-5.7-16-5.7-18.8 0-3.8.5-7.7 1.7-12.2-1 1.3-3.7 4.7-5.5 7.1-.8-2.1-3.1-7.7-4.6-11.5-2.1 2.5-7.5 9.1-11.2 13.6.9 2.3 3.3 8.1 4.9 12.2-2.5 3.3-9.1 11.8-13.6 17.7-4 5.3-5.8 13.3-2.7 21.8 2.5 6.7 2 7.9-1.7 14.1H191c5.5 0 14.3 14 15.5 22 13.2-16 15.4-19.6 16.8-21.6h107c3.9 0 7.2-1.9 9.9-5.8zm20.1-26.6V181.7c-9 12.5-15.9 18.6-20.7 18.6 7.1 14.4 10.7 23.9 10.7 28.3v66.3c0 17.5 8.6 20.4 24 20.4 8.1 0 12.5-.8 13.7-2.7-4.3-1.6-7.6-2.5-9.9-3.3-8.1-3.2-17.8-7.4-17.8-26z\"]\n};\nvar faEarlybirds = {\n prefix: 'fab',\n iconName: 'earlybirds',\n icon: [480, 512, [], \"f39a\", \"M313.2 47.5c1.2-13 21.3-14 36.6-8.7.9.3 26.2 9.7 19 15.2-27.9-7.4-56.4 18.2-55.6-6.5zm-201 6.9c30.7-8.1 62 20 61.1-7.1-1.3-14.2-23.4-15.3-40.2-9.6-1 .3-28.7 10.5-20.9 16.7zM319.4 160c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-159.7 0c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm318.5 163.2c-9.9 24-40.7 11-63.9-1.2-13.5 69.1-58.1 111.4-126.3 124.2.3.9-2-.1 24 1 33.6 1.4 63.8-3.1 97.4-8-19.8-13.8-11.4-37.1-9.8-38.1 1.4-.9 14.7 1.7 21.6 11.5 8.6-12.5 28.4-14.8 30.2-13.6 1.6 1.1 6.6 20.9-6.9 34.6 4.7-.9 8.2-1.6 9.8-2.1 2.6-.8 17.7 11.3 3.1 13.3-14.3 2.3-22.6 5.1-47.1 10.8-45.9 10.7-85.9 11.8-117.7 12.8l1 11.6c3.8 18.1-23.4 24.3-27.6 6.2.8 17.9-27.1 21.8-28.4-1l-.5 5.3c-.7 18.4-28.4 17.9-28.3-.6-7.5 13.5-28.1 6.8-26.4-8.5l1.2-12.4c-36.7.9-59.7 3.1-61.8 3.1-20.9 0-20.9-31.6 0-31.6 2.4 0 27.7 1.3 63.2 2.8-61.1-15.5-103.7-55-114.9-118.2-25 12.8-57.5 26.8-68.2.8-10.5-25.4 21.5-42.6 66.8-73.4.7-6.6 1.6-13.3 2.7-19.8-14.4-19.6-11.6-36.3-16.1-60.4-16.8 2.4-23.2-9.1-23.6-23.1.3-7.3 2.1-14.9 2.4-15.4 1.1-1.8 10.1-2 12.7-2.6 6-31.7 50.6-33.2 90.9-34.5 19.7-21.8 45.2-41.5 80.9-48.3C203.3 29 215.2 8.5 216.2 8c1.7-.8 21.2 4.3 26.3 23.2 5.2-8.8 18.3-11.4 19.6-10.7 1.1.6 6.4 15-4.9 25.9 40.3 3.5 72.2 24.7 96 50.7 36.1 1.5 71.8 5.9 77.1 34 2.7.6 11.6.8 12.7 2.6.3.5 2.1 8.1 2.4 15.4-.5 13.9-6.8 25.4-23.6 23.1-3.2 17.3-2.7 32.9-8.7 47.7 2.4 11.7 4 23.8 4.8 36.4 37 25.4 70.3 42.5 60.3 66.9zM207.4 159.9c.9-44-37.9-42.2-78.6-40.3-21.7 1-38.9 1.9-45.5 13.9-11.4 20.9 5.9 92.9 23.2 101.2 9.8 4.7 73.4 7.9 86.3-7.1 8.2-9.4 15-49.4 14.6-67.7zm52 58.3c-4.3-12.4-6-30.1-15.3-32.7-2-.5-9-.5-11 0-10 2.8-10.8 22.1-17 37.2 15.4 0 19.3 9.7 23.7 9.7 4.3 0 6.3-11.3 19.6-14.2zm135.7-84.7c-6.6-12.1-24.8-12.9-46.5-13.9-40.2-1.9-78.2-3.8-77.3 40.3-.5 18.3 5 58.3 13.2 67.8 13 14.9 76.6 11.8 86.3 7.1 15.8-7.6 36.5-78.9 24.3-101.3z\"]\n};\nvar faTradeFederation = {\n prefix: 'fab',\n iconName: 'trade-federation',\n icon: [496, 512, [], \"f513\", \"M248 8.8c-137 0-248 111-248 248s111 248 248 248 248-111 248-248-111-248-248-248zm0 482.8c-129.7 0-234.8-105.1-234.8-234.8S118.3 22 248 22s234.8 105.1 234.8 234.8S377.7 491.6 248 491.6zm155.1-328.5v-46.8H209.3V198H54.2l36.7 46h117.7v196.8h48.8V245h83.3v-47h-83.3v-34.8h145.7zm-73.3 45.1v23.9h-82.9v197.4h-26.8V232.1H96.3l-20.1-23.9h143.9v-80.6h171.8V152h-145v56.2zm-161.3-69l-12.4-20.7 2.1 23.8-23.5 5.4 23.3 5.4-2.1 24 12.3-20.5 22.2 9.5-15.7-18.1 15.8-18.1zm-29.6-19.7l9.3-11.5-12.7 5.9-8-12.4 1.7 13.9-14.3 3.8 13.7 2.7-.8 14.7 6.8-12.2 13.8 5.3zm165.4 145.2l-13.1 5.6-7.3-12.2 1.3 14.2-13.9 3.2 13.9 3.2-1.2 14.2 7.3-12.2 13.1 5.5-9.4-10.7zm106.9-77.2l-20.9 9.1-12-19.6 2.2 22.7-22.3 5.4 22.2 4.9-1.8 22.9 11.5-19.6 21.2 8.8-15.1-17zM248 29.9c-125.3 0-226.9 101.6-226.9 226.9S122.7 483.7 248 483.7s226.9-101.6 226.9-226.9S373.3 29.9 248 29.9zM342.6 196v51h-83.3v195.7h-52.7V245.9H89.9l-40-49.9h157.4v-81.6h197.8v50.7H259.4V196zM248 43.2c60.3 0 114.8 25 153.6 65.2H202.5V190H45.1C73.1 104.8 153.4 43.2 248 43.2zm0 427.1c-117.9 0-213.6-95.6-213.6-213.5 0-21.2 3.1-41.8 8.9-61.1L87.1 252h114.7v196.8h64.6V253h83.3v-62.7h-83.2v-19.2h145.6v-50.8c30.8 37 49.3 84.6 49.3 136.5.1 117.9-95.5 213.5-213.4 213.5zM178.8 275l-11-21.4 1.7 24.5-23.7 3.9 23.8 5.9-3.7 23.8 13-20.9 21.5 10.8-15.8-18.8 16.9-17.1z\"]\n};\nvar faAutoprefixer = {\n prefix: 'fab',\n iconName: 'autoprefixer',\n icon: [640, 512, [], \"f41c\", \"M318.4 16l-161 480h77.5l25.4-81.4h119.5L405 496h77.5L318.4 16zm-40.3 341.9l41.2-130.4h1.5l40.9 130.4h-83.6zM640 405l-10-31.4L462.1 358l19.4 56.5L640 405zm-462.1-47L10 373.7 0 405l158.5 9.4 19.4-56.4z\"]\n};\nvar faWhatsapp = {\n prefix: 'fab',\n iconName: 'whatsapp',\n icon: [448, 512, [], \"f232\", \"M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z\"]\n};\nvar faSlideshare = {\n prefix: 'fab',\n iconName: 'slideshare',\n icon: [512, 512, [], \"f1e7\", \"M187.7 153.7c-34 0-61.7 25.7-61.7 57.7 0 31.7 27.7 57.7 61.7 57.7s61.7-26 61.7-57.7c0-32-27.7-57.7-61.7-57.7zm143.4 0c-34 0-61.7 25.7-61.7 57.7 0 31.7 27.7 57.7 61.7 57.7 34.3 0 61.7-26 61.7-57.7.1-32-27.4-57.7-61.7-57.7zm156.6 90l-6 4.3V49.7c0-27.4-20.6-49.7-46-49.7H76.6c-25.4 0-46 22.3-46 49.7V248c-2-1.4-4.3-2.9-6.3-4.3-15.1-10.6-25.1 4-16 17.7 18.3 22.6 53.1 50.3 106.3 72C58.3 525.1 252 555.7 248.9 457.5c0-.7.3-56.6.3-96.6 5.1 1.1 9.4 2.3 13.7 3.1 0 39.7.3 92.8.3 93.5-3.1 98.3 190.6 67.7 134.3-124 53.1-21.7 88-49.4 106.3-72 9.1-13.8-.9-28.3-16.1-17.8zm-30.5 19.2c-68.9 37.4-128.3 31.1-160.6 29.7-23.7-.9-32.6 9.1-33.7 24.9-10.3-7.7-18.6-15.5-20.3-17.1-5.1-5.4-13.7-8-27.1-7.7-31.7 1.1-89.7 7.4-157.4-28V72.3c0-34.9 8.9-45.7 40.6-45.7h317.7c30.3 0 40.9 12.9 40.9 45.7v190.6z\"]\n};\nvar faGooglePlay = {\n prefix: 'fab',\n iconName: 'google-play',\n icon: [512, 512, [], \"f3ab\", \"M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z\"]\n};\nvar faViadeo = {\n prefix: 'fab',\n iconName: 'viadeo',\n icon: [448, 512, [], \"f2a9\", \"M276.2 150.5v.7C258.3 98.6 233.6 47.8 205.4 0c43.3 29.2 67 100 70.8 150.5zm32.7 121.7c7.6 18.2 11 37.5 11 57 0 77.7-57.8 141-137.8 139.4l3.8-.3c74.2-46.7 109.3-118.6 109.3-205.1 0-38.1-6.5-75.9-18.9-112 1 11.7 1 23.7 1 35.4 0 91.8-18.1 241.6-116.6 280C95 455.2 49.4 398 49.4 329.2c0-75.6 57.4-142.3 135.4-142.3 16.8 0 33.7 3.1 49.1 9.6 1.7-15.1 6.5-29.9 13.4-43.3-19.9-7.2-41.2-10.7-62.5-10.7-161.5 0-238.7 195.9-129.9 313.7 67.9 74.6 192 73.9 259.8 0 56.6-61.3 60.9-142.4 36.4-201-12.7 8-27.1 13.9-42.2 17zM418.1 11.7c-31 66.5-81.3 47.2-115.8 80.1-12.4 12-20.6 34-20.6 50.5 0 14.1 4.5 27.1 12 38.8 47.4-11 98.3-46 118.2-90.7-.7 5.5-4.8 14.4-7.2 19.2-20.3 35.7-64.6 65.6-99.7 84.9 14.8 14.4 33.7 25.8 55 25.8 79 0 110.1-134.6 58.1-208.6z\"]\n};\nvar faLine = {\n prefix: 'fab',\n iconName: 'line',\n icon: [448, 512, [], \"f3c0\", \"M272.1 204.2v71.1c0 1.8-1.4 3.2-3.2 3.2h-11.4c-1.1 0-2.1-.6-2.6-1.3l-32.6-44v42.2c0 1.8-1.4 3.2-3.2 3.2h-11.4c-1.8 0-3.2-1.4-3.2-3.2v-71.1c0-1.8 1.4-3.2 3.2-3.2H219c1 0 2.1.5 2.6 1.4l32.6 44v-42.2c0-1.8 1.4-3.2 3.2-3.2h11.4c1.8-.1 3.3 1.4 3.3 3.1zm-82-3.2h-11.4c-1.8 0-3.2 1.4-3.2 3.2v71.1c0 1.8 1.4 3.2 3.2 3.2h11.4c1.8 0 3.2-1.4 3.2-3.2v-71.1c0-1.7-1.4-3.2-3.2-3.2zm-27.5 59.6h-31.1v-56.4c0-1.8-1.4-3.2-3.2-3.2h-11.4c-1.8 0-3.2 1.4-3.2 3.2v71.1c0 .9.3 1.6.9 2.2.6.5 1.3.9 2.2.9h45.7c1.8 0 3.2-1.4 3.2-3.2v-11.4c0-1.7-1.4-3.2-3.1-3.2zM332.1 201h-45.7c-1.7 0-3.2 1.4-3.2 3.2v71.1c0 1.7 1.4 3.2 3.2 3.2h45.7c1.8 0 3.2-1.4 3.2-3.2v-11.4c0-1.8-1.4-3.2-3.2-3.2H301v-12h31.1c1.8 0 3.2-1.4 3.2-3.2V234c0-1.8-1.4-3.2-3.2-3.2H301v-12h31.1c1.8 0 3.2-1.4 3.2-3.2v-11.4c-.1-1.7-1.5-3.2-3.2-3.2zM448 113.7V399c-.1 44.8-36.8 81.1-81.7 81H81c-44.8-.1-81.1-36.9-81-81.7V113c.1-44.8 36.9-81.1 81.7-81H367c44.8.1 81.1 36.8 81 81.7zm-61.6 122.6c0-73-73.2-132.4-163.1-132.4-89.9 0-163.1 59.4-163.1 132.4 0 65.4 58 120.2 136.4 130.6 19.1 4.1 16.9 11.1 12.6 36.8-.7 4.1-3.3 16.1 14.1 8.8 17.4-7.3 93.9-55.3 128.2-94.7 23.6-26 34.9-52.3 34.9-81.5z\"]\n};\nvar faGoogleDrive = {\n prefix: 'fab',\n iconName: 'google-drive',\n icon: [512, 512, [], \"f3aa\", \"M339 314.9L175.4 32h161.2l163.6 282.9H339zm-137.5 23.6L120.9 480h310.5L512 338.5H201.5zM154.1 67.4L0 338.5 80.6 480 237 208.8 154.1 67.4z\"]\n};\nvar faServicestack = {\n prefix: 'fab',\n iconName: 'servicestack',\n icon: [496, 512, [], \"f3ec\", \"M88 216c81.7 10.2 273.7 102.3 304 232H0c99.5-8.1 184.5-137 88-232zm32-152c32.3 35.6 47.7 83.9 46.4 133.6C249.3 231.3 373.7 321.3 400 448h96C455.3 231.9 222.8 79.5 120 64z\"]\n};\nvar faSimplybuilt = {\n prefix: 'fab',\n iconName: 'simplybuilt',\n icon: [512, 512, [], \"f215\", \"M481.2 64h-106c-14.5 0-26.6 11.8-26.6 26.3v39.6H163.3V90.3c0-14.5-12-26.3-26.6-26.3h-106C16.1 64 4.3 75.8 4.3 90.3v331.4c0 14.5 11.8 26.3 26.6 26.3h450.4c14.8 0 26.6-11.8 26.6-26.3V90.3c-.2-14.5-12-26.3-26.7-26.3zM149.8 355.8c-36.6 0-66.4-29.7-66.4-66.4 0-36.9 29.7-66.6 66.4-66.6 36.9 0 66.6 29.7 66.6 66.6 0 36.7-29.7 66.4-66.6 66.4zm212.4 0c-36.9 0-66.6-29.7-66.6-66.6 0-36.6 29.7-66.4 66.6-66.4 36.6 0 66.4 29.7 66.4 66.4 0 36.9-29.8 66.6-66.4 66.6z\"]\n};\nvar faBitbucket = {\n prefix: 'fab',\n iconName: 'bitbucket',\n icon: [512, 512, [61810], \"f171\", \"M22.2 32A16 16 0 0 0 6 47.8a26.35 26.35 0 0 0 .2 2.8l67.9 412.1a21.77 21.77 0 0 0 21.3 18.2h325.7a16 16 0 0 0 16-13.4L505 50.7a16 16 0 0 0-13.2-18.3 24.58 24.58 0 0 0-2.8-.2L22.2 32zm285.9 297.8h-104l-28.1-147h157.3l-25.2 147z\"]\n};\nvar faImdb = {\n prefix: 'fab',\n iconName: 'imdb',\n icon: [448, 512, [], \"f2d8\", \"M89.5 323.6H53.93V186.2H89.5V323.6zM156.1 250.5L165.2 186.2H211.5V323.6H180.5V230.9L167.1 323.6H145.8L132.8 232.9L132.7 323.6H101.5V186.2H147.6C148.1 194.5 150.4 204.3 151.9 215.6L156.1 250.5zM223.7 323.6V186.2H250.3C267.3 186.2 277.3 187.1 283.3 188.6C289.4 190.3 294 192.8 297.2 196.5C300.3 199.8 302.3 203.1 303 208.5C303.9 212.9 304.4 221.6 304.4 234.7V282.9C304.4 295.2 303.7 303.4 302.5 307.6C301.4 311.7 299.4 315 296.5 317.3C293.7 319.7 290.1 321.4 285.8 322.3C281.6 323.1 275.2 323.6 266.7 323.6H223.7zM259.2 209.7V299.1C264.3 299.1 267.5 298.1 268.6 296.8C269.7 294.8 270.4 289.2 270.4 280.1V226.8C270.4 220.6 270.3 216.6 269.7 214.8C269.4 213 268.5 211.8 267.1 210.1C265.7 210.1 263 209.7 259.2 209.7V209.7zM316.5 323.6V186.2H350.6V230.1C353.5 227.7 356.7 225.2 360.1 223.5C363.7 222 368.9 221.1 372.9 221.1C377.7 221.1 381.8 221.9 385.2 223.3C388.6 224.8 391.2 226.8 393.2 229.5C394.9 232.1 395.9 234.8 396.3 237.3C396.7 239.9 396.1 245.3 396.1 253.5V292.1C396.1 300.3 396.3 306.4 395.3 310.5C394.2 314.5 391.5 318.1 387.5 320.1C383.4 324 378.6 325.4 372.9 325.4C368.9 325.4 363.7 324.5 360.2 322.9C356.7 321.1 353.5 318.4 350.6 314.9L348.5 323.6L316.5 323.6zM361.6 302.9C362.3 301.1 362.6 296.9 362.6 290.4V255C362.6 249.4 362.3 245.5 361.5 243.8C360.8 241.9 357.8 241.1 355.7 241.1C353.7 241.1 352.3 241.9 351.6 243.4C351 244.9 350.6 248.8 350.6 255V291.4C350.6 297.5 351 301.4 351.8 303C352.4 304.7 353.9 305.5 355.9 305.5C358.1 305.5 360.1 304.7 361.6 302.9L361.6 302.9zM418.4 32.04C434.1 33.27 447.1 47.28 447.1 63.92V448.1C447.1 464.5 435.2 478.5 418.9 479.1C418.6 479.1 418.4 480 418.1 480H29.88C29.6 480 29.32 479.1 29.04 479.9C13.31 478.5 1.093 466.1 0 449.7L.0186 61.78C1.081 45.88 13.82 33.09 30.26 31.1H417.7C417.9 31.1 418.2 32.01 418.4 32.04L418.4 32.04zM30.27 41.26C19 42.01 10.02 51.01 9.257 62.4V449.7C9.63 455.1 11.91 460.2 15.7 464C19.48 467.9 24.51 470.3 29.89 470.7H418.1C429.6 469.7 438.7 459.1 438.7 448.1V63.91C438.7 58.17 436.6 52.65 432.7 48.45C428.8 44.24 423.4 41.67 417.7 41.26L30.27 41.26z\"]\n};\nvar faDeezer = {\n prefix: 'fab',\n iconName: 'deezer',\n icon: [576, 512, [], \"e077\", \"M451.46,244.71H576V172H451.46Zm0-173.89v72.67H576V70.82Zm0,275.06H576V273.2H451.46ZM0,447.09H124.54V374.42H0Zm150.47,0H275V374.42H150.47Zm150.52,0H425.53V374.42H301Zm150.47,0H576V374.42H451.46ZM301,345.88H425.53V273.2H301Zm-150.52,0H275V273.2H150.47Zm0-101.17H275V172H150.47Z\"]\n};\nvar faRaspberryPi = {\n prefix: 'fab',\n iconName: 'raspberry-pi',\n icon: [407, 512, [], \"f7bb\", \"M372 232.5l-3.7-6.5c.1-46.4-21.4-65.3-46.5-79.7 7.6-2 15.4-3.6 17.6-13.2 13.1-3.3 15.8-9.4 17.1-15.8 3.4-2.3 14.8-8.7 13.6-19.7 6.4-4.4 10-10.1 8.1-18.1 6.9-7.5 8.7-13.7 5.8-19.4 8.3-10.3 4.6-15.6 1.1-20.9 6.2-11.2.7-23.2-16.6-21.2-6.9-10.1-21.9-7.8-24.2-7.8-2.6-3.2-6-6-16.5-4.7-6.8-6.1-14.4-5-22.3-2.1-9.3-7.3-15.5-1.4-22.6.8C271.6.6 269 5.5 263.5 7.6c-12.3-2.6-16.1 3-22 8.9l-6.9-.1c-18.6 10.8-27.8 32.8-31.1 44.1-3.3-11.3-12.5-33.3-31.1-44.1l-6.9.1c-5.9-5.9-9.7-11.5-22-8.9-5.6-2-8.1-7-19.4-3.4-4.6-1.4-8.9-4.4-13.9-4.3-2.6.1-5.5 1-8.7 3.5-7.9-3-15.5-4-22.3 2.1-10.5-1.3-14 1.4-16.5 4.7-2.3 0-17.3-2.3-24.2 7.8C21.2 16 15.8 28 22 39.2c-3.5 5.4-7.2 10.7 1.1 20.9-2.9 5.7-1.1 11.9 5.8 19.4-1.8 8 1.8 13.7 8.1 18.1-1.2 11 10.2 17.4 13.6 19.7 1.3 6.4 4 12.4 17.1 15.8 2.2 9.5 10 11.2 17.6 13.2-25.1 14.4-46.6 33.3-46.5 79.7l-3.7 6.5c-28.8 17.2-54.7 72.7-14.2 117.7 2.6 14.1 7.1 24.2 11 35.4 5.9 45.2 44.5 66.3 54.6 68.8 14.9 11.2 30.8 21.8 52.2 29.2C159 504.2 181 512 203 512h1c22.1 0 44-7.8 64.2-28.4 21.5-7.4 37.3-18 52.2-29.2 10.2-2.5 48.7-23.6 54.6-68.8 3.9-11.2 8.4-21.3 11-35.4 40.6-45.1 14.7-100.5-14-117.7zm-22.2-8c-1.5 18.7-98.9-65.1-82.1-67.9 45.7-7.5 83.6 19.2 82.1 67.9zm-43 93.1c-24.5 15.8-59.8 5.6-78.8-22.8s-14.6-64.2 9.9-80c24.5-15.8 59.8-5.6 78.8 22.8s14.6 64.2-9.9 80zM238.9 29.3c.8 4.2 1.8 6.8 2.9 7.6 5.4-5.8 9.8-11.7 16.8-17.3 0 3.3-1.7 6.8 2.5 9.4 3.7-5 8.8-9.5 15.5-13.3-3.2 5.6-.6 7.3 1.2 9.6 5.1-4.4 10-8.8 19.4-12.3-2.6 3.1-6.2 6.2-2.4 9.8 5.3-3.3 10.6-6.6 23.1-8.9-2.8 3.1-8.7 6.3-5.1 9.4 6.6-2.5 14-4.4 22.1-5.4-3.9 3.2-7.1 6.3-3.9 8.8 7.1-2.2 16.9-5.1 26.4-2.6l-6 6.1c-.7.8 14.1.6 23.9.8-3.6 5-7.2 9.7-9.3 18.2 1 1 5.8.4 10.4 0-4.7 9.9-12.8 12.3-14.7 16.6 2.9 2.2 6.8 1.6 11.2.1-3.4 6.9-10.4 11.7-16 17.3 1.4 1 3.9 1.6 9.7.9-5.2 5.5-11.4 10.5-18.8 15 1.3 1.5 5.8 1.5 10 1.6-6.7 6.5-15.3 9.9-23.4 14.2 4 2.7 6.9 2.1 10 2.1-5.7 4.7-15.4 7.1-24.4 10 1.7 2.7 3.4 3.4 7.1 4.1-9.5 5.3-23.2 2.9-27 5.6.9 2.7 3.6 4.4 6.7 5.8-15.4.9-57.3-.6-65.4-32.3 15.7-17.3 44.4-37.5 93.7-62.6-38.4 12.8-73 30-102 53.5-34.3-15.9-10.8-55.9 5.8-71.8zm-34.4 114.6c24.2-.3 54.1 17.8 54 34.7-.1 15-21 27.1-53.8 26.9-32.1-.4-53.7-15.2-53.6-29.8 0-11.9 26.2-32.5 53.4-31.8zm-123-12.8c3.7-.7 5.4-1.5 7.1-4.1-9-2.8-18.7-5.3-24.4-10 3.1 0 6 .7 10-2.1-8.1-4.3-16.7-7.7-23.4-14.2 4.2-.1 8.7 0 10-1.6-7.4-4.5-13.6-9.5-18.8-15 5.8.7 8.3.1 9.7-.9-5.6-5.6-12.7-10.4-16-17.3 4.3 1.5 8.3 2 11.2-.1-1.9-4.2-10-6.7-14.7-16.6 4.6.4 9.4 1 10.4 0-2.1-8.5-5.8-13.3-9.3-18.2 9.8-.1 24.6 0 23.9-.8l-6-6.1c9.5-2.5 19.3.4 26.4 2.6 3.2-2.5-.1-5.6-3.9-8.8 8.1 1.1 15.4 2.9 22.1 5.4 3.5-3.1-2.3-6.3-5.1-9.4 12.5 2.3 17.8 5.6 23.1 8.9 3.8-3.6.2-6.7-2.4-9.8 9.4 3.4 14.3 7.9 19.4 12.3 1.7-2.3 4.4-4 1.2-9.6 6.7 3.8 11.8 8.3 15.5 13.3 4.1-2.6 2.5-6.2 2.5-9.4 7 5.6 11.4 11.5 16.8 17.3 1.1-.8 2-3.4 2.9-7.6 16.6 15.9 40.1 55.9 6 71.8-29-23.5-63.6-40.7-102-53.5 49.3 25 78 45.3 93.7 62.6-8 31.8-50 33.2-65.4 32.3 3.1-1.4 5.8-3.2 6.7-5.8-4-2.8-17.6-.4-27.2-5.6zm60.1 24.1c16.8 2.8-80.6 86.5-82.1 67.9-1.5-48.7 36.5-75.5 82.1-67.9zM38.2 342c-23.7-18.8-31.3-73.7 12.6-98.3 26.5-7 9 107.8-12.6 98.3zm91 98.2c-13.3 7.9-45.8 4.7-68.8-27.9-15.5-27.4-13.5-55.2-2.6-63.4 16.3-9.8 41.5 3.4 60.9 25.6 16.9 20 24.6 55.3 10.5 65.7zm-26.4-119.7c-24.5-15.8-28.9-51.6-9.9-80s54.3-38.6 78.8-22.8 28.9 51.6 9.9 80c-19.1 28.4-54.4 38.6-78.8 22.8zM205 496c-29.4 1.2-58.2-23.7-57.8-32.3-.4-12.7 35.8-22.6 59.3-22 23.7-1 55.6 7.5 55.7 18.9.5 11-28.8 35.9-57.2 35.4zm58.9-124.9c.2 29.7-26.2 53.8-58.8 54-32.6.2-59.2-23.8-59.4-53.4v-.6c-.2-29.7 26.2-53.8 58.8-54 32.6-.2 59.2 23.8 59.4 53.4v.6zm82.2 42.7c-25.3 34.6-59.6 35.9-72.3 26.3-13.3-12.4-3.2-50.9 15.1-72 20.9-23.3 43.3-38.5 58.9-26.6 10.5 10.3 16.7 49.1-1.7 72.3zm22.9-73.2c-21.5 9.4-39-105.3-12.6-98.3 43.9 24.7 36.3 79.6 12.6 98.3z\"]\n};\nvar faJira = {\n prefix: 'fab',\n iconName: 'jira',\n icon: [496, 512, [], \"f7b1\", \"M490 241.7C417.1 169 320.6 71.8 248.5 0 83 164.9 6 241.7 6 241.7c-7.9 7.9-7.9 20.7 0 28.7C138.8 402.7 67.8 331.9 248.5 512c379.4-378 15.7-16.7 241.5-241.7 8-7.9 8-20.7 0-28.6zm-241.5 90l-76-75.7 76-75.7 76 75.7-76 75.7z\"]\n};\nvar faDocker = {\n prefix: 'fab',\n iconName: 'docker',\n icon: [640, 512, [], \"f395\", \"M349.9 236.3h-66.1v-59.4h66.1v59.4zm0-204.3h-66.1v60.7h66.1V32zm78.2 144.8H362v59.4h66.1v-59.4zm-156.3-72.1h-66.1v60.1h66.1v-60.1zm78.1 0h-66.1v60.1h66.1v-60.1zm276.8 100c-14.4-9.7-47.6-13.2-73.1-8.4-3.3-24-16.7-44.9-41.1-63.7l-14-9.3-9.3 14c-18.4 27.8-23.4 73.6-3.7 103.8-8.7 4.7-25.8 11.1-48.4 10.7H2.4c-8.7 50.8 5.8 116.8 44 162.1 37.1 43.9 92.7 66.2 165.4 66.2 157.4 0 273.9-72.5 328.4-204.2 21.4.4 67.6.1 91.3-45.2 1.5-2.5 6.6-13.2 8.5-17.1l-13.3-8.9zm-511.1-27.9h-66v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm78.1 0h-66.1v59.4h66.1v-59.4zm-78.1-72.1h-66.1v60.1h66.1v-60.1z\"]\n};\nvar faScreenpal = {\n prefix: 'fab',\n iconName: 'screenpal',\n icon: [512, 512, [], \"e570\", \"M233.5 22.49C233.5 10.07 243.6 0 256 0C268.4 0 278.5 10.07 278.5 22.49C278.5 34.91 268.4 44.98 256 44.98C243.6 44.98 233.5 34.91 233.5 22.49zM313.4 259C313.4 290.7 287.7 316.4 256 316.4C224.3 316.4 198.6 290.7 198.6 259C198.6 227.3 224.3 201.6 256 201.6C287.7 201.6 313.4 227.3 313.4 259zM337.2 350C359.5 330.1 373.7 302.7 377.1 273H496.6C493.1 334.4 466.2 392.2 421.4 434.4C376.7 476.6 317.5 500.2 256 500.2C194.5 500.2 135.3 476.6 90.56 434.4C45.83 392.2 18.94 334.4 15.39 273H135.1C138.5 302.7 152.7 330.1 175 350C197.3 369.9 226.2 380.9 256.1 380.9C285.1 380.9 314.8 369.9 337.2 350zM73.14 140.3C73.54 152.7 63.81 163.1 51.39 163.5C38.97 163.9 28.59 154.2 28.18 141.8C27.78 129.3 37.52 118.9 49.94 118.5C62.35 118.1 72.74 127.9 73.14 140.3zM438.9 141C438.9 128.6 448.9 118.5 461.4 118.5C473.8 118.5 483.8 128.6 483.8 141C483.8 153.5 473.8 163.5 461.4 163.5C448.9 163.5 438.9 153.5 438.9 141zM317.9 95.27C300.6 109.1 278.7 118.1 256 118.1C233.3 118.1 211.4 109.1 194.1 95.27C176.8 80.55 165.3 60.18 161.7 37.78C176.8 31.37 192.5 26.52 208.6 23.31C208.6 35.88 213.6 47.93 222.5 56.82C231.4 65.7 243.4 70.7 256 70.7C268.6 70.7 280.6 65.7 289.5 56.82C298.4 47.93 303.4 35.88 303.4 23.31C319.5 26.52 335.2 31.37 350.3 37.78C346.7 60.18 335.2 80.55 317.9 95.27H317.9zM82.78 231C61.42 238.6 38.06 238.4 16.86 230.4C18.82 214.1 22.46 198.1 27.71 182.5C33.1 185.6 39.05 187.6 45.22 188.5C51.39 189.3 57.67 188.9 63.68 187.3C69.69 185.6 75.33 182.9 80.27 179.1C85.21 175.3 89.36 170.6 92.47 165.2C95.58 159.8 97.61 153.8 98.42 147.7C99.23 141.5 98.83 135.2 97.22 129.2C95.61 123.2 92.83 117.6 89.04 112.6C85.25 107.7 80.53 103.5 75.14 100.4C85.96 88.11 98.01 76.94 111.1 67.07C128.7 81.42 140.6 101.6 144.7 123.9C148.8 146.2 144.8 169.3 133.5 188.9C122.1 208.5 104.1 223.4 82.78 231V231zM429.2 231.1C407.9 223.5 389.9 208.5 378.5 188.9C367.2 169.3 363.3 146.2 367.4 123.9C371.5 101.7 383.4 81.54 400.9 67.19C414 77.04 426.1 88.21 436.9 100.5C426.2 106.9 418.5 117.2 415.4 129.3C412.2 141.3 413.1 154.1 420.2 164.9C426.4 175.7 436.6 183.6 448.6 186.9C460.6 190.2 473.5 188.6 484.3 182.6C489.6 198.1 493.2 214.2 495.2 230.4C473.1 238.5 450.6 238.7 429.2 231.1L429.2 231.1z\"]\n};\nvar faBluetooth = {\n prefix: 'fab',\n iconName: 'bluetooth',\n icon: [448, 512, [], \"f293\", \"M292.6 171.1L249.7 214l-.3-86 43.2 43.1m-43.2 219.8l43.1-43.1-42.9-42.9-.2 86zM416 259.4C416 465 344.1 512 230.9 512S32 465 32 259.4 115.4 0 228.6 0 416 53.9 416 259.4zm-158.5 0l79.4-88.6L211.8 36.5v176.9L138 139.6l-27 26.9 92.7 93-92.7 93 26.9 26.9 73.8-73.8 2.3 170 127.4-127.5-83.9-88.7z\"]\n};\nvar faGitter = {\n prefix: 'fab',\n iconName: 'gitter',\n icon: [384, 512, [], \"f426\", \"M66.4 322.5H16V0h50.4v322.5zM166.9 76.1h-50.4V512h50.4V76.1zm100.6 0h-50.4V512h50.4V76.1zM368 76h-50.4v247H368V76z\"]\n};\nvar faDAndD = {\n prefix: 'fab',\n iconName: 'd-and-d',\n icon: [576, 512, [], \"f38d\", \"M82.5 98.9c-.6-17.2 2-33.8 12.7-48.2.3 7.4 1.2 14.5 4.2 21.6 5.9-27.5 19.7-49.3 42.3-65.5-1.9 5.9-3.5 11.8-3 17.7 8.7-7.4 18.8-17.8 44.4-22.7 14.7-2.8 29.7-2 42.1 1 38.5 9.3 61 34.3 69.7 72.3 5.3 23.1.7 45-8.3 66.4-5.2 12.4-12 24.4-20.7 35.1-2-1.9-3.9-3.8-5.8-5.6-42.8-40.8-26.8-25.2-37.4-37.4-1.1-1.2-1-2.2-.1-3.6 8.3-13.5 11.8-28.2 10-44-1.1-9.8-4.3-18.9-11.3-26.2-14.5-15.3-39.2-15-53.5.6-11.4 12.5-14.1 27.4-10.9 43.6.2 1.3.4 2.7 0 3.9-3.4 13.7-4.6 27.6-2.5 41.6.1.5.1 1.1.1 1.6 0 .3-.1.5-.2 1.1-21.8-11-36-28.3-43.2-52.2-8.3 17.8-11.1 35.5-6.6 54.1-15.6-15.2-21.3-34.3-22-55.2zm469.6 123.2c-11.6-11.6-25-20.4-40.1-26.6-12.8-5.2-26-7.9-39.9-7.1-10 .6-19.6 3.1-29 6.4-2.5.9-5.1 1.6-7.7 2.2-4.9 1.2-7.3-3.1-4.7-6.8 3.2-4.6 3.4-4.2 15-12 .6-.4 1.2-.8 2.2-1.5h-2.5c-.6 0-1.2.2-1.9.3-19.3 3.3-30.7 15.5-48.9 29.6-10.4 8.1-13.8 3.8-12-.5 1.4-3.5 3.3-6.7 5.1-10 1-1.8 2.3-3.4 3.5-5.1-.2-.2-.5-.3-.7-.5-27 18.3-46.7 42.4-57.7 73.3.3.3.7.6 1 .9.3-.6.5-1.2.9-1.7 10.4-12.1 22.8-21.8 36.6-29.8 18.2-10.6 37.5-18.3 58.7-20.2 4.3-.4 8.7-.1 13.1-.1-1.8.7-3.5.9-5.3 1.1-18.5 2.4-35.5 9-51.5 18.5-30.2 17.9-54.5 42.2-75.1 70.4-.3.4-.4.9-.7 1.3 14.5 5.3 24 17.3 36.1 25.6.2-.1.3-.2.4-.4l1.2-2.7c12.2-26.9 27-52.3 46.7-74.5 16.7-18.8 38-25.3 62.5-20 5.9 1.3 11.4 4.4 17.2 6.8 2.3-1.4 5.1-3.2 8-4.7 8.4-4.3 17.4-7 26.7-9 14.7-3.1 29.5-4.9 44.5-1.3v-.5c-.5-.4-1.2-.8-1.7-1.4zM316.7 397.6c-39.4-33-22.8-19.5-42.7-35.6-.8.9 0-.2-1.9 3-11.2 19.1-25.5 35.3-44 47.6-10.3 6.8-21.5 11.8-34.1 11.8-21.6 0-38.2-9.5-49.4-27.8-12-19.5-13.3-40.7-8.2-62.6 7.8-33.8 30.1-55.2 38.6-64.3-18.7-6.2-33 1.7-46.4 13.9.8-13.9 4.3-26.2 11.8-37.3-24.3 10.6-45.9 25-64.8 43.9-.3-5.8 5.4-43.7 5.6-44.7.3-2.7-.6-5.3-3-7.4-24.2 24.7-44.5 51.8-56.1 84.6 7.4-5.9 14.9-11.4 23.6-16.2-8.3 22.3-19.6 52.8-7.8 101.1 4.6 19 11.9 36.8 24.1 52.3 2.9 3.7 6.3 6.9 9.5 10.3.2-.2.4-.3.6-.5-1.4-7-2.2-14.1-1.5-21.9 2.2 3.2 3.9 6 5.9 8.6 12.6 16 28.7 27.4 47.2 35.6 25 11.3 51.1 13.3 77.9 8.6 54.9-9.7 90.7-48.6 116-98.8 1-1.8.6-2.9-.9-4.2zm172-46.4c-9.5-3.1-22.2-4.2-28.7-2.9 9.9 4 14.1 6.6 18.8 12 12.6 14.4 10.4 34.7-5.4 45.6-11.7 8.1-24.9 10.5-38.9 9.1-1.2-.1-2.3-.4-3-.6 2.8-3.7 6-7 8.1-10.8 9.4-16.8 5.4-42.1-8.7-56.1-2.1-2.1-4.6-3.9-7-5.9-.3 1.3-.1 2.1.1 2.8 4.2 16.6-8.1 32.4-24.8 31.8-7.6-.3-13.9-3.8-19.6-8.5-19.5-16.1-39.1-32.1-58.5-48.3-5.9-4.9-12.5-8.1-20.1-8.7-4.6-.4-9.3-.6-13.9-.9-5.9-.4-8.8-2.8-10.4-8.4-.9-3.4-1.5-6.8-2.2-10.2-1.5-8.1-6.2-13-14.3-14.2-4.4-.7-8.9-1-13.3-1.5-13-1.4-19.8-7.4-22.6-20.3-5 11-1.6 22.4 7.3 29.9 4.5 3.8 9.3 7.3 13.8 11.2 4.6 3.8 7.4 8.7 7.9 14.8.4 4.7.8 9.5 1.8 14.1 2.2 10.6 8.9 18.4 17 25.1 16.5 13.7 33 27.3 49.5 41.1 17.9 15 13.9 32.8 13 56-.9 22.9 12.2 42.9 33.5 51.2 1 .4 2 .6 3.6 1.1-15.7-18.2-10.1-44.1.7-52.3.3 2.2.4 4.3.9 6.4 9.4 44.1 45.4 64.2 85 56.9 16-2.9 30.6-8.9 42.9-19.8 2-1.8 3.7-4.1 5.9-6.5-19.3 4.6-35.8.1-50.9-10.6.7-.3 1.3-.3 1.9-.3 21.3 1.8 40.6-3.4 57-17.4 19.5-16.6 26.6-42.9 17.4-66-8.3-20.1-23.6-32.3-43.8-38.9zM99.4 179.3c-5.3-9.2-13.2-15.6-22.1-21.3 13.7-.5 26.6.2 39.6 3.7-7-12.2-8.5-24.7-5-38.7 5.3 11.9 13.7 20.1 23.6 26.8 19.7 13.2 35.7 19.6 46.7 30.2 3.4 3.3 6.3 7.1 9.6 10.9-.8-2.1-1.4-4.1-2.2-6-5-10.6-13-18.6-22.6-25-1.8-1.2-2.8-2.5-3.4-4.5-3.3-12.5-3-25.1-.7-37.6 1-5.5 2.8-10.9 4.5-16.3.8-2.4 2.3-4.6 4-6.6.6 6.9 0 25.5 19.6 46 10.8 11.3 22.4 21.9 33.9 32.7 9 8.5 18.3 16.7 25.5 26.8 1.1 1.6 2.2 3.3 3.8 4.7-5-13-14.2-24.1-24.2-33.8-9.6-9.3-19.4-18.4-29.2-27.4-3.3-3-4.6-6.7-5.1-10.9-1.2-10.4 0-20.6 4.3-30.2.5-1 1.1-2 1.9-3.3.5 4.2.6 7.9 1.4 11.6 4.8 23.1 20.4 36.3 49.3 63.5 10 9.4 19.3 19.2 25.6 31.6 4.8 9.3 7.3 19 5.7 29.6-.1.6.5 1.7 1.1 2 6.2 2.6 10 6.9 9.7 14.3 7.7-2.6 12.5-8 16.4-14.5 4.2 20.2-9.1 50.3-27.2 58.7.4-4.5 5-23.4-16.5-27.7-6.8-1.3-12.8-1.3-22.9-2.1 4.7-9 10.4-20.6.5-22.4-24.9-4.6-52.8 1.9-57.8 4.6 8.2.4 16.3 1 23.5 3.3-2 6.5-4 12.7-5.8 18.9-1.9 6.5 2.1 14.6 9.3 9.6 1.2-.9 2.3-1.9 3.3-2.7-3.1 17.9-2.9 15.9-2.8 18.3.3 10.2 9.5 7.8 15.7 7.3-2.5 11.8-29.5 27.3-45.4 25.8 7-4.7 12.7-10.3 15.9-17.9-6.5.8-12.9 1.6-19.2 2.4l-.3-.9c4.7-3.4 8-7.8 10.2-13.1 8.7-21.1-3.6-38-25-39.9-9.1-.8-17.8.8-25.9 5.5 6.2-15.6 17.2-26.6 32.6-34.5-15.2-4.3-8.9-2.7-24.6-6.3 14.6-9.3 30.2-13.2 46.5-14.6-5.2-3.2-48.1-3.6-70.2 20.9 7.9 1.4 15.5 2.8 23.2 4.2-23.8 7-44 19.7-62.4 35.6 1.1-4.8 2.7-9.5 3.3-14.3.6-4.5.8-9.2.1-13.6-1.5-9.4-8.9-15.1-19.7-16.3-7.9-.9-15.6.1-23.3 1.3-.9.1-1.7.3-2.9 0 15.8-14.8 36-21.7 53.1-33.5 6-4.5 6.8-8.2 3-14.9zm128.4 26.8c3.3 16 12.6 25.5 23.8 24.3-4.6-11.3-12.1-19.5-23.8-24.3z\"]\n};\nvar faMicroblog = {\n prefix: 'fab',\n iconName: 'microblog',\n icon: [448, 512, [], \"e01a\", \"M399.36,362.23c29.49-34.69,47.1-78.34,47.1-125.79C446.46,123.49,346.86,32,224,32S1.54,123.49,1.54,236.44,101.14,440.87,224,440.87a239.28,239.28,0,0,0,79.44-13.44,7.18,7.18,0,0,1,8.12,2.56c18.58,25.09,47.61,42.74,79.89,49.92a4.42,4.42,0,0,0,5.22-3.43,4.37,4.37,0,0,0-.85-3.62,87,87,0,0,1,3.69-110.69ZM329.52,212.4l-57.3,43.49L293,324.75a6.5,6.5,0,0,1-9.94,7.22L224,290.92,164.94,332a6.51,6.51,0,0,1-9.95-7.22l20.79-68.86-57.3-43.49a6.5,6.5,0,0,1,3.8-11.68l71.88-1.51,23.66-67.92a6.5,6.5,0,0,1,12.28,0l23.66,67.92,71.88,1.51a6.5,6.5,0,0,1,3.88,11.68Z\"]\n};\nvar faCcDinersClub = {\n prefix: 'fab',\n iconName: 'cc-diners-club',\n icon: [576, 512, [], \"f24c\", \"M239.7 79.9c-96.9 0-175.8 78.6-175.8 175.8 0 96.9 78.9 175.8 175.8 175.8 97.2 0 175.8-78.9 175.8-175.8 0-97.2-78.6-175.8-175.8-175.8zm-39.9 279.6c-41.7-15.9-71.4-56.4-71.4-103.8s29.7-87.9 71.4-104.1v207.9zm79.8.3V151.6c41.7 16.2 71.4 56.7 71.4 104.1s-29.7 87.9-71.4 104.1zM528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM329.7 448h-90.3c-106.2 0-193.8-85.5-193.8-190.2C45.6 143.2 133.2 64 239.4 64h90.3c105 0 200.7 79.2 200.7 193.8 0 104.7-95.7 190.2-200.7 190.2z\"]\n};\nvar faGgCircle = {\n prefix: 'fab',\n iconName: 'gg-circle',\n icon: [512, 512, [], \"f261\", \"M257 8C120 8 9 119 9 256s111 248 248 248 248-111 248-248S394 8 257 8zm-49.5 374.8L81.8 257.1l125.7-125.7 35.2 35.4-24.2 24.2-11.1-11.1-77.2 77.2 77.2 77.2 26.6-26.6-53.1-52.9 24.4-24.4 77.2 77.2-75 75.2zm99-2.2l-35.2-35.2 24.1-24.4 11.1 11.1 77.2-77.2-77.2-77.2-26.5 26.5 53.1 52.9-24.4 24.4-77.2-77.2 75-75L432.2 255 306.5 380.6z\"]\n};\nvar faPiedPiperHat = {\n prefix: 'fab',\n iconName: 'pied-piper-hat',\n icon: [640, 512, [], \"f4e5\", \"M640 24.9c-80.8 53.6-89.4 92.5-96.4 104.4-6.7 12.2-11.7 60.3-23.3 83.6-11.7 23.6-54.2 42.2-66.1 50-11.7 7.8-28.3 38.1-41.9 64.2-108.1-4.4-167.4 38.8-259.2 93.6 29.4-9.7 43.3-16.7 43.3-16.7 94.2-36 139.3-68.3 281.1-49.2 1.1 0 1.9.6 2.8.8 3.9 2.2 5.3 6.9 3.1 10.8l-53.9 95.8c-2.5 4.7-7.8 7.2-13.1 6.1-126.8-23.8-226.9 17.3-318.9 18.6C24.1 488 0 453.4 0 451.8c0-1.1.6-1.7 1.7-1.7 0 0 38.3 0 103.1-15.3C178.4 294.5 244 245.4 315.4 245.4c0 0 71.7 0 90.6 61.9 22.8-39.7 28.3-49.2 28.3-49.2 5.3-9.4 35-77.2 86.4-141.4 51.5-64 90.4-79.9 119.3-91.8z\"]\n};\nvar faKickstarterK = {\n prefix: 'fab',\n iconName: 'kickstarter-k',\n icon: [384, 512, [], \"f3bc\", \"M147.3 114.4c0-56.2-32.5-82.4-73.4-82.4C26.2 32 0 68.2 0 113.4v283c0 47.3 25.3 83.4 74.9 83.4 39.8 0 72.4-25.6 72.4-83.4v-76.5l112.1 138.3c22.7 27.2 72.1 30.7 103.2 0 27-27.6 27.3-67.4 7.4-92.2l-90.8-114.8 74.9-107.4c17.4-24.7 17.5-63.1-10.4-89.8-30.3-29-82.4-31.6-113.6 12.8L147.3 185v-70.6z\"]\n};\nvar faYandex = {\n prefix: 'fab',\n iconName: 'yandex',\n icon: [256, 512, [], \"f413\", \"M153.1 315.8L65.7 512H2l96-209.8c-45.1-22.9-75.2-64.4-75.2-141.1C22.7 53.7 90.8 0 171.7 0H254v512h-55.1V315.8h-45.8zm45.8-269.3h-29.4c-44.4 0-87.4 29.4-87.4 114.6 0 82.3 39.4 108.8 87.4 108.8h29.4V46.5z\"]\n};\nvar faReadme = {\n prefix: 'fab',\n iconName: 'readme',\n icon: [576, 512, [], \"f4d5\", \"M528.3 46.5H388.5c-48.1 0-89.9 33.3-100.4 80.3-10.6-47-52.3-80.3-100.4-80.3H48c-26.5 0-48 21.5-48 48v245.8c0 26.5 21.5 48 48 48h89.7c102.2 0 132.7 24.4 147.3 75 .7 2.8 5.2 2.8 6 0 14.7-50.6 45.2-75 147.3-75H528c26.5 0 48-21.5 48-48V94.6c0-26.4-21.3-47.9-47.7-48.1zM242 311.9c0 1.9-1.5 3.5-3.5 3.5H78.2c-1.9 0-3.5-1.5-3.5-3.5V289c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5v22.9zm0-60.9c0 1.9-1.5 3.5-3.5 3.5H78.2c-1.9 0-3.5-1.5-3.5-3.5v-22.9c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5V251zm0-60.9c0 1.9-1.5 3.5-3.5 3.5H78.2c-1.9 0-3.5-1.5-3.5-3.5v-22.9c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5v22.9zm259.3 121.7c0 1.9-1.5 3.5-3.5 3.5H337.5c-1.9 0-3.5-1.5-3.5-3.5v-22.9c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5v22.9zm0-60.9c0 1.9-1.5 3.5-3.5 3.5H337.5c-1.9 0-3.5-1.5-3.5-3.5V228c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5v22.9zm0-60.9c0 1.9-1.5 3.5-3.5 3.5H337.5c-1.9 0-3.5-1.5-3.5-3.5v-22.8c0-1.9 1.5-3.5 3.5-3.5h160.4c1.9 0 3.5 1.5 3.5 3.5V190z\"]\n};\nvar faHtml5 = {\n prefix: 'fab',\n iconName: 'html5',\n icon: [384, 512, [], \"f13b\", \"M0 32l34.9 395.8L191.5 480l157.6-52.2L384 32H0zm308.2 127.9H124.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L138 320l53.5 14.5 53.7-14.5 6-62.2H84.3L71.5 112.2h241.1l-4.4 47.7z\"]\n};\nvar faSellsy = {\n prefix: 'fab',\n iconName: 'sellsy',\n icon: [640, 512, [], \"f213\", \"M539.71 237.308c3.064-12.257 4.29-24.821 4.29-37.384C544 107.382 468.618 32 376.076 32c-77.22 0-144.634 53.012-163.02 127.781-15.322-13.176-34.934-20.53-55.157-20.53-46.271 0-83.962 37.69-83.962 83.961 0 7.354.92 15.015 3.065 22.369-42.9 20.225-70.785 63.738-70.785 111.234C6.216 424.843 61.68 480 129.401 480h381.198c67.72 0 123.184-55.157 123.184-123.184.001-56.384-38.916-106.025-94.073-119.508zM199.88 401.554c0 8.274-7.048 15.321-15.321 15.321H153.61c-8.274 0-15.321-7.048-15.321-15.321V290.626c0-8.273 7.048-15.321 15.321-15.321h30.949c8.274 0 15.321 7.048 15.321 15.321v110.928zm89.477 0c0 8.274-7.048 15.321-15.322 15.321h-30.949c-8.274 0-15.321-7.048-15.321-15.321V270.096c0-8.274 7.048-15.321 15.321-15.321h30.949c8.274 0 15.322 7.048 15.322 15.321v131.458zm89.477 0c0 8.274-7.047 15.321-15.321 15.321h-30.949c-8.274 0-15.322-7.048-15.322-15.321V238.84c0-8.274 7.048-15.321 15.322-15.321h30.949c8.274 0 15.321 7.048 15.321 15.321v162.714zm87.027 0c0 8.274-7.048 15.321-15.322 15.321h-28.497c-8.274 0-15.321-7.048-15.321-15.321V176.941c0-8.579 7.047-15.628 15.321-15.628h28.497c8.274 0 15.322 7.048 15.322 15.628v224.613z\"]\n};\nvar faSass = {\n prefix: 'fab',\n iconName: 'sass',\n icon: [640, 512, [], \"f41e\", \"M301.84 378.92c-.3.6-.6 1.08 0 0zm249.13-87a131.16 131.16 0 0 0-58 13.5c-5.9-11.9-12-22.3-13-30.1-1.2-9.1-2.5-14.5-1.1-25.3s7.7-26.1 7.6-27.2-1.4-6.6-14.3-6.7-24 2.5-25.29 5.9a122.83 122.83 0 0 0-5.3 19.1c-2.3 11.7-25.79 53.5-39.09 75.3-4.4-8.5-8.1-16-8.9-22-1.2-9.1-2.5-14.5-1.1-25.3s7.7-26.1 7.6-27.2-1.4-6.6-14.29-6.7-24 2.5-25.3 5.9-2.7 11.4-5.3 19.1-33.89 77.3-42.08 95.4c-4.2 9.2-7.8 16.6-10.4 21.6-.4.8-.7 1.3-.9 1.7.3-.5.5-1 .5-.8-2.2 4.3-3.5 6.7-3.5 6.7v.1c-1.7 3.2-3.6 6.1-4.5 6.1-.6 0-1.9-8.4.3-19.9 4.7-24.2 15.8-61.8 15.7-63.1-.1-.7 2.1-7.2-7.3-10.7-9.1-3.3-12.4 2.2-13.2 2.2s-1.4 2-1.4 2 10.1-42.4-19.39-42.4c-18.4 0-44 20.2-56.58 38.5-7.9 4.3-25 13.6-43 23.5-6.9 3.8-14 7.7-20.7 11.4-.5-.5-.9-1-1.4-1.5-35.79-38.2-101.87-65.2-99.07-116.5 1-18.7 7.5-67.8 127.07-127.4 98-48.8 176.35-35.4 189.84-5.6 19.4 42.5-41.89 121.6-143.66 133-38.79 4.3-59.18-10.7-64.28-16.3-5.3-5.9-6.1-6.2-8.1-5.1-3.3 1.8-1.2 7 0 10.1 3 7.9 15.5 21.9 36.79 28.9 18.7 6.1 64.18 9.5 119.17-11.8 61.78-23.8 109.87-90.1 95.77-145.6C386.52 18.32 293-.18 204.57 31.22c-52.69 18.7-109.67 48.1-150.66 86.4-48.69 45.6-56.48 85.3-53.28 101.9 11.39 58.9 92.57 97.3 125.06 125.7-1.6.9-3.1 1.7-4.5 2.5-16.29 8.1-78.18 40.5-93.67 74.7-17.5 38.8 2.9 66.6 16.29 70.4 41.79 11.6 84.58-9.3 107.57-43.6s20.2-79.1 9.6-99.5c-.1-.3-.3-.5-.4-.8 4.2-2.5 8.5-5 12.8-7.5 8.29-4.9 16.39-9.4 23.49-13.3-4 10.8-6.9 23.8-8.4 42.6-1.8 22 7.3 50.5 19.1 61.7 5.2 4.9 11.49 5 15.39 5 13.8 0 20-11.4 26.89-25 8.5-16.6 16-35.9 16-35.9s-9.4 52.2 16.3 52.2c9.39 0 18.79-12.1 23-18.3v.1s.2-.4.7-1.2c1-1.5 1.5-2.4 1.5-2.4v-.3c3.8-6.5 12.1-21.4 24.59-46 16.2-31.8 31.69-71.5 31.69-71.5a201.24 201.24 0 0 0 6.2 25.8c2.8 9.5 8.7 19.9 13.4 30-3.8 5.2-6.1 8.2-6.1 8.2a.31.31 0 0 0 .1.2c-3 4-6.4 8.3-9.9 12.5-12.79 15.2-28 32.6-30 37.6-2.4 5.9-1.8 10.3 2.8 13.7 3.4 2.6 9.4 3 15.69 2.5 11.5-.8 19.6-3.6 23.5-5.4a82.2 82.2 0 0 0 20.19-10.6c12.5-9.2 20.1-22.4 19.4-39.8-.4-9.6-3.5-19.2-7.3-28.2 1.1-1.6 2.3-3.3 3.4-5C434.8 301.72 450.1 270 450.1 270a201.24 201.24 0 0 0 6.2 25.8c2.4 8.1 7.09 17 11.39 25.7-18.59 15.1-30.09 32.6-34.09 44.1-7.4 21.3-1.6 30.9 9.3 33.1 4.9 1 11.9-1.3 17.1-3.5a79.46 79.46 0 0 0 21.59-11.1c12.5-9.2 24.59-22.1 23.79-39.6-.3-7.9-2.5-15.8-5.4-23.4 15.7-6.6 36.09-10.2 62.09-7.2 55.68 6.5 66.58 41.3 64.48 55.8s-13.8 22.6-17.7 25-5.1 3.3-4.8 5.1c.5 2.6 2.3 2.5 5.6 1.9 4.6-.8 29.19-11.8 30.29-38.7 1.6-34-31.09-71.4-89-71.1zm-429.18 144.7c-18.39 20.1-44.19 27.7-55.28 21.3C54.61 451 59.31 421.42 82 400c13.8-13 31.59-25 43.39-32.4 2.7-1.6 6.6-4 11.4-6.9.8-.5 1.2-.7 1.2-.7.9-.6 1.9-1.1 2.9-1.7 8.29 30.4.3 57.2-19.1 78.3zm134.36-91.4c-6.4 15.7-19.89 55.7-28.09 53.6-7-1.8-11.3-32.3-1.4-62.3 5-15.1 15.6-33.1 21.9-40.1 10.09-11.3 21.19-14.9 23.79-10.4 3.5 5.9-12.2 49.4-16.2 59.2zm111 53c-2.7 1.4-5.2 2.3-6.4 1.6-.9-.5 1.1-2.4 1.1-2.4s13.9-14.9 19.4-21.7c3.2-4 6.9-8.7 10.89-13.9 0 .5.1 1 .1 1.6-.13 17.9-17.32 30-25.12 34.8zm85.58-19.5c-2-1.4-1.7-6.1 5-20.7 2.6-5.7 8.59-15.3 19-24.5a36.18 36.18 0 0 1 1.9 10.8c-.1 22.5-16.2 30.9-25.89 34.4z\"]\n};\nvar faWirsindhandwerk = {\n prefix: 'fab',\n iconName: 'wirsindhandwerk',\n icon: [512, 512, [\"wsh\"], \"e2d0\", \"M50.77161,479.81213h83.36071V367.84741l-83.36071,47.009Zm329.04675,0h82.35022V414.85645l-82.35022-47.009Zm.00568-448V251.568L256.1759,179.1861,134.50378,251.568V31.81213H50.77161V392.60565L256.1759,270.31909,462.16858,392.60565V31.81213Z\"]\n};\nvar faWsh = faWirsindhandwerk;\nvar faBuromobelexperte = {\n prefix: 'fab',\n iconName: 'buromobelexperte',\n icon: [448, 512, [], \"f37f\", \"M0 32v128h128V32H0zm120 120H8V40h112v112zm40-120v128h128V32H160zm120 120H168V40h112v112zm40-120v128h128V32H320zm120 120H328V40h112v112zM0 192v128h128V192H0zm120 120H8V200h112v112zm40-120v128h128V192H160zm120 120H168V200h112v112zm40-120v128h128V192H320zm120 120H328V200h112v112zM0 352v128h128V352H0zm120 120H8V360h112v112zm40-120v128h128V352H160zm120 120H168V360h112v112zm40-120v128h128V352H320z\"]\n};\nvar faSalesforce = {\n prefix: 'fab',\n iconName: 'salesforce',\n icon: [640, 512, [], \"f83b\", \"M248.89 245.64h-26.35c.69-5.16 3.32-14.12 13.64-14.12 6.75 0 11.97 3.82 12.71 14.12zm136.66-13.88c-.47 0-14.11-1.77-14.11 20s13.63 20 14.11 20c13 0 14.11-13.54 14.11-20 0-21.76-13.66-20-14.11-20zm-243.22 23.76a8.63 8.63 0 0 0-3.29 7.29c0 4.78 2.08 6.05 3.29 7.05 4.7 3.7 15.07 2.12 20.93.95v-16.94c-5.32-1.07-16.73-1.96-20.93 1.65zM640 232c0 87.58-80 154.39-165.36 136.43-18.37 33-70.73 70.75-132.2 41.63-41.16 96.05-177.89 92.18-213.81-5.17C8.91 428.78-50.19 266.52 53.36 205.61 18.61 126.18 76 32 167.67 32a124.24 124.24 0 0 1 98.56 48.7c20.7-21.4 49.4-34.81 81.15-34.81 42.34 0 79 23.52 98.8 58.57C539 63.78 640 132.69 640 232zm-519.55 31.8c0-11.76-11.69-15.17-17.87-17.17-5.27-2.11-13.41-3.51-13.41-8.94 0-9.46 17-6.66 25.17-2.12 0 0 1.17.71 1.64-.47.24-.7 2.36-6.58 2.59-7.29a1.13 1.13 0 0 0-.7-1.41c-12.33-7.63-40.7-8.51-40.7 12.7 0 12.46 11.49 15.44 17.88 17.17 4.72 1.58 13.17 3 13.17 8.7 0 4-3.53 7.06-9.17 7.06a31.76 31.76 0 0 1-19-6.35c-.47-.23-1.42-.71-1.65.71l-2.4 7.47c-.47.94.23 1.18.23 1.41 1.75 1.4 10.3 6.59 22.82 6.59 13.17 0 21.4-7.06 21.4-18.11zm32-42.58c-10.13 0-18.66 3.17-21.4 5.18a1 1 0 0 0-.24 1.41l2.59 7.06a1 1 0 0 0 1.18.7c.65 0 6.8-4 16.93-4 4 0 7.06.71 9.18 2.36 3.6 2.8 3.06 8.29 3.06 10.58-4.79-.3-19.11-3.44-29.41 3.76a16.92 16.92 0 0 0-7.34 14.54c0 5.9 1.51 10.4 6.59 14.35 12.24 8.16 36.28 2 38.1 1.41 1.58-.32 3.53-.66 3.53-1.88v-33.88c.04-4.61.32-21.64-22.78-21.64zM199 200.24a1.11 1.11 0 0 0-1.18-1.18H188a1.11 1.11 0 0 0-1.17 1.18v79a1.11 1.11 0 0 0 1.17 1.18h9.88a1.11 1.11 0 0 0 1.18-1.18zm55.75 28.93c-2.1-2.31-6.79-7.53-17.65-7.53-3.51 0-14.16.23-20.7 8.94-6.35 7.63-6.58 18.11-6.58 21.41 0 3.12.15 14.26 7.06 21.17 2.64 2.91 9.06 8.23 22.81 8.23 10.82 0 16.47-2.35 18.58-3.76.47-.24.71-.71.24-1.88l-2.35-6.83a1.26 1.26 0 0 0-1.41-.7c-2.59.94-6.35 2.82-15.29 2.82-17.42 0-16.85-14.74-16.94-16.7h37.17a1.23 1.23 0 0 0 1.17-.94c-.29 0 2.07-14.7-6.09-24.23zm36.69 52.69c13.17 0 21.41-7.06 21.41-18.11 0-11.76-11.7-15.17-17.88-17.17-4.14-1.66-13.41-3.38-13.41-8.94 0-3.76 3.29-6.35 8.47-6.35a38.11 38.11 0 0 1 16.7 4.23s1.18.71 1.65-.47c.23-.7 2.35-6.58 2.58-7.29a1.13 1.13 0 0 0-.7-1.41c-7.91-4.9-16.74-4.94-20.23-4.94-12 0-20.46 7.29-20.46 17.64 0 12.46 11.48 15.44 17.87 17.17 6.11 2 13.17 3.26 13.17 8.7 0 4-3.52 7.06-9.17 7.06a31.8 31.8 0 0 1-19-6.35 1 1 0 0 0-1.65.71l-2.35 7.52c-.47.94.23 1.18.23 1.41 1.72 1.4 10.33 6.59 22.79 6.59zM357.09 224c0-.71-.24-1.18-1.18-1.18h-11.76c0-.14.94-8.94 4.47-12.47 4.16-4.15 11.76-1.64 12-1.64 1.17.47 1.41 0 1.64-.47l2.83-7.77c.7-.94 0-1.17-.24-1.41-5.09-2-17.35-2.87-24.46 4.24-5.48 5.48-7 13.92-8 19.52h-8.47a1.28 1.28 0 0 0-1.17 1.18l-1.42 7.76c0 .7.24 1.17 1.18 1.17h8.23c-8.51 47.9-8.75 50.21-10.35 55.52-1.08 3.62-3.29 6.9-5.88 7.76-.09 0-3.88 1.68-9.64-.24 0 0-.94-.47-1.41.71-.24.71-2.59 6.82-2.83 7.53s0 1.41.47 1.41c5.11 2 13 1.77 17.88 0 6.28-2.28 9.72-7.89 11.53-12.94 2.75-7.71 2.81-9.79 11.76-59.74h12.23a1.29 1.29 0 0 0 1.18-1.18zm53.39 16c-.56-1.68-5.1-18.11-25.17-18.11-15.25 0-23 10-25.16 18.11-1 3-3.18 14 0 23.52.09.3 4.41 18.12 25.16 18.12 14.95 0 22.9-9.61 25.17-18.12 3.21-9.61 1.01-20.52 0-23.52zm45.4-16.7c-5-1.65-16.62-1.9-22.11 5.41v-4.47a1.11 1.11 0 0 0-1.18-1.17h-9.4a1.11 1.11 0 0 0-1.18 1.17v55.28a1.12 1.12 0 0 0 1.18 1.18h9.64a1.12 1.12 0 0 0 1.18-1.18v-27.77c0-2.91.05-11.37 4.46-15.05 4.9-4.9 12-3.36 13.41-3.06a1.57 1.57 0 0 0 1.41-.94 74 74 0 0 0 3.06-8 1.16 1.16 0 0 0-.47-1.41zm46.81 54.1l-2.12-7.29c-.47-1.18-1.41-.71-1.41-.71-4.23 1.82-10.15 1.89-11.29 1.89-4.64 0-17.17-1.13-17.17-19.76 0-6.23 1.85-19.76 16.47-19.76a34.85 34.85 0 0 1 11.52 1.65s.94.47 1.18-.71c.94-2.59 1.64-4.47 2.59-7.53.23-.94-.47-1.17-.71-1.17-11.59-3.87-22.34-2.53-27.76 0-1.59.74-16.23 6.49-16.23 27.52 0 2.9-.58 30.11 28.94 30.11a44.45 44.45 0 0 0 15.52-2.83 1.3 1.3 0 0 0 .47-1.42zm53.87-39.52c-.8-3-5.37-16.23-22.35-16.23-16 0-23.52 10.11-25.64 18.59a38.58 38.58 0 0 0-1.65 11.76c0 25.87 18.84 29.4 29.88 29.4 10.82 0 16.46-2.35 18.58-3.76.47-.24.71-.71.24-1.88l-2.36-6.83a1.26 1.26 0 0 0-1.41-.7c-2.59.94-6.35 2.82-15.29 2.82-17.42 0-16.85-14.74-16.93-16.7h37.16a1.25 1.25 0 0 0 1.18-.94c-.24-.01.94-7.07-1.41-15.54zm-23.29-6.35c-10.33 0-13 9-13.64 14.12H546c-.88-11.92-7.62-14.13-12.73-14.13z\"]\n};\nvar faOctopusDeploy = {\n prefix: 'fab',\n iconName: 'octopus-deploy',\n icon: [512, 512, [], \"e082\", \"M455.6,349.2c-45.891-39.09-36.67-77.877-16.095-128.11C475.16,134.04,415.967,34.14,329.93,8.3,237.04-19.6,134.252,24.341,99.677,117.147a180.862,180.862,0,0,0-10.988,73.544c1.733,29.543,14.717,52.97,24.09,80.3,17.2,50.161-28.1,92.743-66.662,117.582-46.806,30.2-36.319,39.857-8.428,41.858,23.378,1.68,44.478-4.548,65.265-15.045,9.2-4.647,40.687-18.931,45.13-28.588C135.9,413.388,111.122,459.5,126.621,488.9c19.1,36.229,67.112-31.77,76.709-45.812,8.591-12.572,42.963-81.279,63.627-46.926,18.865,31.361,8.6,76.391,35.738,104.622,32.854,34.2,51.155-18.312,51.412-44.221.163-16.411-6.1-95.852,29.9-59.944C405.428,418,436.912,467.8,472.568,463.642c38.736-4.516-22.123-67.967-28.262-78.695,5.393,4.279,53.665,34.128,53.818,9.52C498.234,375.678,468.039,359.8,455.6,349.2Z\"]\n};\nvar faMedapps = {\n prefix: 'fab',\n iconName: 'medapps',\n icon: [320, 512, [], \"f3c6\", \"M118.3 238.4c3.5-12.5 6.9-33.6 13.2-33.6 8.3 1.8 9.6 23.4 18.6 36.6 4.6-23.5 5.3-85.1 14.1-86.7 9-.7 19.7 66.5 22 77.5 9.9 4.1 48.9 6.6 48.9 6.6 1.9 7.3-24 7.6-40 7.8-4.6 14.8-5.4 27.7-11.4 28-4.7.2-8.2-28.8-17.5-49.6l-9.4 65.5c-4.4 13-15.5-22.5-21.9-39.3-3.3-.1-62.4-1.6-47.6-7.8l31-5zM228 448c21.2 0 21.2-32 0-32H92c-21.2 0-21.2 32 0 32h136zm-24 64c21.2 0 21.2-32 0-32h-88c-21.2 0-21.2 32 0 32h88zm34.2-141.5c3.2-18.9 5.2-36.4 11.9-48.8 7.9-14.7 16.1-28.1 24-41 24.6-40.4 45.9-75.2 45.9-125.5C320 69.6 248.2 0 160 0S0 69.6 0 155.2c0 50.2 21.3 85.1 45.9 125.5 7.9 12.9 16 26.3 24 41 6.7 12.5 8.7 29.8 11.9 48.9 3.5 21 36.1 15.7 32.6-5.1-3.6-21.7-5.6-40.7-15.3-58.6C66.5 246.5 33 211.3 33 155.2 33 87.3 90 32 160 32s127 55.3 127 123.2c0 56.1-33.5 91.3-66.1 151.6-9.7 18-11.7 37.4-15.3 58.6-3.4 20.6 29 26.4 32.6 5.1z\"]\n};\nvar faNs8 = {\n prefix: 'fab',\n iconName: 'ns8',\n icon: [640, 512, [], \"f3d5\", \"M104.324,269.172h26.067V242.994H104.324Zm52.466-26.178-.055-26.178v-.941a39.325,39.325,0,0,0-78.644.941v.166h26.4v-.166a12.98,12.98,0,0,1,25.956,0v26.178Zm52.356,25.846a91.1,91.1,0,0,1-91.1,91.1h-.609a91.1,91.1,0,0,1-91.1-91.1H0v.166A117.33,117.33,0,0,0,117.44,386.28h.775A117.331,117.331,0,0,0,235.49,268.84V242.828H209.146Zm-157.233,0a65.362,65.362,0,0,0,130.723,0H156.292a39.023,39.023,0,0,1-78.035,0V242.883H51.968v-26.62A65.42,65.42,0,0,1,182.8,217.48v25.293h26.344V217.48a91.761,91.761,0,0,0-183.522,0v25.4H51.913Zm418.4-71.173c13.67,0,24.573,6.642,30.052,18.264l.719,1.549,23.245-11.511-.609-1.439c-8.025-19.26-28.5-31.27-53.407-31.27-23.134,0-43.611,11.4-50.972,28.447-.123,26.876-.158,23.9,0,24.85,4.7,11.013,14.555,19.37,28.668,24.241a102.033,102.033,0,0,0,19.813,3.984c5.479.72,10.626,1.384,15.829,3.1,6.364,2.1,10.46,5.257,12.84,9.851v9.851c-3.708,7.527-13.781,12.342-25.791,12.342-14.334,0-25.956-6.918-31.933-19.039l-.72-1.494L415.026,280.9l.553,1.439c7.915,19.426,29.609,32.044,55.289,32.044,23.632,0,44.608-11.4,52.3-28.447l.166-25.9-.166-.664c-4.87-11.014-15.219-19.647-28.944-24.241-7.693-2.712-14.335-3.6-20.7-4.427a83.777,83.777,0,0,1-14.832-2.878c-6.31-1.937-10.4-5.092-12.619-9.63v-8.412C449.45,202.427,458.969,197.667,470.315,197.667ZM287.568,311.344h26.067v-68.4H287.568Zm352.266-53.3c-2.933-6.254-8.3-12.01-15.441-16.714A37.99,37.99,0,0,0,637.4,226l.166-25.347-.166-.664C630.038,184,610.667,173.26,589.25,173.26S548.461,184,541.1,199.992l-.166,25.347.166.664a39.643,39.643,0,0,0,13.006,15.331c-7.2,4.7-12.508,10.46-15.441,16.714l-.166,28.889.166.72c7.582,15.994,27.893,26.731,50.585,26.731s43.057-10.737,50.584-26.731l.166-28.89Zm-73.22-50.806c3.6-6.31,12.563-10.516,22.58-10.516s19.038,4.206,22.636,10.516v13.725c-3.542,6.2-12.563,10.349-22.636,10.349s-19.094-4.15-22.58-10.349Zm47.319,72.169c-3.764,6.641-13.338,10.9-24.683,10.9-11.125,0-20.976-4.372-24.684-10.9V263.25c3.708-6.309,13.5-10.515,24.684-10.515,11.345,0,20.919,4.15,24.683,10.515ZM376.4,265.962l-59.827-89.713h-29v40.623h26.51v.387l62.539,94.085H402.3V176.249H376.4Z\"]\n};\nvar faPinterestP = {\n prefix: 'fab',\n iconName: 'pinterest-p',\n icon: [384, 512, [], \"f231\", \"M204 6.5C101.4 6.5 0 74.9 0 185.6 0 256 39.6 296 63.6 296c9.9 0 15.6-27.6 15.6-35.4 0-9.3-23.7-29.1-23.7-67.8 0-80.4 61.2-137.4 140.4-137.4 68.1 0 118.5 38.7 118.5 109.8 0 53.1-21.3 152.7-90.3 152.7-24.9 0-46.2-18-46.2-43.8 0-37.8 26.4-74.4 26.4-113.4 0-66.2-93.9-54.2-93.9 25.8 0 16.8 2.1 35.4 9.6 50.7-13.8 59.4-42 147.9-42 209.1 0 18.9 2.7 37.5 4.5 56.4 3.4 3.8 1.7 3.4 6.9 1.5 50.4-69 48.6-82.5 71.4-172.8 12.3 23.4 44.1 36 69.3 36 106.2 0 153.9-103.5 153.9-196.8C384 71.3 298.2 6.5 204 6.5z\"]\n};\nvar faApper = {\n prefix: 'fab',\n iconName: 'apper',\n icon: [640, 512, [], \"f371\", \"M42.1 239.1c22.2 0 29 2.8 33.5 14.6h.8v-22.9c0-11.3-4.8-15.4-17.9-15.4-11.3 0-14.4 2.5-15.1 12.8H4.8c.3-13.9 1.5-19.1 5.8-24.4C17.9 195 29.5 192 56.7 192c33 0 47.1 5 53.9 18.9 2 4.3 4 15.6 4 23.7v76.3H76.3l1.3-19.1h-1c-5.3 15.6-13.6 20.4-35.5 20.4-30.3 0-41.1-10.1-41.1-37.3 0-25.2 12.3-35.8 42.1-35.8zm17.1 48.1c13.1 0 16.9-3 16.9-13.4 0-9.1-4.3-11.6-19.6-11.6-13.1 0-17.9 3-17.9 12.1-.1 10.4 3.7 12.9 20.6 12.9zm77.8-94.9h38.3l-1.5 20.6h.8c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.2 10.1-20.4 0-29.2-5.5-33.8-21.2h-.8v70.3H137v-169zm80.9 60.7c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm57.9-60.7h38.3l-1.5 20.6h.8c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.3 10.1-20.4 0-29.2-5.5-33.8-21.2h-.8v70.3h-39.5v-169zm80.9 60.7c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm53.8-3.8c0-25.4 3.3-37.8 12.3-45.8 8.8-8.1 22.2-11.3 45.1-11.3 42.8 0 55.7 12.8 55.7 55.7v11.1h-75.3c-.3 2-.3 4-.3 4.8 0 16.9 4.5 21.9 20.1 21.9 13.9 0 17.9-3 17.9-13.9h37.5v2.3c0 9.8-2.5 18.9-6.8 24.7-7.3 9.8-19.6 13.6-44.3 13.6-27.5 0-41.6-3.3-50.6-12.3-8.5-8.5-11.3-21.3-11.3-50.8zm76.4-11.6c-.3-1.8-.3-3.3-.3-3.8 0-12.3-3.3-14.6-19.6-14.6-14.4 0-17.1 3-18.1 15.1l-.3 3.3h38.3zm55.6-45.3h38.3l-1.8 19.9h.7c6.8-14.9 14.4-20.2 29.7-20.2 10.8 0 19.1 3.3 23.4 9.3 5.3 7.3 6.8 14.4 6.8 34 0 1.5 0 5 .2 9.3h-35c.3-1.8.3-3.3.3-4 0-15.4-2-19.4-10.3-19.4-6.3 0-10.8 3.3-13.1 9.3-1 3-1 4.3-1 12.3v68h-38.3V192.3z\"]\n};\nvar faFortAwesome = {\n prefix: 'fab',\n iconName: 'fort-awesome',\n icon: [512, 512, [], \"f286\", \"M489.2 287.9h-27.4c-2.6 0-4.6 2-4.6 4.6v32h-36.6V146.2c0-2.6-2-4.6-4.6-4.6h-27.4c-2.6 0-4.6 2-4.6 4.6v32h-36.6v-32c0-2.6-2-4.6-4.6-4.6h-27.4c-2.6 0-4.6 2-4.6 4.6v32h-36.6v-32c0-6-8-4.6-11.7-4.6v-38c8.3-2 17.1-3.4 25.7-3.4 10.9 0 20.9 4.3 31.4 4.3 4.6 0 27.7-1.1 27.7-8v-60c0-2.6-2-4.6-4.6-4.6-5.1 0-15.1 4.3-24 4.3-9.7 0-20.9-4.3-32.6-4.3-8 0-16 1.1-23.7 2.9v-4.9c5.4-2.6 9.1-8.3 9.1-14.3 0-20.7-31.4-20.8-31.4 0 0 6 3.7 11.7 9.1 14.3v111.7c-3.7 0-11.7-1.4-11.7 4.6v32h-36.6v-32c0-2.6-2-4.6-4.6-4.6h-27.4c-2.6 0-4.6 2-4.6 4.6v32H128v-32c0-2.6-2-4.6-4.6-4.6H96c-2.6 0-4.6 2-4.6 4.6v178.3H54.8v-32c0-2.6-2-4.6-4.6-4.6H22.8c-2.6 0-4.6 2-4.6 4.6V512h182.9v-96c0-72.6 109.7-72.6 109.7 0v96h182.9V292.5c.1-2.6-1.9-4.6-4.5-4.6zm-288.1-4.5c0 2.6-2 4.6-4.6 4.6h-27.4c-2.6 0-4.6-2-4.6-4.6v-64c0-2.6 2-4.6 4.6-4.6h27.4c2.6 0 4.6 2 4.6 4.6v64zm146.4 0c0 2.6-2 4.6-4.6 4.6h-27.4c-2.6 0-4.6-2-4.6-4.6v-64c0-2.6 2-4.6 4.6-4.6h27.4c2.6 0 4.6 2 4.6 4.6v64z\"]\n};\nvar faWaze = {\n prefix: 'fab',\n iconName: 'waze',\n icon: [512, 512, [], \"f83f\", \"M502.17 201.67C516.69 287.53 471.23 369.59 389 409.8c13 34.1-12.4 70.2-48.32 70.2a51.68 51.68 0 0 1-51.57-49c-6.44.19-64.2 0-76.33-.64A51.69 51.69 0 0 1 159 479.92c-33.86-1.36-57.95-34.84-47-67.92-37.21-13.11-72.54-34.87-99.62-70.8-13-17.28-.48-41.8 20.84-41.8 46.31 0 32.22-54.17 43.15-110.26C94.8 95.2 193.12 32 288.09 32c102.48 0 197.15 70.67 214.08 169.67zM373.51 388.28c42-19.18 81.33-56.71 96.29-102.14 40.48-123.09-64.15-228-181.71-228-83.45 0-170.32 55.42-186.07 136-9.53 48.91 5 131.35-68.75 131.35C58.21 358.6 91.6 378.11 127 389.54c24.66-21.8 63.87-15.47 79.83 14.34 14.22 1 79.19 1.18 87.9.82a51.69 51.69 0 0 1 78.78-16.42zM205.12 187.13c0-34.74 50.84-34.75 50.84 0s-50.84 34.74-50.84 0zm116.57 0c0-34.74 50.86-34.75 50.86 0s-50.86 34.75-50.86 0zm-122.61 70.69c-3.44-16.94 22.18-22.18 25.62-5.21l.06.28c4.14 21.42 29.85 44 64.12 43.07 35.68-.94 59.25-22.21 64.11-42.77 4.46-16.05 28.6-10.36 25.47 6-5.23 22.18-31.21 62-91.46 62.9-42.55 0-80.88-27.84-87.9-64.25z\"]\n};\nvar faCcJcb = {\n prefix: 'fab',\n iconName: 'cc-jcb',\n icon: [576, 512, [], \"f24b\", \"M431.5 244.3V212c41.2 0 38.5.2 38.5.2 7.3 1.3 13.3 7.3 13.3 16 0 8.8-6 14.5-13.3 15.8-1.2.4-3.3.3-38.5.3zm42.8 20.2c-2.8-.7-3.3-.5-42.8-.5v35c39.6 0 40 .2 42.8-.5 7.5-1.5 13.5-8 13.5-17 0-8.7-6-15.5-13.5-17zM576 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h480c26.5 0 48 21.5 48 48zM182 192.3h-57c0 67.1 10.7 109.7-35.8 109.7-19.5 0-38.8-5.7-57.2-14.8v28c30 8.3 68 8.3 68 8.3 97.9 0 82-47.7 82-131.2zm178.5 4.5c-63.4-16-165-14.9-165 59.3 0 77.1 108.2 73.6 165 59.2V287C312.9 311.7 253 309 253 256s59.8-55.6 107.5-31.2v-28zM544 286.5c0-18.5-16.5-30.5-38-32v-.8c19.5-2.7 30.3-15.5 30.3-30.2 0-19-15.7-30-37-31 0 0 6.3-.3-120.3-.3v127.5h122.7c24.3.1 42.3-12.9 42.3-33.2z\"]\n};\nvar faSnapchat = {\n prefix: 'fab',\n iconName: 'snapchat',\n icon: [512, 512, [62124, \"snapchat-ghost\"], \"f2ab\", \"M496.926,366.6c-3.373-9.176-9.8-14.086-17.112-18.153-1.376-.806-2.641-1.451-3.72-1.947-2.182-1.128-4.414-2.22-6.634-3.373-22.8-12.09-40.609-27.341-52.959-45.42a102.889,102.889,0,0,1-9.089-16.12c-1.054-3.013-1-4.724-.248-6.287a10.221,10.221,0,0,1,2.914-3.038c3.918-2.591,7.96-5.22,10.7-6.993,4.885-3.162,8.754-5.667,11.246-7.44,9.362-6.547,15.909-13.5,20-21.278a42.371,42.371,0,0,0,2.1-35.191c-6.2-16.318-21.613-26.449-40.287-26.449a55.543,55.543,0,0,0-11.718,1.24c-1.029.224-2.059.459-3.063.72.174-11.16-.074-22.94-1.066-34.534-3.522-40.758-17.794-62.123-32.674-79.16A130.167,130.167,0,0,0,332.1,36.443C309.515,23.547,283.91,17,256,17S202.6,23.547,180,36.443a129.735,129.735,0,0,0-33.281,26.783c-14.88,17.038-29.152,38.44-32.673,79.161-.992,11.594-1.24,23.435-1.079,34.533-1-.26-2.021-.5-3.051-.719a55.461,55.461,0,0,0-11.717-1.24c-18.687,0-34.125,10.131-40.3,26.449a42.423,42.423,0,0,0,2.046,35.228c4.105,7.774,10.652,14.731,20.014,21.278,2.48,1.736,6.361,4.24,11.246,7.44,2.641,1.711,6.5,4.216,10.28,6.72a11.054,11.054,0,0,1,3.3,3.311c.794,1.624.818,3.373-.36,6.6a102.02,102.02,0,0,1-8.94,15.785c-12.077,17.669-29.363,32.648-51.434,44.639C32.355,348.608,20.2,352.75,15.069,366.7c-3.868,10.528-1.339,22.506,8.494,32.6a49.137,49.137,0,0,0,12.4,9.387,134.337,134.337,0,0,0,30.342,12.139,20.024,20.024,0,0,1,6.126,2.741c3.583,3.137,3.075,7.861,7.849,14.78a34.468,34.468,0,0,0,8.977,9.127c10.019,6.919,21.278,7.353,33.207,7.811,10.776.41,22.989.881,36.939,5.481,5.778,1.91,11.78,5.605,18.736,9.92C194.842,480.951,217.707,495,255.973,495s61.292-14.123,78.118-24.428c6.907-4.24,12.872-7.9,18.489-9.758,13.949-4.613,26.163-5.072,36.939-5.481,11.928-.459,23.187-.893,33.206-7.812a34.584,34.584,0,0,0,10.218-11.16c3.434-5.84,3.348-9.919,6.572-12.771a18.971,18.971,0,0,1,5.753-2.629A134.893,134.893,0,0,0,476.02,408.71a48.344,48.344,0,0,0,13.019-10.193l.124-.149C498.389,388.5,500.708,376.867,496.926,366.6Zm-34.013,18.277c-20.745,11.458-34.533,10.23-45.259,17.137-9.114,5.865-3.72,18.513-10.342,23.076-8.134,5.617-32.177-.4-63.239,9.858-25.618,8.469-41.961,32.822-88.038,32.822s-62.036-24.3-88.076-32.884c-31-10.255-55.092-4.241-63.239-9.858-6.609-4.563-1.24-17.211-10.341-23.076-10.739-6.907-24.527-5.679-45.26-17.075-13.206-7.291-5.716-11.8-1.314-13.937,75.143-36.381,87.133-92.552,87.666-96.719.645-5.046,1.364-9.014-4.191-14.148-5.369-4.96-29.189-19.7-35.8-24.316-10.937-7.638-15.748-15.264-12.2-24.638,2.48-6.485,8.531-8.928,14.879-8.928a27.643,27.643,0,0,1,5.965.67c12,2.6,23.659,8.617,30.392,10.242a10.749,10.749,0,0,0,2.48.335c3.6,0,4.86-1.811,4.612-5.927-.768-13.132-2.628-38.725-.558-62.644,2.84-32.909,13.442-49.215,26.04-63.636,6.051-6.932,34.484-36.976,88.857-36.976s82.88,29.92,88.931,36.827c12.611,14.421,23.225,30.727,26.04,63.636,2.071,23.919.285,49.525-.558,62.644-.285,4.327,1.017,5.927,4.613,5.927a10.648,10.648,0,0,0,2.48-.335c6.745-1.624,18.4-7.638,30.4-10.242a27.641,27.641,0,0,1,5.964-.67c6.386,0,12.4,2.48,14.88,8.928,3.546,9.374-1.24,17-12.189,24.639-6.609,4.612-30.429,19.343-35.8,24.315-5.568,5.134-4.836,9.1-4.191,14.149.533,4.228,12.511,60.4,87.666,96.718C468.629,373.011,476.119,377.524,462.913,384.877Z\"]\n};\nvar faSnapchatGhost = faSnapchat;\nvar faFantasyFlightGames = {\n prefix: 'fab',\n iconName: 'fantasy-flight-games',\n icon: [512, 512, [], \"f6dc\", \"M256 32.86L32.86 256 256 479.14 479.14 256 256 32.86zM88.34 255.83c1.96-2 11.92-12.3 96.49-97.48 41.45-41.75 86.19-43.77 119.77-18.69 24.63 18.4 62.06 58.9 62.15 59 .68.74 1.07 2.86.58 3.38-11.27 11.84-22.68 23.54-33.5 34.69-34.21-32.31-40.52-38.24-48.51-43.95-17.77-12.69-41.4-10.13-56.98 5.1-2.17 2.13-1.79 3.43.12 5.35 2.94 2.95 28.1 28.33 35.09 35.78-11.95 11.6-23.66 22.97-35.69 34.66-12.02-12.54-24.48-25.53-36.54-38.11-21.39 21.09-41.69 41.11-61.85 60.99zm234.82 101.6c-35.49 35.43-78.09 38.14-106.99 20.47-22.08-13.5-39.38-32.08-72.93-66.84 12.05-12.37 23.79-24.42 35.37-36.31 33.02 31.91 37.06 36.01 44.68 42.09 18.48 14.74 42.52 13.67 59.32-1.8 3.68-3.39 3.69-3.64.14-7.24-10.59-10.73-21.19-21.44-31.77-32.18-1.32-1.34-3.03-2.48-.8-4.69 10.79-10.71 21.48-21.52 32.21-32.29.26-.26.65-.38 1.91-1.07 12.37 12.87 24.92 25.92 37.25 38.75 21.01-20.73 41.24-40.68 61.25-60.42 13.68 13.4 27.13 26.58 40.86 40.03-20.17 20.86-81.68 82.71-100.5 101.5zM256 0L0 256l256 256 256-256L256 0zM16 256L256 16l240 240-240 240L16 256z\"]\n};\nvar faRust = {\n prefix: 'fab',\n iconName: 'rust',\n icon: [512, 512, [], \"e07a\", \"M508.52,249.75,486.7,236.24c-.17-2-.34-3.93-.55-5.88l18.72-17.5a7.35,7.35,0,0,0-2.44-12.25l-24-9c-.54-1.88-1.08-3.78-1.67-5.64l15-20.83a7.35,7.35,0,0,0-4.79-11.54l-25.42-4.15c-.9-1.73-1.79-3.45-2.73-5.15l10.68-23.42a7.35,7.35,0,0,0-6.95-10.39l-25.82.91q-1.79-2.22-3.61-4.4L439,81.84A7.36,7.36,0,0,0,430.16,73L405,78.93q-2.17-1.83-4.4-3.61l.91-25.82a7.35,7.35,0,0,0-10.39-7L367.7,53.23c-1.7-.94-3.43-1.84-5.15-2.73L358.4,25.08a7.35,7.35,0,0,0-11.54-4.79L326,35.26c-1.86-.59-3.75-1.13-5.64-1.67l-9-24a7.35,7.35,0,0,0-12.25-2.44l-17.5,18.72c-1.95-.21-3.91-.38-5.88-.55L262.25,3.48a7.35,7.35,0,0,0-12.5,0L236.24,25.3c-2,.17-3.93.34-5.88.55L212.86,7.13a7.35,7.35,0,0,0-12.25,2.44l-9,24c-1.89.55-3.79,1.08-5.66,1.68l-20.82-15a7.35,7.35,0,0,0-11.54,4.79l-4.15,25.41c-1.73.9-3.45,1.79-5.16,2.73L120.88,42.55a7.35,7.35,0,0,0-10.39,7l.92,25.81c-1.49,1.19-3,2.39-4.42,3.61L81.84,73A7.36,7.36,0,0,0,73,81.84L78.93,107c-1.23,1.45-2.43,2.93-3.62,4.41l-25.81-.91a7.42,7.42,0,0,0-6.37,3.26,7.35,7.35,0,0,0-.57,7.13l10.66,23.41c-.94,1.7-1.83,3.43-2.73,5.16L25.08,153.6a7.35,7.35,0,0,0-4.79,11.54l15,20.82c-.59,1.87-1.13,3.77-1.68,5.66l-24,9a7.35,7.35,0,0,0-2.44,12.25l18.72,17.5c-.21,1.95-.38,3.91-.55,5.88L3.48,249.75a7.35,7.35,0,0,0,0,12.5L25.3,275.76c.17,2,.34,3.92.55,5.87L7.13,299.13a7.35,7.35,0,0,0,2.44,12.25l24,9c.55,1.89,1.08,3.78,1.68,5.65l-15,20.83a7.35,7.35,0,0,0,4.79,11.54l25.42,4.15c.9,1.72,1.79,3.45,2.73,5.14L42.56,391.12a7.35,7.35,0,0,0,.57,7.13,7.13,7.13,0,0,0,6.37,3.26l25.83-.91q1.77,2.22,3.6,4.4L73,430.16A7.36,7.36,0,0,0,81.84,439L107,433.07q2.18,1.83,4.41,3.61l-.92,25.82a7.35,7.35,0,0,0,10.39,6.95l23.43-10.68c1.69.94,3.42,1.83,5.14,2.73l4.15,25.42a7.34,7.34,0,0,0,11.54,4.78l20.83-15c1.86.6,3.76,1.13,5.65,1.68l9,24a7.36,7.36,0,0,0,12.25,2.44l17.5-18.72c1.95.21,3.92.38,5.88.55l13.51,21.82a7.35,7.35,0,0,0,12.5,0l13.51-21.82c2-.17,3.93-.34,5.88-.56l17.5,18.73a7.36,7.36,0,0,0,12.25-2.44l9-24c1.89-.55,3.78-1.08,5.65-1.68l20.82,15a7.34,7.34,0,0,0,11.54-4.78l4.15-25.42c1.72-.9,3.45-1.79,5.15-2.73l23.42,10.68a7.35,7.35,0,0,0,10.39-6.95l-.91-25.82q2.22-1.79,4.4-3.61L430.16,439a7.36,7.36,0,0,0,8.84-8.84L433.07,405q1.83-2.17,3.61-4.4l25.82.91a7.23,7.23,0,0,0,6.37-3.26,7.35,7.35,0,0,0,.58-7.13L458.77,367.7c.94-1.7,1.83-3.43,2.73-5.15l25.42-4.15a7.35,7.35,0,0,0,4.79-11.54l-15-20.83c.59-1.87,1.13-3.76,1.67-5.65l24-9a7.35,7.35,0,0,0,2.44-12.25l-18.72-17.5c.21-1.95.38-3.91.55-5.87l21.82-13.51a7.35,7.35,0,0,0,0-12.5Zm-151,129.08A13.91,13.91,0,0,0,341,389.51l-7.64,35.67A187.51,187.51,0,0,1,177,424.44l-7.64-35.66a13.87,13.87,0,0,0-16.46-10.68l-31.51,6.76a187.38,187.38,0,0,1-16.26-19.21H258.3c1.72,0,2.89-.29,2.89-1.91V309.55c0-1.57-1.17-1.91-2.89-1.91H213.47l.05-34.35H262c4.41,0,23.66,1.28,29.79,25.87,1.91,7.55,6.17,32.14,9.06,40,2.89,8.82,14.6,26.46,27.1,26.46H407a187.3,187.3,0,0,1-17.34,20.09Zm25.77,34.49A15.24,15.24,0,1,1,368,398.08h.44A15.23,15.23,0,0,1,383.24,413.32Zm-225.62-.68a15.24,15.24,0,1,1-15.25-15.25h.45A15.25,15.25,0,0,1,157.62,412.64ZM69.57,234.15l32.83-14.6a13.88,13.88,0,0,0,7.06-18.33L102.69,186h26.56V305.73H75.65A187.65,187.65,0,0,1,69.57,234.15ZM58.31,198.09a15.24,15.24,0,0,1,15.23-15.25H74a15.24,15.24,0,1,1-15.67,15.24Zm155.16,24.49.05-35.32h63.26c3.28,0,23.07,3.77,23.07,18.62,0,12.29-15.19,16.7-27.68,16.7ZM399,306.71c-9.8,1.13-20.63-4.12-22-10.09-5.78-32.49-15.39-39.4-30.57-51.4,18.86-11.95,38.46-29.64,38.46-53.26,0-25.52-17.49-41.59-29.4-49.48-16.76-11-35.28-13.23-40.27-13.23H116.32A187.49,187.49,0,0,1,221.21,70.06l23.47,24.6a13.82,13.82,0,0,0,19.6.44l26.26-25a187.51,187.51,0,0,1,128.37,91.43l-18,40.57A14,14,0,0,0,408,220.43l34.59,15.33a187.12,187.12,0,0,1,.4,32.54H423.71c-1.91,0-2.69,1.27-2.69,3.13v8.82C421,301,409.31,305.58,399,306.71ZM240,60.21A15.24,15.24,0,0,1,255.21,45h.45A15.24,15.24,0,1,1,240,60.21ZM436.84,214a15.24,15.24,0,1,1,0-30.48h.44a15.24,15.24,0,0,1-.44,30.48Z\"]\n};\nvar faWix = {\n prefix: 'fab',\n iconName: 'wix',\n icon: [640, 512, [], \"f5cf\", \"M393.38 131.69c0 13.03 2.08 32.69-28.68 43.83-9.52 3.45-15.95 9.66-15.95 9.66 0-31 4.72-42.22 17.4-48.86 9.75-5.11 27.23-4.63 27.23-4.63zm-115.8 35.54l-34.24 132.66-28.48-108.57c-7.69-31.99-20.81-48.53-48.43-48.53-27.37 0-40.66 16.18-48.43 48.53L89.52 299.89 55.28 167.23C49.73 140.51 23.86 128.96 0 131.96l65.57 247.93s21.63 1.56 32.46-3.96c14.22-7.25 20.98-12.84 29.59-46.57 7.67-30.07 29.11-118.41 31.12-124.7 4.76-14.94 11.09-13.81 15.4 0 1.97 6.3 23.45 94.63 31.12 124.7 8.6 33.73 15.37 39.32 29.59 46.57 10.82 5.52 32.46 3.96 32.46 3.96l65.57-247.93c-24.42-3.07-49.82 8.93-55.3 35.27zm115.78 5.21s-4.1 6.34-13.46 11.57c-6.01 3.36-11.78 5.64-17.97 8.61-15.14 7.26-13.18 13.95-13.18 35.2v152.07s16.55 2.09 27.37-3.43c13.93-7.1 17.13-13.95 17.26-44.78V181.41l-.02.01v-8.98zm163.44 84.08L640 132.78s-35.11-5.98-52.5 9.85c-13.3 12.1-24.41 29.55-54.18 72.47-.47.73-6.25 10.54-13.07 0-29.29-42.23-40.8-60.29-54.18-72.47-17.39-15.83-52.5-9.85-52.5-9.85l83.2 123.74-82.97 123.36s36.57 4.62 53.95-11.21c11.49-10.46 17.58-20.37 52.51-70.72 6.81-10.52 12.57-.77 13.07 0 29.4 42.38 39.23 58.06 53.14 70.72 17.39 15.83 53.32 11.21 53.32 11.21L556.8 256.52z\"]\n};\nvar faSquareBehance = {\n prefix: 'fab',\n iconName: 'square-behance',\n icon: [448, 512, [\"behance-square\"], \"f1b5\", \"M186.5 293c0 19.3-14 25.4-31.2 25.4h-45.1v-52.9h46c18.6.1 30.3 7.8 30.3 27.5zm-7.7-82.3c0-17.7-13.7-21.9-28.9-21.9h-39.6v44.8H153c15.1 0 25.8-6.6 25.8-22.9zm132.3 23.2c-18.3 0-30.5 11.4-31.7 29.7h62.2c-1.7-18.5-11.3-29.7-30.5-29.7zM448 80v352c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V80c0-26.5 21.5-48 48-48h352c26.5 0 48 21.5 48 48zM271.7 185h77.8v-18.9h-77.8V185zm-43 110.3c0-24.1-11.4-44.9-35-51.6 17.2-8.2 26.2-17.7 26.2-37 0-38.2-28.5-47.5-61.4-47.5H68v192h93.1c34.9-.2 67.6-16.9 67.6-55.9zM380 280.5c0-41.1-24.1-75.4-67.6-75.4-42.4 0-71.1 31.8-71.1 73.6 0 43.3 27.3 73 71.1 73 33.2 0 54.7-14.9 65.1-46.8h-33.7c-3.7 11.9-18.6 18.1-30.2 18.1-22.4 0-34.1-13.1-34.1-35.3h100.2c.1-2.3.3-4.8.3-7.2z\"]\n};\nvar faBehanceSquare = faSquareBehance;\nvar faSupple = {\n prefix: 'fab',\n iconName: 'supple',\n icon: [640, 512, [], \"f3f9\", \"M640 262.5c0 64.1-109 116.1-243.5 116.1-24.8 0-48.6-1.8-71.1-5 7.7.4 15.5.6 23.4.6 134.5 0 243.5-56.9 243.5-127.1 0-29.4-19.1-56.4-51.2-78 60 21.1 98.9 55.1 98.9 93.4zM47.7 227.9c-.1-70.2 108.8-127.3 243.3-127.6 7.9 0 15.6.2 23.3.5-22.5-3.2-46.3-4.9-71-4.9C108.8 96.3-.1 148.5 0 212.6c.1 38.3 39.1 72.3 99.3 93.3-32.3-21.5-51.5-48.6-51.6-78zm60.2 39.9s10.5 13.2 29.3 13.2c17.9 0 28.4-11.5 28.4-25.1 0-28-40.2-25.1-40.2-39.7 0-5.4 5.3-9.1 12.5-9.1 5.7 0 11.3 2.6 11.3 6.6v3.9h14.2v-7.9c0-12.1-15.4-16.8-25.4-16.8-16.5 0-28.5 10.2-28.5 24.1 0 26.6 40.2 25.4 40.2 39.9 0 6.6-5.8 10.1-12.3 10.1-11.9 0-20.7-10.1-20.7-10.1l-8.8 10.9zm120.8-73.6v54.4c0 11.3-7.1 17.8-17.8 17.8-10.7 0-17.8-6.5-17.8-17.7v-54.5h-15.8v55c0 18.9 13.4 31.9 33.7 31.9 20.1 0 33.4-13 33.4-31.9v-55h-15.7zm34.4 85.4h15.8v-29.5h15.5c16 0 27.2-11.5 27.2-28.1s-11.2-27.8-27.2-27.8h-39.1v13.4h7.8v72zm15.8-43v-29.1h12.9c8.7 0 13.7 5.7 13.7 14.4 0 8.9-5.1 14.7-14 14.7h-12.6zm57 43h15.8v-29.5h15.5c16 0 27.2-11.5 27.2-28.1s-11.2-27.8-27.2-27.8h-39.1v13.4h7.8v72zm15.7-43v-29.1h12.9c8.7 0 13.7 5.7 13.7 14.4 0 8.9-5 14.7-14 14.7h-12.6zm57.1 34.8c0 5.8 2.4 8.2 8.2 8.2h37.6c5.8 0 8.2-2.4 8.2-8.2v-13h-14.3v5.2c0 1.7-1 2.6-2.6 2.6h-18.6c-1.7 0-2.6-1-2.6-2.6v-61.2c0-5.7-2.4-8.2-8.2-8.2H401v13.4h5.2c1.7 0 2.6 1 2.6 2.6v61.2zm63.4 0c0 5.8 2.4 8.2 8.2 8.2H519c5.7 0 8.2-2.4 8.2-8.2v-13h-14.3v5.2c0 1.7-1 2.6-2.6 2.6h-19.7c-1.7 0-2.6-1-2.6-2.6v-20.3h27.7v-13.4H488v-22.4h19.2c1.7 0 2.6 1 2.6 2.6v5.2H524v-13c0-5.7-2.5-8.2-8.2-8.2h-51.6v13.4h7.8v63.9zm58.9-76v5.9h1.6v-5.9h2.7v-1.2h-7v1.2h2.7zm5.7-1.2v7.1h1.5v-5.7l2.3 5.7h1.3l2.3-5.7v5.7h1.5v-7.1h-2.3l-2.1 5.1-2.1-5.1h-2.4z\"]\n};\nvar faRebel = {\n prefix: 'fab',\n iconName: 'rebel',\n icon: [512, 512, [], \"f1d0\", \"M256.5 504C117.2 504 9 387.8 13.2 249.9 16 170.7 56.4 97.7 129.7 49.5c.3 0 1.9-.6 1.1.8-5.8 5.5-111.3 129.8-14.1 226.4 49.8 49.5 90 2.5 90 2.5 38.5-50.1-.6-125.9-.6-125.9-10-24.9-45.7-40.1-45.7-40.1l28.8-31.8c24.4 10.5 43.2 38.7 43.2 38.7.8-29.6-21.9-61.4-21.9-61.4L255.1 8l44.3 50.1c-20.5 28.8-21.9 62.6-21.9 62.6 13.8-23 43.5-39.3 43.5-39.3l28.5 31.8c-27.4 8.9-45.4 39.9-45.4 39.9-15.8 28.5-27.1 89.4.6 127.3 32.4 44.6 87.7-2.8 87.7-2.8 102.7-91.9-10.5-225-10.5-225-6.1-5.5.8-2.8.8-2.8 50.1 36.5 114.6 84.4 116.2 204.8C500.9 400.2 399 504 256.5 504z\"]\n};\nvar faCss3 = {\n prefix: 'fab',\n iconName: 'css3',\n icon: [512, 512, [], \"f13c\", \"M480 32l-64 368-223.3 80L0 400l19.6-94.8h82l-8 40.6L210 390.2l134.1-44.4 18.8-97.1H29.5l16-82h333.7l10.5-52.7H56.3l16.3-82H480z\"]\n};\nvar faStaylinked = {\n prefix: 'fab',\n iconName: 'staylinked',\n icon: [440, 512, [], \"f3f5\", \"M382.7 292.5l2.7 2.7-170-167.3c-3.5-3.5-9.7-3.7-13.8-.5L144.3 171c-4.2 3.2-4.6 8.7-1.1 12.2l68.1 64.3c3.6 3.5 9.9 3.7 14 .5l.1-.1c4.1-3.2 10.4-3 14 .5l84 81.3c3.6 3.5 3.2 9-.9 12.2l-93.2 74c-4.2 3.3-10.5 3.1-14.2-.4L63.2 268c-3.5-3.5-9.7-3.7-13.9-.5L3.5 302.4c-4.2 3.2-4.7 8.7-1.2 12.2L211 510.7s7.4 6.8 17.3-.8l198-163.9c4-3.2 4.4-8.7.7-12.2zm54.5-83.4L226.7 2.5c-1.5-1.2-8-5.5-16.3 1.1L3.6 165.7c-4.2 3.2-4.8 8.7-1.2 12.2l42.3 41.7 171.7 165.1c3.7 3.5 10.1 3.7 14.3.4l50.2-38.8-.3-.3 7.7-6c4.2-3.2 4.6-8.7.9-12.2l-57.1-54.4c-3.6-3.5-10-3.7-14.2-.5l-.1.1c-4.2 3.2-10.5 3.1-14.2-.4L109 180.8c-3.6-3.5-3.1-8.9 1.1-12.2l92.2-71.5c4.1-3.2 10.3-3 13.9.5l160.4 159c3.7 3.5 10 3.7 14.1.5l45.8-35.8c4.1-3.2 4.4-8.7.7-12.2z\"]\n};\nvar faKaggle = {\n prefix: 'fab',\n iconName: 'kaggle',\n icon: [320, 512, [], \"f5fa\", \"M304.2 501.5L158.4 320.3 298.2 185c2.6-2.7 1.7-10.5-5.3-10.5h-69.2c-3.5 0-7 1.8-10.5 5.3L80.9 313.5V7.5q0-7.5-7.5-7.5H21.5Q14 0 14 7.5v497q0 7.5 7.5 7.5h51.9q7.5 0 7.5-7.5v-109l30.8-29.3 110.5 140.6c3 3.5 6.5 5.3 10.5 5.3h66.9q5.25 0 6-3z\"]\n};\nvar faSpaceAwesome = {\n prefix: 'fab',\n iconName: 'space-awesome',\n icon: [512, 512, [], \"e5ac\", \"M96 256H128V512H0V352H32V320H64V288H96V256zM512 352V512H384V256H416V288H448V320H480V352H512zM320 64H352V448H320V416H192V448H160V64H192V32H224V0H288V32H320V64zM288 128H224V192H288V128z\"]\n};\nvar faDeviantart = {\n prefix: 'fab',\n iconName: 'deviantart',\n icon: [320, 512, [], \"f1bd\", \"M320 93.2l-98.2 179.1 7.4 9.5H320v127.7H159.1l-13.5 9.2-43.7 84c-.3 0-8.6 8.6-9.2 9.2H0v-93.2l93.2-179.4-7.4-9.2H0V102.5h156l13.5-9.2 43.7-84c.3 0 8.6-8.6 9.2-9.2H320v93.1z\"]\n};\nvar faCpanel = {\n prefix: 'fab',\n iconName: 'cpanel',\n icon: [640, 512, [], \"f388\", \"M210.3 220.2c-5.6-24.8-26.9-41.2-51-41.2h-37c-7.1 0-12.5 4.5-14.3 10.9L73.1 320l24.7-.1c6.8 0 12.3-4.5 14.2-10.7l25.8-95.7h19.8c8.4 0 16.2 5.6 18.3 14.8 2.5 10.9-5.9 22.6-18.3 22.6h-10.3c-7 0-12.5 4.6-14.3 10.8l-6.4 23.8h32c37.2 0 58.3-36.2 51.7-65.3zm-156.5 28h18.6c6.9 0 12.4-4.4 14.3-10.9l6.2-23.6h-40C30 213.7 9 227.8 1.7 254.8-7 288.6 18.5 320 52 320h12.4l7.1-26.1c1.2-4.4-2.2-8.3-6.4-8.3H53.8c-24.7 0-24.9-37.4 0-37.4zm247.5-34.8h-77.9l-3.5 13.4c-2.4 9.6 4.5 18.5 14.2 18.5h57.5c4 0 2.4 4.3 2.1 5.3l-8.6 31.8c-.4 1.4-.9 5.3-5.5 5.3h-34.9c-5.3 0-5.3-7.9 0-7.9h21.6c6.8 0 12.3-4.6 14.2-10.8l3.5-13.2h-48.4c-39.2 0-43.6 63.8-.7 63.8l57.5.2c11.2 0 20.6-7.2 23.4-17.8l14-51.8c4.8-19.2-9.7-36.8-28.5-36.8zM633.1 179h-18.9c-4.9 0-9.2 3.2-10.4 7.9L568.2 320c20.7 0 39.8-13.8 44.9-34.5l26.5-98.2c1.2-4.3-2-8.3-6.5-8.3zm-236.3 34.7v.1h-48.3l-26.2 98c-1.2 4.4 2.2 8.3 6.4 8.3h18.9c4.8 0 9.2-3 10.4-7.8l17.2-64H395c12.5 0 21.4 11.8 18.1 23.4l-10.6 40c-1.2 4.3 1.9 8.3 6.4 8.3H428c4.6 0 9.1-2.9 10.3-7.8l8.8-33.1c9-33.1-15.9-65.4-50.3-65.4zm98.3 74.6c-3.6 0-6-3.4-5.1-6.7l8-30c.9-3.9 3.7-6 7.8-6h32.9c2.6 0 4.6 2.4 3.9 5.1l-.7 2.6c-.6 2-1.9 3-3.9 3h-21.6c-7 0-12.6 4.6-14.2 10.8l-3.5 13h53.4c10.5 0 20.3-6.6 23.2-17.6l3.2-12c4.9-19.1-9.3-36.8-28.3-36.8h-47.3c-17.9 0-33.8 12-38.6 29.6l-10.8 40c-5 17.7 8.3 36.7 28.3 36.7h66.7c6.8 0 12.3-4.5 14.2-10.7l5.7-21z\"]\n};\nvar faGoodreadsG = {\n prefix: 'fab',\n iconName: 'goodreads-g',\n icon: [384, 512, [], \"f3a9\", \"M42.6 403.3h2.8c12.7 0 25.5 0 38.2.1 1.6 0 3.1-.4 3.6 2.1 7.1 34.9 30 54.6 62.9 63.9 26.9 7.6 54.1 7.8 81.3 1.8 33.8-7.4 56-28.3 68-60.4 8-21.5 10.7-43.8 11-66.5.1-5.8.3-47-.2-52.8l-.9-.3c-.8 1.5-1.7 2.9-2.5 4.4-22.1 43.1-61.3 67.4-105.4 69.1-103 4-169.4-57-172-176.2-.5-23.7 1.8-46.9 8.3-69.7C58.3 47.7 112.3.6 191.6 0c61.3-.4 101.5 38.7 116.2 70.3.5 1.1 1.3 2.3 2.4 1.9V10.6h44.3c0 280.3.1 332.2.1 332.2-.1 78.5-26.7 143.7-103 162.2-69.5 16.9-159 4.8-196-57.2-8-13.5-11.8-28.3-13-44.5zM188.9 36.5c-52.5-.5-108.5 40.7-115 133.8-4.1 59 14.8 122.2 71.5 148.6 27.6 12.9 74.3 15 108.3-8.7 47.6-33.2 62.7-97 54.8-154-9.7-71.1-47.8-120-119.6-119.7z\"]\n};\nvar faSquareGit = {\n prefix: 'fab',\n iconName: 'square-git',\n icon: [448, 512, [\"git-square\"], \"f1d2\", \"M100.59 334.24c48.57 3.31 58.95 2.11 58.95 11.94 0 20-65.55 20.06-65.55 1.52.01-5.09 3.29-9.4 6.6-13.46zm27.95-116.64c-32.29 0-33.75 44.47-.75 44.47 32.51 0 31.71-44.47.75-44.47zM448 80v352a48 48 0 0 1-48 48H48a48 48 0 0 1-48-48V80a48 48 0 0 1 48-48h352a48 48 0 0 1 48 48zm-227 69.31c0 14.49 8.38 22.88 22.86 22.88 14.74 0 23.13-8.39 23.13-22.88S258.62 127 243.88 127c-14.48 0-22.88 7.84-22.88 22.31zM199.18 195h-49.55c-25-6.55-81.56-4.85-81.56 46.75 0 18.8 9.4 32 21.85 38.11C74.23 294.23 66.8 301 66.8 310.6c0 6.87 2.79 13.22 11.18 16.76-8.9 8.4-14 14.48-14 25.92C64 373.35 81.53 385 127.52 385c44.22 0 69.87-16.51 69.87-45.73 0-36.67-28.23-35.32-94.77-39.38l8.38-13.43c17 4.74 74.19 6.23 74.19-42.43 0-11.69-4.83-19.82-9.4-25.67l23.38-1.78zm84.34 109.84l-13-1.78c-3.82-.51-4.07-1-4.07-5.09V192.52h-52.6l-2.79 20.57c15.75 5.55 17 4.86 17 10.17V298c0 5.62-.31 4.58-17 6.87v20.06h72.42zM384 315l-6.87-22.37c-40.93 15.37-37.85-12.41-37.85-16.73v-60.72h37.85v-25.41h-35.82c-2.87 0-2 2.52-2-38.63h-24.18c-2.79 27.7-11.68 38.88-34 41.42v22.62c20.47 0 19.82-.85 19.82 2.54v66.57c0 28.72 11.43 40.91 41.67 40.91 14.45 0 30.45-4.83 41.38-10.2z\"]\n};\nvar faGitSquare = faSquareGit;\nvar faSquareTumblr = {\n prefix: 'fab',\n iconName: 'square-tumblr',\n icon: [448, 512, [\"tumblr-square\"], \"f174\", \"M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-82.3 364.2c-8.5 9.1-31.2 19.8-60.9 19.8-75.5 0-91.9-55.5-91.9-87.9v-90h-29.7c-3.4 0-6.2-2.8-6.2-6.2v-42.5c0-4.5 2.8-8.5 7.1-10 38.8-13.7 50.9-47.5 52.7-73.2.5-6.9 4.1-10.2 10-10.2h44.3c3.4 0 6.2 2.8 6.2 6.2v72h51.9c3.4 0 6.2 2.8 6.2 6.2v51.1c0 3.4-2.8 6.2-6.2 6.2h-52.1V321c0 21.4 14.8 33.5 42.5 22.4 3-1.2 5.6-2 8-1.4 2.2.5 3.6 2.1 4.6 4.9l13.8 40.2c1 3.2 2 6.7-.3 9.1z\"]\n};\nvar faTumblrSquare = faSquareTumblr;\nvar faTrello = {\n prefix: 'fab',\n iconName: 'trello',\n icon: [448, 512, [], \"f181\", \"M392.3 32H56.1C25.1 32 0 57.1 0 88c-.1 0 0-4 0 336 0 30.9 25.1 56 56 56h336.2c30.8-.2 55.7-25.2 55.7-56V88c.1-30.8-24.8-55.8-55.6-56zM197 371.3c-.2 14.7-12.1 26.6-26.9 26.6H87.4c-14.8.1-26.9-11.8-27-26.6V117.1c0-14.8 12-26.9 26.9-26.9h82.9c14.8 0 26.9 12 26.9 26.9v254.2zm193.1-112c0 14.8-12 26.9-26.9 26.9h-81c-14.8 0-26.9-12-26.9-26.9V117.2c0-14.8 12-26.9 26.8-26.9h81.1c14.8 0 26.9 12 26.9 26.9v142.1z\"]\n};\nvar faCreativeCommonsNcJp = {\n prefix: 'fab',\n iconName: 'creative-commons-nc-jp',\n icon: [496, 512, [], \"f4ea\", \"M247.7 8C103.6 8 0 124.8 0 256c0 136.4 111.8 248 247.7 248C377.9 504 496 403.2 496 256 496 117.2 388.5 8 247.7 8zm.6 450.7c-112 0-203.6-92.5-203.6-202.7 0-21.1 3-41.2 9-60.3l127 56.5h-27.9v38.6h58.1l5.7 11.8v18.7h-63.8V360h63.8v56h61.7v-56h64.2v-35.7l81 36.1c-1.5 2.2-57.1 98.3-175.2 98.3zm87.6-137.3h-57.6v-18.7l2.9-5.6 54.7 24.3zm6.5-51.4v-17.8h-38.6l63-116H301l-43.4 96-23-10.2-39.6-85.7h-65.8l27.3 51-81.9-36.5c27.8-44.1 82.6-98.1 173.7-98.1 112.8 0 203 90 203 203.4 0 21-2.7 40.6-7.9 59l-101-45.1z\"]\n};\nvar faGetPocket = {\n prefix: 'fab',\n iconName: 'get-pocket',\n icon: [448, 512, [], \"f265\", \"M407.6 64h-367C18.5 64 0 82.5 0 104.6v135.2C0 364.5 99.7 464 224.2 464c124 0 223.8-99.5 223.8-224.2V104.6c0-22.4-17.7-40.6-40.4-40.6zm-162 268.5c-12.4 11.8-31.4 11.1-42.4 0C89.5 223.6 88.3 227.4 88.3 209.3c0-16.9 13.8-30.7 30.7-30.7 17 0 16.1 3.8 105.2 89.3 90.6-86.9 88.6-89.3 105.5-89.3 16.9 0 30.7 13.8 30.7 30.7 0 17.8-2.9 15.7-114.8 123.2z\"]\n};\nvar faPerbyte = {\n prefix: 'fab',\n iconName: 'perbyte',\n icon: [448, 512, [], \"e083\", \"M305.314,284.578H246.6V383.3h58.711q24.423,0,38.193-13.77t13.77-36.11q0-21.826-14.032-35.335T305.314,284.578ZM149.435,128.7H90.724v98.723h58.711q24.42,0,38.19-13.773t13.77-36.107q0-21.826-14.029-35.338T149.435,128.7ZM366.647,32H81.353A81.445,81.445,0,0,0,0,113.352V398.647A81.445,81.445,0,0,0,81.353,480H366.647A81.445,81.445,0,0,0,448,398.647V113.352A81.445,81.445,0,0,0,366.647,32Zm63.635,366.647a63.706,63.706,0,0,1-63.635,63.635H81.353a63.706,63.706,0,0,1-63.635-63.635V113.352A63.706,63.706,0,0,1,81.353,49.718H366.647a63.706,63.706,0,0,1,63.635,63.634ZM305.314,128.7H246.6v98.723h58.711q24.423,0,38.193-13.773t13.77-36.107q0-21.826-14.032-35.338T305.314,128.7Z\"]\n};\nvar faGrunt = {\n prefix: 'fab',\n iconName: 'grunt',\n icon: [384, 512, [], \"f3ad\", \"M61.3 189.3c-1.1 10 5.2 19.1 5.2 19.1.7-7.5 2.2-12.8 4-16.6.4 10.3 3.2 23.5 12.8 34.1 6.9 7.6 35.6 23.3 54.9 6.1 1 2.4 2.1 5.3 3 8.5 2.9 10.3-2.7 25.3-2.7 25.3s15.1-17.1 13.9-32.5c10.8-.5 21.4-8.4 21.1-19.5 0 0-18.9 10.4-35.5-8.8-9.7-11.2-40.9-42-83.1-31.8 4.3 1 8.9 2.4 13.5 4.1h-.1c-4.2 2-6.5 7.1-7 12zm28.3-1.8c19.5 11 37.4 25.7 44.9 37-5.7 3.3-21.7 10.4-38-1.7-10.3-7.6-9.8-26.2-6.9-35.3zm142.1 45.8c-1.2 15.5 13.9 32.5 13.9 32.5s-5.6-15-2.7-25.3c.9-3.2 2-6 3-8.5 19.3 17.3 48 1.5 54.8-6.1 9.6-10.6 12.3-23.8 12.8-34.1 1.8 3.8 3.4 9.1 4 16.6 0 0 6.4-9.1 5.2-19.1-.6-5-2.9-10-7-11.8h-.1c4.6-1.8 9.2-3.2 13.5-4.1-42.3-10.2-73.4 20.6-83.1 31.8-16.7 19.2-35.5 8.8-35.5 8.8-.2 10.9 10.4 18.9 21.2 19.3zm62.7-45.8c3 9.1 3.4 27.7-7 35.4-16.3 12.1-32.2 5-37.9 1.6 7.5-11.4 25.4-26 44.9-37zM160 418.5h-29.4c-5.5 0-8.2 1.6-9.5 2.9-1.9 2-2.2 4.7-.9 8.1 3.5 9.1 11.4 16.5 13.7 18.6 3.1 2.7 7.5 4.3 11.8 4.3 4.4 0 8.3-1.7 11-4.6 7.5-8.2 11.9-17.1 13-19.8.6-1.5 1.3-4.5-.9-6.8-1.8-1.8-4.7-2.7-8.8-2.7zm189.2-101.2c-2.4 17.9-13 33.8-24.6 43.7-3.1-22.7-3.7-55.5-3.7-62.4 0-14.7 9.5-24.5 12.2-26.1 2.5-1.5 5.4-3 8.3-4.6 18-9.6 40.4-21.6 40.4-43.7 0-16.2-9.3-23.2-15.4-27.8-.8-.6-1.5-1.1-2.2-1.7-2.1-1.7-3.7-3-4.3-4.4-4.4-9.8-3.6-34.2-1.7-37.6.6-.6 16.7-20.9 11.8-39.2-2-7.4-6.9-13.3-14.1-17-5.3-2.7-11.9-4.2-19.5-4.5-.1-2-.5-3.9-.9-5.9-.6-2.6-1.1-5.3-.9-8.1.4-4.7.8-9 2.2-11.3 8.4-13.3 28.8-17.6 29-17.6l12.3-2.4-8.1-9.5c-.1-.2-17.3-17.5-46.3-17.5-7.9 0-16 1.3-24.1 3.9-24.2 7.8-42.9 30.5-49.4 39.3-3.1-1-6.3-1.9-9.6-2.7-4.2-15.8 9-38.5 9-38.5s-13.6-3-33.7 15.2c-2.6-6.5-8.1-20.5-1.8-37.2C184.6 10.1 177.2 26 175 40.4c-7.6-5.4-6.7-23.1-7.2-27.6-7.5.9-29.2 21.9-28.2 48.3-2 .5-3.9 1.1-5.9 1.7-6.5-8.8-25.1-31.5-49.4-39.3-7.9-2.2-16-3.5-23.9-3.5-29 0-46.1 17.3-46.3 17.5L6 46.9l12.3 2.4c.2 0 20.6 4.3 29 17.6 1.4 2.2 1.8 6.6 2.2 11.3.2 2.8-.4 5.5-.9 8.1-.4 1.9-.8 3.9-.9 5.9-7.7.3-14.2 1.8-19.5 4.5-7.2 3.7-12.1 9.6-14.1 17-5 18.2 11.2 38.5 11.8 39.2 1.9 3.4 2.7 27.8-1.7 37.6-.6 1.4-2.2 2.7-4.3 4.4-.7.5-1.4 1.1-2.2 1.7-6.1 4.6-15.4 11.7-15.4 27.8 0 22.1 22.4 34.1 40.4 43.7 3 1.6 5.8 3.1 8.3 4.6 2.7 1.6 12.2 11.4 12.2 26.1 0 6.9-.6 39.7-3.7 62.4-11.6-9.9-22.2-25.9-24.6-43.8 0 0-29.2 22.6-20.6 70.8 5.2 29.5 23.2 46.1 47 54.7 8.8 19.1 29.4 45.7 67.3 49.6C143 504.3 163 512 192.2 512h.2c29.1 0 49.1-7.7 63.6-19.5 37.9-3.9 58.5-30.5 67.3-49.6 23.8-8.7 41.7-25.2 47-54.7 8.2-48.4-21.1-70.9-21.1-70.9zM305.7 37.7c5.6-1.8 11.6-2.7 17.7-2.7 11 0 19.9 3 24.7 5-3.1 1.4-6.4 3.2-9.7 5.3-2.4-.4-5.6-.8-9.2-.8-10.5 0-20.5 3.1-28.7 8.9-12.3 8.7-18 16.9-20.7 22.4-2.2-1.3-4.5-2.5-7.1-3.7-1.6-.8-3.1-1.5-4.7-2.2 6.1-9.1 19.9-26.5 37.7-32.2zm21 18.2c-.8 1-1.6 2.1-2.3 3.2-3.3 5.2-3.9 11.6-4.4 17.8-.5 6.4-1.1 12.5-4.4 17-4.2.8-8.1 1.7-11.5 2.7-2.3-3.1-5.6-7-10.5-11.2 1.4-4.8 5.5-16.1 13.5-22.5 5.6-4.3 12.2-6.7 19.6-7zM45.6 45.3c-3.3-2.2-6.6-4-9.7-5.3 4.8-2 13.7-5 24.7-5 6.1 0 12 .9 17.7 2.7 17.8 5.8 31.6 23.2 37.7 32.1-1.6.7-3.2 1.4-4.8 2.2-2.5 1.2-4.9 2.5-7.1 3.7-2.6-5.4-8.3-13.7-20.7-22.4-8.3-5.8-18.2-8.9-28.8-8.9-3.4.1-6.6.5-9 .9zm44.7 40.1c-4.9 4.2-8.3 8-10.5 11.2-3.4-.9-7.3-1.9-11.5-2.7C65 89.5 64.5 83.4 64 77c-.5-6.2-1.1-12.6-4.4-17.8-.7-1.1-1.5-2.2-2.3-3.2 7.4.3 14 2.6 19.5 7 8 6.3 12.1 17.6 13.5 22.4zM58.1 259.9c-2.7-1.6-5.6-3.1-8.4-4.6-14.9-8-30.2-16.3-30.2-30.5 0-11.1 4.3-14.6 8.9-18.2l.5-.4c.7-.6 1.4-1.2 2.2-1.8-.9 7.2-1.9 13.3-2.7 14.9 0 0 12.1-15 15.7-44.3 1.4-11.5-1.1-34.3-5.1-43 .2 4.9 0 9.8-.3 14.4-.4-.8-.8-1.6-1.3-2.2-3.2-4-11.8-17.5-9.4-26.6.9-3.5 3.1-6 6.7-7.8 3.8-1.9 8.8-2.9 15.1-2.9 12.3 0 25.9 3.7 32.9 6 25.1 8 55.4 30.9 64.1 37.7.2.2.4.3.4.3l5.6 3.9-3.5-5.8c-.2-.3-19.1-31.4-53.2-46.5 2-2.9 7.4-8.1 21.6-15.1 21.4-10.5 46.5-15.8 74.3-15.8 27.9 0 52.9 5.3 74.3 15.8 14.2 6.9 19.6 12.2 21.6 15.1-34 15.1-52.9 46.2-53.1 46.5l-3.5 5.8 5.6-3.9s.2-.1.4-.3c8.7-6.8 39-29.8 64.1-37.7 7-2.2 20.6-6 32.9-6 6.3 0 11.3 1 15.1 2.9 3.5 1.8 5.7 4.4 6.7 7.8 2.5 9.1-6.1 22.6-9.4 26.6-.5.6-.9 1.3-1.3 2.2-.3-4.6-.5-9.5-.3-14.4-4 8.8-6.5 31.5-5.1 43 3.6 29.3 15.7 44.3 15.7 44.3-.8-1.6-1.8-7.7-2.7-14.9.7.6 1.5 1.2 2.2 1.8l.5.4c4.6 3.7 8.9 7.1 8.9 18.2 0 14.2-15.4 22.5-30.2 30.5-2.9 1.5-5.7 3.1-8.4 4.6-8.7 5-18 16.7-19.1 34.2-.9 14.6.9 49.9 3.4 75.9-12.4 4.8-26.7 6.4-39.7 6.8-2-4.1-3.9-8.5-5.5-13.1-.7-2-19.6-51.1-26.4-62.2 5.5 39 17.5 73.7 23.5 89.6-3.5-.5-7.3-.7-11.7-.7h-117c-4.4 0-8.3.3-11.7.7 6-15.9 18.1-50.6 23.5-89.6-6.8 11.2-25.7 60.3-26.4 62.2-1.6 4.6-3.5 9-5.5 13.1-13-.4-27.2-2-39.7-6.8 2.5-26 4.3-61.2 3.4-75.9-.9-17.4-10.3-29.2-19-34.2zM34.8 404.6c-12.1-20-8.7-54.1-3.7-59.1 10.9 34.4 47.2 44.3 74.4 45.4-2.7 4.2-5.2 7.6-7 10l-1.4 1.4c-7.2 7.8-8.6 18.5-4.1 31.8-22.7-.1-46.3-9.8-58.2-29.5zm45.7 43.5c6 1.1 12.2 1.9 18.6 2.4 3.5 8 7.4 15.9 12.3 23.1-14.4-5.9-24.4-16-30.9-25.5zM192 498.2c-60.6-.1-78.3-45.8-84.9-64.7-3.7-10.5-3.4-18.2.9-23.1 2.9-3.3 9.5-7.2 24.6-7.2h118.8c15.1 0 21.8 3.9 24.6 7.2 4.2 4.8 4.5 12.6.9 23.1-6.6 18.8-24.3 64.6-84.9 64.7zm80.6-24.6c4.9-7.2 8.8-15.1 12.3-23.1 6.4-.5 12.6-1.3 18.6-2.4-6.5 9.5-16.5 19.6-30.9 25.5zm76.6-69c-12 19.7-35.6 29.3-58.1 29.7 4.5-13.3 3.1-24.1-4.1-31.8-.4-.5-.9-1-1.4-1.5-1.8-2.4-4.3-5.8-7-10 27.2-1.2 63.5-11 74.4-45.4 5 5 8.4 39.1-3.8 59zM191.9 187.7h.2c12.7-.1 27.2-17.8 27.2-17.8-9.9 6-18.8 8.1-27.3 8.3-8.5-.2-17.4-2.3-27.3-8.3 0 0 14.5 17.6 27.2 17.8zm61.7 230.7h-29.4c-4.2 0-7.2.9-8.9 2.7-2.2 2.3-1.5 5.2-.9 6.7 1 2.6 5.5 11.3 13 19.3 2.7 2.9 6.6 4.5 11 4.5s8.7-1.6 11.8-4.2c2.3-2 10.2-9.2 13.7-18.1 1.3-3.3 1-6-.9-7.9-1.3-1.3-4-2.9-9.4-3z\"]\n};\nvar faWeebly = {\n prefix: 'fab',\n iconName: 'weebly',\n icon: [512, 512, [], \"f5cc\", \"M425.09 65.83c-39.88 0-73.28 25.73-83.66 64.33-18.16-58.06-65.5-64.33-84.95-64.33-19.78 0-66.8 6.28-85.28 64.33-10.38-38.6-43.45-64.33-83.66-64.33C38.59 65.83 0 99.72 0 143.03c0 28.96 4.18 33.27 77.17 233.48 22.37 60.57 67.77 69.35 92.74 69.35 39.23 0 70.04-19.46 85.93-53.98 15.89 34.83 46.69 54.29 85.93 54.29 24.97 0 70.36-9.1 92.74-69.67 76.55-208.65 77.5-205.58 77.5-227.2.63-48.32-36.01-83.47-86.92-83.47zm26.34 114.81l-65.57 176.44c-7.92 21.49-21.22 37.22-46.24 37.22-23.44 0-37.38-12.41-44.03-33.9l-39.28-117.42h-.95L216.08 360.4c-6.96 21.5-20.9 33.6-44.02 33.6-25.02 0-38.33-15.74-46.24-37.22L60.88 181.55c-5.38-14.83-7.92-23.91-7.92-34.5 0-16.34 15.84-29.36 38.33-29.36 18.69 0 31.99 11.8 36.11 29.05l44.03 139.82h.95l44.66-136.79c6.02-19.67 16.47-32.08 38.96-32.08s32.94 12.11 38.96 32.08l44.66 136.79h.95l44.03-139.82c4.12-17.25 17.42-29.05 36.11-29.05 22.17 0 38.33 13.32 38.33 35.71-.32 7.87-4.12 16.04-7.61 27.24z\"]\n};\nvar faConnectdevelop = {\n prefix: 'fab',\n iconName: 'connectdevelop',\n icon: [576, 512, [], \"f20e\", \"M550.5 241l-50.089-86.786c1.071-2.142 1.875-4.553 1.875-7.232 0-8.036-6.696-14.733-14.732-15.001l-55.447-95.893c.536-1.607 1.071-3.214 1.071-4.821 0-8.571-6.964-15.268-15.268-15.268-4.821 0-8.839 2.143-11.786 5.625H299.518C296.839 18.143 292.821 16 288 16s-8.839 2.143-11.518 5.625H170.411C167.464 18.143 163.447 16 158.625 16c-8.303 0-15.268 6.696-15.268 15.268 0 1.607.536 3.482 1.072 4.821l-55.983 97.233c-5.356 2.41-9.107 7.5-9.107 13.661 0 .535.268 1.071.268 1.607l-53.304 92.143c-7.232 1.339-12.59 7.5-12.59 15 0 7.232 5.089 13.393 12.054 15l55.179 95.358c-.536 1.607-.804 2.946-.804 4.821 0 7.232 5.089 13.393 12.054 14.732l51.697 89.732c-.536 1.607-1.071 3.482-1.071 5.357 0 8.571 6.964 15.268 15.268 15.268 4.821 0 8.839-2.143 11.518-5.357h106.875C279.161 493.857 283.447 496 288 496s8.839-2.143 11.518-5.357h107.143c2.678 2.946 6.696 4.821 10.982 4.821 8.571 0 15.268-6.964 15.268-15.268 0-1.607-.267-2.946-.803-4.285l51.697-90.268c6.964-1.339 12.054-7.5 12.054-14.732 0-1.607-.268-3.214-.804-4.821l54.911-95.358c6.964-1.339 12.322-7.5 12.322-15-.002-7.232-5.092-13.393-11.788-14.732zM153.535 450.732l-43.66-75.803h43.66v75.803zm0-83.839h-43.66c-.268-1.071-.804-2.142-1.339-3.214l44.999-47.41v50.624zm0-62.411l-50.357 53.304c-1.339-.536-2.679-1.34-4.018-1.607L43.447 259.75c.535-1.339.535-2.679.535-4.018s0-2.41-.268-3.482l51.965-90c2.679-.268 5.357-1.072 7.768-2.679l50.089 51.965v92.946zm0-102.322l-45.803-47.41c1.339-2.143 2.143-4.821 2.143-7.767 0-.268-.268-.804-.268-1.072l43.928-15.804v72.053zm0-80.625l-43.66 15.804 43.66-75.536v59.732zm326.519 39.108l.804 1.339L445.5 329.125l-63.75-67.232 98.036-101.518.268.268zM291.75 355.107l11.518 11.786H280.5l11.25-11.786zm-.268-11.25l-83.303-85.446 79.553-84.375 83.036 87.589-79.286 82.232zm5.357 5.893l79.286-82.232 67.5 71.25-5.892 28.125H313.714l-16.875-17.143zM410.411 44.393c1.071.536 2.142 1.072 3.482 1.34l57.857 100.714v.536c0 2.946.803 5.624 2.143 7.767L376.393 256l-83.035-87.589L410.411 44.393zm-9.107-2.143L287.732 162.518l-57.054-60.268 166.339-60h4.287zm-123.483 0c2.678 2.678 6.16 4.285 10.179 4.285s7.5-1.607 10.179-4.285h75L224.786 95.821 173.893 42.25h103.928zm-116.249 5.625l1.071-2.142a33.834 33.834 0 0 0 2.679-.804l51.161 53.84-54.911 19.821V47.875zm0 79.286l60.803-21.964 59.732 63.214-79.553 84.107-40.982-42.053v-83.304zm0 92.678L198 257.607l-36.428 38.304v-76.072zm0 87.858l42.053-44.464 82.768 85.982-17.143 17.678H161.572v-59.196zm6.964 162.053c-1.607-1.607-3.482-2.678-5.893-3.482l-1.071-1.607v-89.732h99.91l-91.607 94.821h-1.339zm129.911 0c-2.679-2.41-6.428-4.285-10.447-4.285s-7.767 1.875-10.447 4.285h-96.429l91.607-94.821h38.304l91.607 94.821H298.447zm120-11.786l-4.286 7.5c-1.339.268-2.41.803-3.482 1.339l-89.196-91.875h114.376l-17.412 83.036zm12.856-22.232l12.858-60.803h21.964l-34.822 60.803zm34.822-68.839h-20.357l4.553-21.16 17.143 18.214c-.535.803-1.071 1.874-1.339 2.946zm66.161-107.411l-55.447 96.697c-1.339.535-2.679 1.071-4.018 1.874l-20.625-21.964 34.554-163.928 45.803 79.286c-.267 1.339-.803 2.678-.803 4.285 0 1.339.268 2.411.536 3.75z\"]\n};\nvar faLeanpub = {\n prefix: 'fab',\n iconName: 'leanpub',\n icon: [576, 512, [], \"f212\", \"M386.539 111.485l15.096 248.955-10.979-.275c-36.232-.824-71.64 8.783-102.657 27.997-31.016-19.214-66.424-27.997-102.657-27.997-45.564 0-82.07 10.705-123.516 27.723L93.117 129.6c28.546-11.803 61.484-18.115 92.226-18.115 41.173 0 73.836 13.175 102.657 42.544 27.723-28.271 59.013-41.721 98.539-42.544zM569.07 448c-25.526 0-47.485-5.215-70.542-15.645-34.31-15.645-69.993-24.978-107.871-24.978-38.977 0-74.934 12.901-102.657 40.623-27.723-27.723-63.68-40.623-102.657-40.623-37.878 0-73.561 9.333-107.871 24.978C55.239 442.236 32.731 448 8.303 448H6.93L49.475 98.859C88.726 76.626 136.486 64 181.775 64 218.83 64 256.984 71.685 288 93.095 319.016 71.685 357.17 64 394.225 64c45.289 0 93.049 12.626 132.3 34.859L569.07 448zm-43.368-44.741l-34.036-280.246c-30.742-13.999-67.248-21.41-101.009-21.41-38.428 0-74.385 12.077-102.657 38.702-28.272-26.625-64.228-38.702-102.657-38.702-33.761 0-70.267 7.411-101.009 21.41L50.298 403.259c47.211-19.487 82.894-33.486 135.045-33.486 37.604 0 70.817 9.606 102.657 29.644 31.84-20.038 65.052-29.644 102.657-29.644 52.151 0 87.834 13.999 135.045 33.486z\"]\n};\nvar faBlackTie = {\n prefix: 'fab',\n iconName: 'black-tie',\n icon: [448, 512, [], \"f27e\", \"M0 32v448h448V32H0zm316.5 325.2L224 445.9l-92.5-88.7 64.5-184-64.5-86.6h184.9L252 173.2l64.5 184z\"]\n};\nvar faThemeco = {\n prefix: 'fab',\n iconName: 'themeco',\n icon: [448, 512, [], \"f5c6\", \"M202.9 8.43c9.9-5.73 26-5.82 35.95-.21L430 115.85c10 5.6 18 19.44 18 30.86V364c0 11.44-8.06 25.29-18 31L238.81 503.74c-9.93 5.66-26 5.57-35.85-.21L17.86 395.12C8 389.34 0 375.38 0 364V146.71c0-11.44 8-25.36 17.91-31.08zm-77.4 199.83c-15.94 0-31.89.14-47.83.14v101.45H96.8V280h28.7c49.71 0 49.56-71.74 0-71.74zm140.14 100.29l-30.73-34.64c37-7.51 34.8-65.23-10.87-65.51-16.09 0-32.17-.14-48.26-.14v101.59h19.13v-33.91h18.41l29.56 33.91h22.76zm-41.59-82.32c23.34 0 23.26 32.46 0 32.46h-29.13v-32.46zm-95.56-1.6c21.18 0 21.11 38.85 0 38.85H96.18v-38.84zm192.65-18.25c-68.46 0-71 105.8 0 105.8 69.48-.01 69.41-105.8 0-105.8zm0 17.39c44.12 0 44.8 70.86 0 70.86s-44.43-70.86 0-70.86z\"]\n};\nvar faPython = {\n prefix: 'fab',\n iconName: 'python',\n icon: [448, 512, [], \"f3e2\", \"M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z\"]\n};\nvar faAndroid = {\n prefix: 'fab',\n iconName: 'android',\n icon: [576, 512, [], \"f17b\", \"M420.55,301.93a24,24,0,1,1,24-24,24,24,0,0,1-24,24m-265.1,0a24,24,0,1,1,24-24,24,24,0,0,1-24,24m273.7-144.48,47.94-83a10,10,0,1,0-17.27-10h0l-48.54,84.07a301.25,301.25,0,0,0-246.56,0L116.18,64.45a10,10,0,1,0-17.27,10h0l47.94,83C64.53,202.22,8.24,285.55,0,384H576c-8.24-98.45-64.54-181.78-146.85-226.55\"]\n};\nvar faBots = {\n prefix: 'fab',\n iconName: 'bots',\n icon: [640, 512, [], \"e340\", \"M86.344,197.834a51.767,51.767,0,0,0-41.57,20.058V156.018a8.19,8.19,0,0,0-8.19-8.19H8.19A8.19,8.19,0,0,0,0,156.018V333.551a8.189,8.189,0,0,0,8.19,8.189H36.584a8.189,8.189,0,0,0,8.19-8.189v-8.088c11.628,13.373,25.874,19.769,41.573,19.769,34.6,0,61.922-26.164,61.922-73.843C148.266,225.452,121.229,197.834,86.344,197.834ZM71.516,305.691c-9.593,0-21.221-4.942-26.745-12.5V250.164c5.528-7.558,17.152-12.791,26.745-12.791,17.734,0,31.107,13.082,31.107,34.013C102.623,292.609,89.25,305.691,71.516,305.691Zm156.372-59.032a17.4,17.4,0,1,0,17.4,17.4A17.4,17.4,0,0,0,227.888,246.659ZM273.956,156.7V112.039a13.308,13.308,0,1,0-10.237,0V156.7a107.49,107.49,0,1,0,10.237,0Zm85.993,107.367c0,30.531-40.792,55.281-91.112,55.281s-91.111-24.75-91.111-55.281,40.792-55.281,91.111-55.281S359.949,233.532,359.949,264.062Zm-50.163,17.4a17.4,17.4,0,1,0-17.4-17.4h0A17.4,17.4,0,0,0,309.786,281.466ZM580.7,250.455c-14.828-2.617-22.387-3.78-22.387-9.885,0-5.523,7.268-9.884,17.735-9.884a65.56,65.56,0,0,1,34.484,10.1,8.171,8.171,0,0,0,11.288-2.468c.07-.11.138-.221.2-.333l8.611-14.886a8.2,8.2,0,0,0-2.867-11.123,99.863,99.863,0,0,0-52.014-14.138c-38.956,0-60.179,21.514-60.179,46.225,0,36.342,33.725,41.864,57.563,45.642,13.373,2.326,24.13,4.361,24.13,11.048,0,6.4-5.523,10.757-18.9,10.757-13.552,0-30.994-6.222-42.623-13.579a8.206,8.206,0,0,0-11.335,2.491c-.035.054-.069.108-.1.164l-10.2,16.891a8.222,8.222,0,0,0,2.491,11.066c15.224,10.3,37.663,16.692,59.441,16.692,40.409,0,63.957-19.769,63.957-46.515C640,260.63,604.537,254.816,580.7,250.455Zm-95.928,60.787a8.211,8.211,0,0,0-9.521-5.938,23.168,23.168,0,0,1-4.155.387c-7.849,0-12.5-6.106-12.5-14.245V240.28h20.349a8.143,8.143,0,0,0,8.141-8.143V209.466a8.143,8.143,0,0,0-8.141-8.143H458.594V171.091a8.143,8.143,0,0,0-8.143-8.143H422.257a8.143,8.143,0,0,0-8.143,8.143h0v30.232H399a8.143,8.143,0,0,0-8.143,8.143h0v22.671A8.143,8.143,0,0,0,399,240.28h15.115v63.667c0,27.037,15.408,41.282,43.9,41.282,12.183,0,21.383-2.2,27.6-5.446a8.161,8.161,0,0,0,4.145-9.278Z\"]\n};\nvar faFreeCodeCamp = {\n prefix: 'fab',\n iconName: 'free-code-camp',\n icon: [576, 512, [], \"f2c5\", \"M97.22,96.21c10.36-10.65,16-17.12,16-21.9,0-2.76-1.92-5.51-3.83-7.42A14.81,14.81,0,0,0,101,64.05c-8.48,0-20.92,8.79-35.84,25.69C23.68,137,2.51,182.81,3.37,250.34s17.47,117,54.06,161.87C76.22,435.86,90.62,448,100.9,448a13.55,13.55,0,0,0,8.37-3.84c1.91-2.76,3.81-5.63,3.81-8.38,0-5.63-3.86-12.2-13.2-20.55-44.45-42.33-67.32-97-67.48-165C32.25,188.8,54,137.83,97.22,96.21ZM239.47,420.07c.58.37.91.55.91.55Zm93.79.55.17-.13C333.24,420.62,333.17,420.67,333.26,420.62Zm3.13-158.18c-16.24-4.15,50.41-82.89-68.05-177.17,0,0,15.54,49.38-62.83,159.57-74.27,104.35,23.46,168.73,34,175.23-6.73-4.35-47.4-35.7,9.55-128.64,11-18.3,25.53-34.87,43.5-72.16,0,0,15.91,22.45,7.6,71.13C287.7,364,354,342.91,355,343.94c22.75,26.78-17.72,73.51-21.58,76.55,5.49-3.65,117.71-78,33-188.1C360.43,238.4,352.62,266.59,336.39,262.44ZM510.88,89.69C496,72.79,483.52,64,475,64a14.81,14.81,0,0,0-8.39,2.84c-1.91,1.91-3.83,4.66-3.83,7.42,0,4.78,5.6,11.26,16,21.9,43.23,41.61,65,92.59,64.82,154.06-.16,68-23,122.63-67.48,165-9.34,8.35-13.18,14.92-13.2,20.55,0,2.75,1.9,5.62,3.81,8.38A13.61,13.61,0,0,0,475.1,448c10.28,0,24.68-12.13,43.47-35.79,36.59-44.85,53.14-94.38,54.06-161.87S552.32,137,510.88,89.69Z\"]\n};\nvar faHornbill = {\n prefix: 'fab',\n iconName: 'hornbill',\n icon: [512, 512, [], \"f592\", \"M76.38 370.3a37.8 37.8 0 1 1-32.07-32.42c-78.28-111.35 52-190.53 52-190.53-5.86 43-8.24 91.16-8.24 91.16-67.31 41.49.93 64.06 39.81 72.87a140.38 140.38 0 0 0 131.66 91.94c1.92 0 3.77-.21 5.67-.28l.11 18.86c-99.22 1.39-158.7-29.14-188.94-51.6zm108-327.7A37.57 37.57 0 0 0 181 21.45a37.95 37.95 0 1 0-31.17 54.22c-22.55 29.91-53.83 89.57-52.42 190l21.84-.15c0-.9-.14-1.77-.14-2.68A140.42 140.42 0 0 1 207 132.71c8-37.71 30.7-114.3 73.8-44.29 0 0 48.14 2.38 91.18 8.24 0 0-77.84-128-187.59-54.06zm304.19 134.17a37.94 37.94 0 1 0-53.84-28.7C403 126.13 344.89 99 251.28 100.33l.14 22.5c2.7-.15 5.39-.41 8.14-.41a140.37 140.37 0 0 1 130.49 88.76c39.1 9 105.06 31.58 38.46 72.54 0 0-2.34 48.13-8.21 91.16 0 0 133.45-81.16 49-194.61a37.45 37.45 0 0 0 19.31-3.5zM374.06 436.24c21.43-32.46 46.42-89.69 45.14-179.66l-19.52.14c.08 2.06.3 4.07.3 6.15a140.34 140.34 0 0 1-91.39 131.45c-8.85 38.95-31.44 106.66-72.77 39.49 0 0-48.12-2.34-91.19-8.22 0 0 79.92 131.34 191.9 51a37.5 37.5 0 0 0 3.64 14 37.93 37.93 0 1 0 33.89-54.29z\"]\n};\nvar faJs = {\n prefix: 'fab',\n iconName: 'js',\n icon: [448, 512, [], \"f3b8\", \"M0 32v448h448V32H0zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L368 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z\"]\n};\nvar faIdeal = {\n prefix: 'fab',\n iconName: 'ideal',\n icon: [576, 512, [], \"e013\", \"M125.61,165.48a49.07,49.07,0,1,0,49.06,49.06A49.08,49.08,0,0,0,125.61,165.48ZM86.15,425.84h78.94V285.32H86.15Zm151.46-211.6c0-20-10-22.53-18.74-22.53H204.82V237.5h14.05C228.62,237.5,237.61,234.69,237.61,214.24Zm201.69,46V168.93h22.75V237.5h33.69C486.5,113.08,388.61,86.19,299.67,86.19H204.84V169h14c25.6,0,41.5,17.35,41.5,45.26,0,28.81-15.52,46-41.5,46h-14V425.88h94.83c144.61,0,194.94-67.16,196.72-165.64Zm-109.75,0H273.3V169h54.43v22.73H296v10.58h30V225H296V237.5h33.51Zm74.66,0-5.16-17.67H369.31l-5.18,17.67H340.47L368,168.92h32.35l27.53,91.34ZM299.65,32H32V480H299.65c161.85,0,251-79.73,251-224.52C550.62,172,518,32,299.65,32Zm0,426.92H53.07V53.07H299.65c142.1,0,229.9,64.61,229.9,202.41C529.55,389.57,448.55,458.92,299.65,458.92Zm83.86-264.85L376,219.88H392.4l-7.52-25.81Z\"]\n};\nvar faGit = {\n prefix: 'fab',\n iconName: 'git',\n icon: [512, 512, [], \"f1d3\", \"M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11zm-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16zm133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61zM512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z\"]\n};\nvar faDev = {\n prefix: 'fab',\n iconName: 'dev',\n icon: [448, 512, [], \"f6cc\", \"M120.12 208.29c-3.88-2.9-7.77-4.35-11.65-4.35H91.03v104.47h17.45c3.88 0 7.77-1.45 11.65-4.35 3.88-2.9 5.82-7.25 5.82-13.06v-69.65c-.01-5.8-1.96-10.16-5.83-13.06zM404.1 32H43.9C19.7 32 .06 51.59 0 75.8v360.4C.06 460.41 19.7 480 43.9 480h360.2c24.21 0 43.84-19.59 43.9-43.8V75.8c-.06-24.21-19.7-43.8-43.9-43.8zM154.2 291.19c0 18.81-11.61 47.31-48.36 47.25h-46.4V172.98h47.38c35.44 0 47.36 28.46 47.37 47.28l.01 70.93zm100.68-88.66H201.6v38.42h32.57v29.57H201.6v38.41h53.29v29.57h-62.18c-11.16.29-20.44-8.53-20.72-19.69V193.7c-.27-11.15 8.56-20.41 19.71-20.69h63.19l-.01 29.52zm103.64 115.29c-13.2 30.75-36.85 24.63-47.44 0l-38.53-144.8h32.57l29.71 113.72 29.57-113.72h32.58l-38.46 144.8z\"]\n};\nvar faSketch = {\n prefix: 'fab',\n iconName: 'sketch',\n icon: [512, 512, [], \"f7c6\", \"M27.5 162.2L9 187.1h90.5l6.9-130.7-78.9 105.8zM396.3 45.7L267.7 32l135.7 147.2-7.1-133.5zM112.2 218.3l-11.2-22H9.9L234.8 458zm2-31.2h284l-81.5-88.5L256.3 33zm297.3 9.1L277.6 458l224.8-261.7h-90.9zM415.4 69L406 56.4l.9 17.3 6.1 113.4h90.3zM113.5 93.5l-4.6 85.6L244.7 32 116.1 45.7zm287.7 102.7h-290l42.4 82.9L256.3 480l144.9-283.8z\"]\n};\nvar faYandexInternational = {\n prefix: 'fab',\n iconName: 'yandex-international',\n icon: [320, 512, [], \"f414\", \"M129.5 512V345.9L18.5 48h55.8l81.8 229.7L250.2 0h51.3L180.8 347.8V512h-51.3z\"]\n};\nvar faCcAmex = {\n prefix: 'fab',\n iconName: 'cc-amex',\n icon: [576, 512, [], \"f1f3\", \"M48 480C21.49 480 0 458.5 0 432V80C0 53.49 21.49 32 48 32H528C554.5 32 576 53.49 576 80V82.43H500.5L483.5 130L466.6 82.43H369.4V145.6L341.3 82.43H262.7L181 267.1H246.8V430.9H450.5L482.4 395.8L514.3 430.9H576V432C576 458.5 554.5 480 528 480H48zM482.6 364L440.4 410.3H390.5L458 338.6L390.5 266.1H441.9L483.4 312.8L525.4 266.1H576L508 338.2L576 410.3H524.6L482.6 364zM576 296.9V380.2L536.7 338.3L576 296.9zM307.6 377.1H390.6V410.3H268.6V267.1H390.6V300.2H307.6V322.6H388.5V354.9H307.6V377.2V377.1zM537.3 145.7L500.4 246.3H466L429.2 146V246.3H390.5V103H451.7L483.6 192.3L515.8 103H576V246.3H537.3V145.7zM334.5 217.6H268.6L256.7 246.3H213.7L276.1 103H327.3L390.6 246.3H346.5L334.5 217.6zM301.5 138.5L282 185.4H320.9L301.5 138.5z\"]\n};\nvar faUber = {\n prefix: 'fab',\n iconName: 'uber',\n icon: [448, 512, [], \"f402\", \"M414.1 32H33.9C15.2 32 0 47.2 0 65.9V446c0 18.8 15.2 34 33.9 34H414c18.7 0 33.9-15.2 33.9-33.9V65.9C448 47.2 432.8 32 414.1 32zM237.6 391.1C163 398.6 96.4 344.2 88.9 269.6h94.4V290c0 3.7 3 6.8 6.8 6.8H258c3.7 0 6.8-3 6.8-6.8v-67.9c0-3.7-3-6.8-6.8-6.8h-67.9c-3.7 0-6.8 3-6.8 6.8v20.4H88.9c7-69.4 65.4-122.2 135.1-122.2 69.7 0 128.1 52.8 135.1 122.2 7.5 74.5-46.9 141.1-121.5 148.6z\"]\n};\nvar faGithub = {\n prefix: 'fab',\n iconName: 'github',\n icon: [496, 512, [], \"f09b\", \"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\"]\n};\nvar faPhp = {\n prefix: 'fab',\n iconName: 'php',\n icon: [640, 512, [], \"f457\", \"M320 104.5c171.4 0 303.2 72.2 303.2 151.5S491.3 407.5 320 407.5c-171.4 0-303.2-72.2-303.2-151.5S148.7 104.5 320 104.5m0-16.8C143.3 87.7 0 163 0 256s143.3 168.3 320 168.3S640 349 640 256 496.7 87.7 320 87.7zM218.2 242.5c-7.9 40.5-35.8 36.3-70.1 36.3l13.7-70.6c38 0 63.8-4.1 56.4 34.3zM97.4 350.3h36.7l8.7-44.8c41.1 0 66.6 3 90.2-19.1 26.1-24 32.9-66.7 14.3-88.1-9.7-11.2-25.3-16.7-46.5-16.7h-70.7L97.4 350.3zm185.7-213.6h36.5l-8.7 44.8c31.5 0 60.7-2.3 74.8 10.7 14.8 13.6 7.7 31-8.3 113.1h-37c15.4-79.4 18.3-86 12.7-92-5.4-5.8-17.7-4.6-47.4-4.6l-18.8 96.6h-36.5l32.7-168.6zM505 242.5c-8 41.1-36.7 36.3-70.1 36.3l13.7-70.6c38.2 0 63.8-4.1 56.4 34.3zM384.2 350.3H421l8.7-44.8c43.2 0 67.1 2.5 90.2-19.1 26.1-24 32.9-66.7 14.3-88.1-9.7-11.2-25.3-16.7-46.5-16.7H417l-32.8 168.7z\"]\n};\nvar faAlipay = {\n prefix: 'fab',\n iconName: 'alipay',\n icon: [448, 512, [], \"f642\", \"M377.74 32H70.26C31.41 32 0 63.41 0 102.26v307.48C0 448.59 31.41 480 70.26 480h307.48c38.52 0 69.76-31.08 70.26-69.6-45.96-25.62-110.59-60.34-171.6-88.44-32.07 43.97-84.14 81-148.62 81-70.59 0-93.73-45.3-97.04-76.37-3.97-39.01 14.88-81.5 99.52-81.5 35.38 0 79.35 10.25 127.13 24.96 16.53-30.09 26.45-60.34 26.45-60.34h-178.2v-16.7h92.08v-31.24H88.28v-19.01h109.44V92.34h50.92v50.42h109.44v19.01H248.63v31.24h88.77s-15.21 46.62-38.35 90.92c48.93 16.7 100.01 36.04 148.62 52.74V102.26C447.83 63.57 416.43 32 377.74 32zM47.28 322.95c.99 20.17 10.25 53.73 69.93 53.73 52.07 0 92.58-39.68 117.87-72.9-44.63-18.68-84.48-31.41-109.44-31.41-67.45 0-79.35 33.06-78.36 50.58z\"]\n};\nvar faYoutube = {\n prefix: 'fab',\n iconName: 'youtube',\n icon: [576, 512, [61802], \"f167\", \"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\"]\n};\nvar faSkyatlas = {\n prefix: 'fab',\n iconName: 'skyatlas',\n icon: [640, 512, [], \"f216\", \"M640 329.3c0 65.9-52.5 114.4-117.5 114.4-165.9 0-196.6-249.7-359.7-249.7-146.9 0-147.1 212.2 5.6 212.2 42.5 0 90.9-17.8 125.3-42.5 5.6-4.1 16.9-16.3 22.8-16.3s10.9 5 10.9 10.9c0 7.8-13.1 19.1-18.7 24.1-40.9 35.6-100.3 61.2-154.7 61.2-83.4.1-154-59-154-144.9s67.5-149.1 152.8-149.1c185.3 0 222.5 245.9 361.9 245.9 99.9 0 94.8-139.7 3.4-139.7-17.5 0-35 11.6-46.9 11.6-8.4 0-15.9-7.2-15.9-15.6 0-11.6 5.3-23.7 5.3-36.3 0-66.6-50.9-114.7-116.9-114.7-53.1 0-80 36.9-88.8 36.9-6.2 0-11.2-5-11.2-11.2 0-5.6 4.1-10.3 7.8-14.4 25.3-28.8 64.7-43.7 102.8-43.7 79.4 0 139.1 58.4 139.1 137.8 0 6.9-.3 13.7-1.2 20.6 11.9-3.1 24.1-4.7 35.9-4.7 60.7 0 111.9 45.3 111.9 107.2z\"]\n};\nvar faFirefoxBrowser = {\n prefix: 'fab',\n iconName: 'firefox-browser',\n icon: [512, 512, [], \"e007\", \"M130.22 127.548C130.38 127.558 130.3 127.558 130.22 127.548V127.548ZM481.64 172.898C471.03 147.398 449.56 119.898 432.7 111.168C446.42 138.058 454.37 165.048 457.4 185.168C457.405 185.306 457.422 185.443 457.45 185.578C429.87 116.828 383.098 89.1089 344.9 28.7479C329.908 5.05792 333.976 3.51792 331.82 4.08792L331.7 4.15792C284.99 30.1109 256.365 82.5289 249.12 126.898C232.503 127.771 216.219 131.895 201.19 139.035C199.838 139.649 198.736 140.706 198.066 142.031C197.396 143.356 197.199 144.87 197.506 146.323C197.7 147.162 198.068 147.951 198.586 148.639C199.103 149.327 199.76 149.899 200.512 150.318C201.264 150.737 202.096 150.993 202.954 151.071C203.811 151.148 204.676 151.045 205.491 150.768L206.011 150.558C221.511 143.255 238.408 139.393 255.541 139.238C318.369 138.669 352.698 183.262 363.161 201.528C350.161 192.378 326.811 183.338 304.341 187.248C392.081 231.108 368.541 381.784 246.951 376.448C187.487 373.838 149.881 325.467 146.421 285.648C146.421 285.648 157.671 243.698 227.041 243.698C234.541 243.698 255.971 222.778 256.371 216.698C256.281 214.698 213.836 197.822 197.281 181.518C188.434 172.805 184.229 168.611 180.511 165.458C178.499 163.75 176.392 162.158 174.201 160.688C168.638 141.231 168.399 120.638 173.51 101.058C148.45 112.468 128.96 130.508 114.8 146.428H114.68C105.01 134.178 105.68 93.7779 106.25 85.3479C106.13 84.8179 99.022 89.0159 98.1 89.6579C89.5342 95.7103 81.5528 102.55 74.26 110.088C57.969 126.688 30.128 160.242 18.76 211.318C14.224 231.701 12 255.739 12 263.618C12 398.318 121.21 507.508 255.92 507.508C376.56 507.508 478.939 420.281 496.35 304.888C507.922 228.192 481.64 173.82 481.64 172.898Z\"]\n};\nvar faReplyd = {\n prefix: 'fab',\n iconName: 'replyd',\n icon: [448, 512, [], \"f3e6\", \"M320 480H128C57.6 480 0 422.4 0 352V160C0 89.6 57.6 32 128 32h192c70.4 0 128 57.6 128 128v192c0 70.4-57.6 128-128 128zM193.4 273.2c-6.1-2-11.6-3.1-16.4-3.1-7.2 0-13.5 1.9-18.9 5.6-5.4 3.7-9.6 9-12.8 15.8h-1.1l-4.2-18.3h-28v138.9h36.1v-89.7c1.5-5.4 4.4-9.8 8.7-13.2 4.3-3.4 9.8-5.1 16.2-5.1 4.6 0 9.8 1 15.6 3.1l4.8-34zm115.2 103.4c-3.2 2.4-7.7 4.8-13.7 7.1-6 2.3-12.8 3.5-20.4 3.5-12.2 0-21.1-3-26.5-8.9-5.5-5.9-8.5-14.7-9-26.4h83.3c.9-4.8 1.6-9.4 2.1-13.9.5-4.4.7-8.6.7-12.5 0-10.7-1.6-19.7-4.7-26.9-3.2-7.2-7.3-13-12.5-17.2-5.2-4.3-11.1-7.3-17.8-9.2-6.7-1.8-13.5-2.8-20.6-2.8-21.1 0-37.5 6.1-49.2 18.3s-17.5 30.5-17.5 55c0 22.8 5.2 40.7 15.6 53.7 10.4 13.1 26.8 19.6 49.2 19.6 10.7 0 20.9-1.5 30.4-4.6 9.5-3.1 17.1-6.8 22.6-11.2l-12-23.6zm-21.8-70.3c3.8 5.4 5.3 13.1 4.6 23.1h-51.7c.9-9.4 3.7-17 8.2-22.6 4.5-5.6 11.5-8.5 21-8.5 8.2-.1 14.1 2.6 17.9 8zm79.9 2.5c4.1 3.9 9.4 5.8 16.1 5.8 7 0 12.6-1.9 16.7-5.8s6.1-9.1 6.1-15.6-2-11.6-6.1-15.4c-4.1-3.8-9.6-5.7-16.7-5.7-6.7 0-12 1.9-16.1 5.7-4.1 3.8-6.1 8.9-6.1 15.4s2 11.7 6.1 15.6zm0 100.5c4.1 3.9 9.4 5.8 16.1 5.8 7 0 12.6-1.9 16.7-5.8s6.1-9.1 6.1-15.6-2-11.6-6.1-15.4c-4.1-3.8-9.6-5.7-16.7-5.7-6.7 0-12 1.9-16.1 5.7-4.1 3.8-6.1 8.9-6.1 15.4 0 6.6 2 11.7 6.1 15.6z\"]\n};\nvar faSuse = {\n prefix: 'fab',\n iconName: 'suse',\n icon: [640, 512, [], \"f7d6\", \"M471.08 102.66s-.3 18.3-.3 20.3c-9.1-3-74.4-24.1-135.7-26.3-51.9-1.8-122.8-4.3-223 57.3-19.4 12.4-73.9 46.1-99.6 109.7C7 277-.12 307 7 335.06a111 111 0 0 0 16.5 35.7c17.4 25 46.6 41.6 78.1 44.4 44.4 3.9 78.1-16 90-53.3 8.2-25.8 0-63.6-31.5-82.9-25.6-15.7-53.3-12.1-69.2-1.6-13.9 9.2-21.8 23.5-21.6 39.2.3 27.8 24.3 42.6 41.5 42.6a49 49 0 0 0 15.8-2.7c6.5-1.8 13.3-6.5 13.3-14.9 0-12.1-11.6-14.8-16.8-13.9-2.9.5-4.5 2-11.8 2.4-2-.2-12-3.1-12-14V316c.2-12.3 13.2-18 25.5-16.9 32.3 2.8 47.7 40.7 28.5 65.7-18.3 23.7-76.6 23.2-99.7-20.4-26-49.2 12.7-111.2 87-98.4 33.2 5.7 83.6 35.5 102.4 104.3h45.9c-5.7-17.6-8.9-68.3 42.7-68.3 56.7 0 63.9 39.9 79.8 68.3H460c-12.8-18.3-21.7-38.7-18.9-55.8 5.6-33.8 39.7-18.4 82.4-17.4 66.5.4 102.1-27 103.1-28 3.7-3.1 6.5-15.8 7-17.7 1.3-5.1-3.2-2.4-3.2-2.4-8.7 5.2-30.5 15.2-50.9 15.6-25.3.5-76.2-25.4-81.6-28.2-.3-.4.1 1.2-11-25.5 88.4 58.3 118.3 40.5 145.2 21.7.8-.6 4.3-2.9 3.6-5.7-13.8-48.1-22.4-62.7-34.5-69.6-37-21.6-125-34.7-129.2-35.3.1-.1-.9-.3-.9.7zm60.4 72.8a37.54 37.54 0 0 1 38.9-36.3c33.4 1.2 48.8 42.3 24.4 65.2-24.2 22.7-64.4 4.6-63.3-28.9zm38.6-25.3a26.27 26.27 0 1 0 25.4 27.2 26.19 26.19 0 0 0-25.4-27.2zm4.3 28.8c-15.4 0-15.4-15.6 0-15.6s15.4 15.64 0 15.64z\"]\n};\nvar faJenkins = {\n prefix: 'fab',\n iconName: 'jenkins',\n icon: [512, 512, [], \"f3b6\", \"M487.1 425c-1.4-11.2-19-23.1-28.2-31.9-5.1-5-29-23.1-30.4-29.9-1.4-6.6 9.7-21.5 13.3-28.9 5.1-10.7 8.8-23.7 11.3-32.6 18.8-66.1 20.7-156.9-6.2-211.2-10.2-20.6-38.6-49-56.4-62.5-42-31.7-119.6-35.3-170.1-16.6-14.1 5.2-27.8 9.8-40.1 17.1-33.1 19.4-68.3 32.5-78.1 71.6-24.2 10.8-31.5 41.8-30.3 77.8.2 7 4.1 15.8 2.7 22.4-.7 3.3-5.2 7.6-6.1 9.8-11.6 27.7-2.3 64 11.1 83.7 8.1 11.9 21.5 22.4 39.2 25.2.7 10.6 3.3 19.7 8.2 30.4 3.1 6.8 14.7 19 10.4 27.7-2.2 4.4-21 13.8-27.3 17.6C89 407.2 73.7 415 54.2 429c-12.6 9-32.3 10.2-29.2 31.1 2.1 14.1 10.1 31.6 14.7 45.8.7 2 1.4 4.1 2.1 6h422c4.9-15.3 9.7-30.9 14.6-47.2 3.4-11.4 10.2-27.8 8.7-39.7zM205.9 33.7c1.8-.5 3.4.7 4.9 2.4-.2 5.2-5.4 5.1-8.9 6.8-5.4 6.7-13.4 9.8-20 17.2-6.8 7.5-14.4 27.7-23.4 30-4.5 1.1-9.7-.8-13.6-.5-10.4.7-17.7 6-28.3 7.5 13.6-29.9 56.1-54 89.3-63.4zm-104.8 93.6c13.5-14.9 32.1-24.1 54.8-25.9 11.7 29.7-8.4 65-.9 97.6 2.3 9.9 10.2 25.4-2.4 25.7.3-28.3-34.8-46.3-61.3-29.6-1.8-21.5-4.9-51.7 9.8-67.8zm36.7 200.2c-1-4.1-2.7-12.9-2.3-15.1 1.6-8.7 17.1-12.5 11-24.7-11.3-.1-13.8 10.2-24.1 11.3-26.7 2.6-45.6-35.4-44.4-58.4 1-19.5 17.6-38.2 40.1-35.8 16 1.8 21.4 19.2 24.5 34.7 9.2.5 22.5-.4 26.9-7.6-.6-17.5-8.8-31.6-8.2-47.7 1-30.3 17.5-57.6 4.8-87.4 13.6-30.9 53.5-55.3 83.1-70 36.6-18.3 94.9-3.7 129.3 15.8 19.7 11.1 34.4 32.7 48.3 50.7-19.5-5.8-36.1 4.2-33.1 20.3 16.3-14.9 44.2-.2 52.5 16.4 7.9 15.8 7.8 39.3 9 62.8 2.9 57-10.4 115.9-39.1 157.1-7.7 11-14.1 23-24.9 30.6-26 18.2-65.4 34.7-99.2 23.4-44.7-15-65-44.8-89.5-78.8.7 18.7 13.8 34.1 26.8 48.4 11.3 12.5 25 26.6 39.7 32.4-12.3-2.9-31.1-3.8-36.2 7.2-28.6-1.9-55.1-4.8-68.7-24.2-10.6-15.4-21.4-41.4-26.3-61.4zm222 124.1c4.1-3 11.1-2.9 17.4-3.6-5.4-2.7-13-3.7-19.3-2.2-.1-4.2-2-6.8-3.2-10.2 10.6-3.8 35.5-28.5 49.6-20.3 6.7 3.9 9.5 26.2 10.1 37 .4 9-.8 18-4.5 22.8-18.8-.6-35.8-2.8-50.7-7 .9-6.1-1-12.1.6-16.5zm-17.2-20c-16.8.8-26-1.2-38.3-10.8.2-.8 1.4-.5 1.5-1.4 18 8 40.8-3.3 59-4.9-7.9 5.1-14.6 11.6-22.2 17.1zm-12.1 33.2c-1.6-9.4-3.5-12-2.8-20.2 25-16.6 29.7 28.6 2.8 20.2zM226 438.6c-11.6-.7-48.1-14-38.5-23.7 9.4 6.5 27.5 4.9 41.3 7.3.8 4.4-2.8 10.2-2.8 16.4zM57.7 497.1c-4.3-12.7-9.2-25.1-14.8-36.9 30.8-23.8 65.3-48.9 102.2-63.5 2.8-1.1 23.2 25.4 26.2 27.6 16.5 11.7 37 21 56.2 30.2 1.2 8.8 3.9 20.2 8.7 35.5.7 2.3 1.4 4.7 2.2 7.2H57.7zm240.6 5.7h-.8c.3-.2.5-.4.8-.5v.5zm7.5-5.7c2.1-1.4 4.3-2.8 6.4-4.3 1.1 1.4 2.2 2.8 3.2 4.3h-9.6zm15.1-24.7c-10.8 7.3-20.6 18.3-33.3 25.2-6 3.3-27 11.7-33.4 10.2-3.6-.8-3.9-5.3-5.4-9.5-3.1-9-10.1-23.4-10.8-37-.8-17.2-2.5-46 16-42.4 14.9 2.9 32.3 9.7 43.9 16.1 7.1 3.9 11.1 8.6 21.9 9.5-.1 1.4-.1 2.8-.2 4.3-5.9 3.9-15.3 3.8-21.8 7.1 9.5.4 17 2.7 23.5 5.9-.1 3.4-.3 7-.4 10.6zm53.4 24.7h-14c-.1-3.2-2.8-5.8-6.1-5.8s-5.9 2.6-6.1 5.8h-17.4c-2.8-4.4-5.7-8.6-8.9-12.5 2.1-2.2 4-4.7 6-6.9 9 3.7 14.8-4.9 21.7-4.2 7.9.8 14.2 11.7 25.4 11l-.6 12.6zm8.7 0c.2-4 .4-7.8.6-11.5 15.6-7.3 29 1.3 35.7 11.5H383zm83.4-37c-2.3 11.2-5.8 24-9.9 37.1-.2-.1-.4-.1-.6-.1H428c.6-1.1 1.2-2.2 1.9-3.3-2.6-6.1-9-8.7-10.9-15.5 12.1-22.7 6.5-93.4-24.2-78.5 4.3-6.3 15.6-11.5 20.8-19.3 13 10.4 20.8 20.3 33.2 31.4 6.8 6 20 13.3 21.4 23.1.8 5.5-2.6 18.9-3.8 25.1zM222.2 130.5c5.4-14.9 27.2-34.7 45-32 7.7 1.2 18 8.2 12.2 17.7-30.2-7-45.2 12.6-54.4 33.1-8.1-2-4.9-13.1-2.8-18.8zm184.1 63.1c8.2-3.6 22.4-.7 29.6-5.3-4.2-11.5-10.3-21.4-9.3-37.7.5 0 1 0 1.4.1 6.8 14.2 12.7 29.2 21.4 41.7-5.7 13.5-43.6 25.4-43.1 1.2zm20.4-43zm-117.2 45.7c-6.8-10.9-19-32.5-14.5-45.3 6.5 11.9 8.6 24.4 17.8 33.3 4.1 4 12.2 9 8.2 20.2-.9 2.7-7.8 8.6-11.7 9.7-14.4 4.3-47.9.9-36.6-17.1 11.9.7 27.9 7.8 36.8-.8zm27.3 70c3.8 6.6 1.4 18.7 12.1 20.6 20.2 3.4 43.6-12.3 58.1-17.8 9-15.2-.8-20.7-8.9-30.5-16.6-20-38.8-44.8-38-74.7 6.7-4.9 7.3 7.4 8.2 9.7 8.7 20.3 30.4 46.2 46.3 63.5 3.9 4.3 10.3 8.4 11 11.2 2.1 8.2-5.4 18-4.5 23.5-21.7 13.9-45.8 29.1-81.4 25.6-7.4-6.7-10.3-21.4-2.9-31.1zm-201.3-9.2c-6.8-3.9-8.4-21-16.4-21.4-11.4-.7-9.3 22.2-9.3 35.5-7.8-7.1-9.2-29.1-3.5-40.3-6.6-3.2-9.5 3.6-13.1 5.9 4.7-34.1 49.8-15.8 42.3 20.3zm299.6 28.8c-10.1 19.2-24.4 40.4-54 41-.6-6.2-1.1-15.6 0-19.4 22.7-2.2 36.6-13.7 54-21.6zm-141.9 12.4c18.9 9.9 53.6 11 79.3 10.2 1.4 5.6 1.3 12.6 1.4 19.4-33 1.8-72-6.4-80.7-29.6zm92.2 46.7c-1.7 4.3-5.3 9.3-9.8 11.1-12.1 4.9-45.6 8.7-62.4-.3-10.7-5.7-17.5-18.5-23.4-26-2.8-3.6-16.9-12.9-.2-12.9 13.1 32.7 58 29 95.8 28.1z\"]\n};\nvar faTwitter = {\n prefix: 'fab',\n iconName: 'twitter',\n icon: [512, 512, [], \"f099\", \"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z\"]\n};\nvar faRockrms = {\n prefix: 'fab',\n iconName: 'rockrms',\n icon: [496, 512, [], \"f3e9\", \"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm157.4 419.5h-90l-112-131.3c-17.9-20.4-3.9-56.1 26.6-56.1h75.3l-84.6-99.3-84.3 98.9h-90L193.5 67.2c14.4-18.4 41.3-17.3 54.5 0l157.7 185.1c19 22.8 2 57.2-27.6 56.1-.6 0-74.2.2-74.2.2l101.5 118.9z\"]\n};\nvar faPinterest = {\n prefix: 'fab',\n iconName: 'pinterest',\n icon: [496, 512, [], \"f0d2\", \"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z\"]\n};\nvar faBuffer = {\n prefix: 'fab',\n iconName: 'buffer',\n icon: [448, 512, [], \"f837\", \"M427.84 380.67l-196.5 97.82a18.6 18.6 0 0 1-14.67 0L20.16 380.67c-4-2-4-5.28 0-7.29L67.22 350a18.65 18.65 0 0 1 14.69 0l134.76 67a18.51 18.51 0 0 0 14.67 0l134.76-67a18.62 18.62 0 0 1 14.68 0l47.06 23.43c4.05 1.96 4.05 5.24 0 7.24zm0-136.53l-47.06-23.43a18.62 18.62 0 0 0-14.68 0l-134.76 67.08a18.68 18.68 0 0 1-14.67 0L81.91 220.71a18.65 18.65 0 0 0-14.69 0l-47.06 23.43c-4 2-4 5.29 0 7.31l196.51 97.8a18.6 18.6 0 0 0 14.67 0l196.5-97.8c4.05-2.02 4.05-5.3 0-7.31zM20.16 130.42l196.5 90.29a20.08 20.08 0 0 0 14.67 0l196.51-90.29c4-1.86 4-4.89 0-6.74L231.33 33.4a19.88 19.88 0 0 0-14.67 0l-196.5 90.28c-4.05 1.85-4.05 4.88 0 6.74z\"]\n};\nvar faNpm = {\n prefix: 'fab',\n iconName: 'npm',\n icon: [576, 512, [], \"f3d4\", \"M288 288h-32v-64h32v64zm288-128v192H288v32H160v-32H0V160h576zm-416 32H32v128h64v-96h32v96h32V192zm160 0H192v160h64v-32h64V192zm224 0H352v128h64v-96h32v96h32v-96h32v96h32V192z\"]\n};\nvar faYammer = {\n prefix: 'fab',\n iconName: 'yammer',\n icon: [512, 512, [], \"f840\", \"M500.676,159.486a12.779,12.779,0,0,0-6.4-8.282,13.954,13.954,0,0,0-10.078-1.125L457.8,156.7l-.043-.2-22.3,5.785-1.243.333-.608-2.17A369.037,369.037,0,0,0,347.538,4.289a14.1,14.1,0,0,0-19.784-.463l-102.9,102.747H24.947A24.9,24.9,0,0,0,0,131.417V380.38a24.963,24.963,0,0,0,24.918,24.9H224.986L328.072,508a13.667,13.667,0,0,0,19.327,0c.126-.126.249-.255.37-.385a368.025,368.025,0,0,0,69.577-107.374,403.45,403.45,0,0,0,17.3-50.8v-.028l20.406,5.336.029-.073L483.345,362a20.253,20.253,0,0,0,2.619.5,13.359,13.359,0,0,0,4.139-.072,13.5,13.5,0,0,0,10.515-9.924,415.855,415.855,0,0,0,.058-193.013ZM337.125,24.65l.013.014h-.013Zm-110.2,165.161L174.311,281.1a11.338,11.338,0,0,0-1.489,5.655v46.189a22.04,22.04,0,0,1-22.041,22h-3.4A22.068,22.068,0,0,1,125.3,332.962V287.294a11.532,11.532,0,0,0-1.388-5.51l-51.6-92.2a21.988,21.988,0,0,1,19.264-32.726h3.268a22.059,22.059,0,0,1,19.611,11.916l36.357,70.281,37.515-70.512a22.066,22.066,0,0,1,38.556-.695,21.7,21.7,0,0,1,0,21.967ZM337.145,24.673a348.147,348.147,0,0,1,75.8,141.335l.564,1.952-114.134,29.6V131.417a25.006,25.006,0,0,0-24.947-24.9H255.067Zm60.5,367.305v-.043l-.014.014a347.19,347.19,0,0,1-60.177,95.227l-82.2-81.893h19.177a24.978,24.978,0,0,0,24.947-24.9v-66.2l114.6,29.862A385.191,385.191,0,0,1,397.648,391.978Zm84-52.45.015.014-50.618-13.131L299.379,292.1V219.572l119.746-30.99,4.468-1.157,39.54-10.253,18.511-4.816A393,393,0,0,1,481.644,339.528Z\"]\n};\nvar faBtc = {\n prefix: 'fab',\n iconName: 'btc',\n icon: [384, 512, [], \"f15a\", \"M310.204 242.638c27.73-14.18 45.377-39.39 41.28-81.3-5.358-57.351-52.458-76.573-114.85-81.929V0h-48.528v77.203c-12.605 0-25.525.315-38.444.63V0h-48.528v79.409c-17.842.539-38.622.276-97.37 0v51.678c38.314-.678 58.417-3.14 63.023 21.427v217.429c-2.925 19.492-18.524 16.685-53.255 16.071L3.765 443.68c88.481 0 97.37.315 97.37.315V512h48.528v-67.06c13.234.315 26.154.315 38.444.315V512h48.528v-68.005c81.299-4.412 135.647-24.894 142.895-101.467 5.671-61.446-23.32-88.862-69.326-99.89zM150.608 134.553c27.415 0 113.126-8.507 113.126 48.528 0 54.515-85.71 48.212-113.126 48.212v-96.74zm0 251.776V279.821c32.772 0 133.127-9.138 133.127 53.255-.001 60.186-100.355 53.253-133.127 53.253z\"]\n};\nvar faDribbble = {\n prefix: 'fab',\n iconName: 'dribbble',\n icon: [512, 512, [], \"f17d\", \"M256 8C119.252 8 8 119.252 8 256s111.252 248 248 248 248-111.252 248-248S392.748 8 256 8zm163.97 114.366c29.503 36.046 47.369 81.957 47.835 131.955-6.984-1.477-77.018-15.682-147.502-6.818-5.752-14.041-11.181-26.393-18.617-41.614 78.321-31.977 113.818-77.482 118.284-83.523zM396.421 97.87c-3.81 5.427-35.697 48.286-111.021 76.519-34.712-63.776-73.185-116.168-79.04-124.008 67.176-16.193 137.966 1.27 190.061 47.489zm-230.48-33.25c5.585 7.659 43.438 60.116 78.537 122.509-99.087 26.313-186.36 25.934-195.834 25.809C62.38 147.205 106.678 92.573 165.941 64.62zM44.17 256.323c0-2.166.043-4.322.108-6.473 9.268.19 111.92 1.513 217.706-30.146 6.064 11.868 11.857 23.915 17.174 35.949-76.599 21.575-146.194 83.527-180.531 142.306C64.794 360.405 44.17 310.73 44.17 256.323zm81.807 167.113c22.127-45.233 82.178-103.622 167.579-132.756 29.74 77.283 42.039 142.053 45.189 160.638-68.112 29.013-150.015 21.053-212.768-27.882zm248.38 8.489c-2.171-12.886-13.446-74.897-41.152-151.033 66.38-10.626 124.7 6.768 131.947 9.055-9.442 58.941-43.273 109.844-90.795 141.978z\"]\n};\nvar faStumbleuponCircle = {\n prefix: 'fab',\n iconName: 'stumbleupon-circle',\n icon: [496, 512, [], \"f1a3\", \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 177.5c-9.8 0-17.8 8-17.8 17.8v106.9c0 40.9-33.9 73.9-74.9 73.9-41.4 0-74.9-33.5-74.9-74.9v-46.5h57.3v45.8c0 10 8 17.8 17.8 17.8s17.8-7.9 17.8-17.8V200.1c0-40 34.2-72.1 74.7-72.1 40.7 0 74.7 32.3 74.7 72.6v23.7l-34.1 10.1-22.9-10.7v-20.6c.1-9.6-7.9-17.6-17.7-17.6zm167.6 123.6c0 41.4-33.5 74.9-74.9 74.9-41.2 0-74.9-33.2-74.9-74.2V263l22.9 10.7 34.1-10.1v47.1c0 9.8 8 17.6 17.8 17.6s17.8-7.9 17.8-17.6v-48h57.3c-.1 45.9-.1 46.4-.1 46.4z\"]\n};\nvar faInternetExplorer = {\n prefix: 'fab',\n iconName: 'internet-explorer',\n icon: [512, 512, [], \"f26b\", \"M483.049 159.706c10.855-24.575 21.424-60.438 21.424-87.871 0-72.722-79.641-98.371-209.673-38.577-107.632-7.181-211.221 73.67-237.098 186.457 30.852-34.862 78.271-82.298 121.977-101.158C125.404 166.85 79.128 228.002 43.992 291.725 23.246 329.651 0 390.94 0 436.747c0 98.575 92.854 86.5 180.251 42.006 31.423 15.43 66.559 15.573 101.695 15.573 97.124 0 184.249-54.294 216.814-146.022H377.927c-52.509 88.593-196.819 52.996-196.819-47.436H509.9c6.407-43.581-1.655-95.715-26.851-141.162zM64.559 346.877c17.711 51.15 53.703 95.871 100.266 123.304-88.741 48.94-173.267 29.096-100.266-123.304zm115.977-108.873c2-55.151 50.276-94.871 103.98-94.871 53.418 0 101.981 39.72 103.981 94.871H180.536zm184.536-187.6c21.425-10.287 48.563-22.003 72.558-22.003 31.422 0 54.274 21.717 54.274 53.722 0 20.003-7.427 49.007-14.569 67.867-26.28-42.292-65.986-81.584-112.263-99.586z\"]\n};\nvar faTelegram = {\n prefix: 'fab',\n iconName: 'telegram',\n icon: [496, 512, [62462, \"telegram-plane\"], \"f2c6\", \"M248,8C111.033,8,0,119.033,0,256S111.033,504,248,504,496,392.967,496,256,384.967,8,248,8ZM362.952,176.66c-3.732,39.215-19.881,134.378-28.1,178.3-3.476,18.584-10.322,24.816-16.948,25.425-14.4,1.326-25.338-9.517-39.287-18.661-21.827-14.308-34.158-23.215-55.346-37.177-24.485-16.135-8.612-25,5.342-39.5,3.652-3.793,67.107-61.51,68.335-66.746.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608,69.142-14.845,10.194-26.894,9.934c-8.855-.191-25.888-5.006-38.551-9.123-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7,18.45-13.7,108.446-47.248,144.628-62.3c68.872-28.647,83.183-33.623,92.511-33.789,2.052-.034,6.639.474,9.61,2.885a10.452,10.452,0,0,1,3.53,6.716A43.765,43.765,0,0,1,362.952,176.66Z\"]\n};\nvar faTelegramPlane = faTelegram;\nvar faOldRepublic = {\n prefix: 'fab',\n iconName: 'old-republic',\n icon: [496, 512, [], \"f510\", \"M235.76 10.23c7.5-.31 15-.28 22.5-.09 3.61.14 7.2.4 10.79.73 4.92.27 9.79 1.03 14.67 1.62 2.93.43 5.83.98 8.75 1.46 7.9 1.33 15.67 3.28 23.39 5.4 12.24 3.47 24.19 7.92 35.76 13.21 26.56 12.24 50.94 29.21 71.63 49.88 20.03 20.09 36.72 43.55 48.89 69.19 1.13 2.59 2.44 5.1 3.47 7.74 2.81 6.43 5.39 12.97 7.58 19.63 4.14 12.33 7.34 24.99 9.42 37.83.57 3.14 1.04 6.3 1.4 9.47.55 3.83.94 7.69 1.18 11.56.83 8.34.84 16.73.77 25.1-.07 4.97-.26 9.94-.75 14.89-.24 3.38-.51 6.76-.98 10.12-.39 2.72-.63 5.46-1.11 8.17-.9 5.15-1.7 10.31-2.87 15.41-4.1 18.5-10.3 36.55-18.51 53.63-15.77 32.83-38.83 62.17-67.12 85.12a246.503 246.503 0 0 1-56.91 34.86c-6.21 2.68-12.46 5.25-18.87 7.41-3.51 1.16-7.01 2.38-10.57 3.39-6.62 1.88-13.29 3.64-20.04 5-4.66.91-9.34 1.73-14.03 2.48-5.25.66-10.5 1.44-15.79 1.74-6.69.66-13.41.84-20.12.81-6.82.03-13.65-.12-20.45-.79-3.29-.23-6.57-.5-9.83-.95-2.72-.39-5.46-.63-8.17-1.11-4.12-.72-8.25-1.37-12.35-2.22-4.25-.94-8.49-1.89-12.69-3.02-8.63-2.17-17.08-5.01-25.41-8.13-10.49-4.12-20.79-8.75-30.64-14.25-2.14-1.15-4.28-2.29-6.35-3.57-11.22-6.58-21.86-14.1-31.92-22.34-34.68-28.41-61.41-66.43-76.35-108.7-3.09-8.74-5.71-17.65-7.8-26.68-1.48-6.16-2.52-12.42-3.58-18.66-.4-2.35-.61-4.73-.95-7.09-.6-3.96-.75-7.96-1.17-11.94-.8-9.47-.71-18.99-.51-28.49.14-3.51.34-7.01.7-10.51.31-3.17.46-6.37.92-9.52.41-2.81.65-5.65 1.16-8.44.7-3.94 1.3-7.9 2.12-11.82 3.43-16.52 8.47-32.73 15.26-48.18 1.15-2.92 2.59-5.72 3.86-8.59 8.05-16.71 17.9-32.56 29.49-47.06 20-25.38 45.1-46.68 73.27-62.47 7.5-4.15 15.16-8.05 23.07-11.37 15.82-6.88 32.41-11.95 49.31-15.38 3.51-.67 7.04-1.24 10.56-1.85 2.62-.47 5.28-.7 7.91-1.08 3.53-.53 7.1-.68 10.65-1.04 2.46-.24 4.91-.36 7.36-.51m8.64 24.41c-9.23.1-18.43.99-27.57 2.23-7.3 1.08-14.53 2.6-21.71 4.3-13.91 3.5-27.48 8.34-40.46 14.42-10.46 4.99-20.59 10.7-30.18 17.22-4.18 2.92-8.4 5.8-12.34 9.03-5.08 3.97-9.98 8.17-14.68 12.59-2.51 2.24-4.81 4.7-7.22 7.06-28.22 28.79-48.44 65.39-57.5 104.69-2.04 8.44-3.54 17.02-4.44 25.65-1.1 8.89-1.44 17.85-1.41 26.8.11 7.14.38 14.28 1.22 21.37.62 7.12 1.87 14.16 3.2 21.18 1.07 4.65 2.03 9.32 3.33 13.91 6.29 23.38 16.5 45.7 30.07 65.75 8.64 12.98 18.78 24.93 29.98 35.77 16.28 15.82 35.05 29.04 55.34 39.22 7.28 3.52 14.66 6.87 22.27 9.63 5.04 1.76 10.06 3.57 15.22 4.98 11.26 3.23 22.77 5.6 34.39 7.06 2.91.29 5.81.61 8.72.9 13.82 1.08 27.74 1 41.54-.43 4.45-.6 8.92-.99 13.35-1.78 3.63-.67 7.28-1.25 10.87-2.1 4.13-.98 8.28-1.91 12.36-3.07 26.5-7.34 51.58-19.71 73.58-36.2 15.78-11.82 29.96-25.76 42.12-41.28 3.26-4.02 6.17-8.31 9.13-12.55 3.39-5.06 6.58-10.25 9.6-15.54 2.4-4.44 4.74-8.91 6.95-13.45 5.69-12.05 10.28-24.62 13.75-37.49 2.59-10.01 4.75-20.16 5.9-30.45 1.77-13.47 1.94-27.1 1.29-40.65-.29-3.89-.67-7.77-1-11.66-2.23-19.08-6.79-37.91-13.82-55.8-5.95-15.13-13.53-29.63-22.61-43.13-12.69-18.8-28.24-35.68-45.97-49.83-25.05-20-54.47-34.55-85.65-42.08-7.78-1.93-15.69-3.34-23.63-4.45-3.91-.59-7.85-.82-11.77-1.24-7.39-.57-14.81-.72-22.22-.58zM139.26 83.53c13.3-8.89 28.08-15.38 43.3-20.18-3.17 1.77-6.44 3.38-9.53 5.29-11.21 6.68-21.52 14.9-30.38 24.49-6.8 7.43-12.76 15.73-17.01 24.89-3.29 6.86-5.64 14.19-6.86 21.71-.93 4.85-1.3 9.81-1.17 14.75.13 13.66 4.44 27.08 11.29 38.82 5.92 10.22 13.63 19.33 22.36 27.26 4.85 4.36 10.24 8.09 14.95 12.6 2.26 2.19 4.49 4.42 6.43 6.91 2.62 3.31 4.89 6.99 5.99 11.1.9 3.02.66 6.2.69 9.31.02 4.1-.04 8.2.03 12.3.14 3.54-.02 7.09.11 10.63.08 2.38.02 4.76.05 7.14.16 5.77.06 11.53.15 17.3.11 2.91.02 5.82.13 8.74.03 1.63.13 3.28-.03 4.91-.91.12-1.82.18-2.73.16-10.99 0-21.88-2.63-31.95-6.93-6-2.7-11.81-5.89-17.09-9.83-5.75-4.19-11.09-8.96-15.79-14.31-6.53-7.24-11.98-15.39-16.62-23.95-1.07-2.03-2.24-4.02-3.18-6.12-1.16-2.64-2.62-5.14-3.67-7.82-4.05-9.68-6.57-19.94-8.08-30.31-.49-4.44-1.09-8.88-1.2-13.35-.7-15.73.84-31.55 4.67-46.82 2.12-8.15 4.77-16.18 8.31-23.83 6.32-14.2 15.34-27.18 26.3-38.19 6.28-6.2 13.13-11.84 20.53-16.67zm175.37-20.12c2.74.74 5.41 1.74 8.09 2.68 6.36 2.33 12.68 4.84 18.71 7.96 13.11 6.44 25.31 14.81 35.82 24.97 10.2 9.95 18.74 21.6 25.14 34.34 1.28 2.75 2.64 5.46 3.81 8.26 6.31 15.1 10 31.26 11.23 47.57.41 4.54.44 9.09.45 13.64.07 11.64-1.49 23.25-4.3 34.53-1.97 7.27-4.35 14.49-7.86 21.18-3.18 6.64-6.68 13.16-10.84 19.24-6.94 10.47-15.6 19.87-25.82 27.22-10.48 7.64-22.64 13.02-35.4 15.38-3.51.69-7.08 1.08-10.66 1.21-1.85.06-3.72.16-5.56-.1-.28-2.15 0-4.31-.01-6.46-.03-3.73.14-7.45.1-11.17.19-7.02.02-14.05.21-21.07.03-2.38-.03-4.76.03-7.14.17-5.07-.04-10.14.14-15.21.1-2.99-.24-6.04.51-8.96.66-2.5 1.78-4.86 3.09-7.08 4.46-7.31 11.06-12.96 17.68-18.26 5.38-4.18 10.47-8.77 15.02-13.84 7.68-8.37 14.17-17.88 18.78-28.27 2.5-5.93 4.52-12.1 5.55-18.46.86-4.37 1.06-8.83 1.01-13.27-.02-7.85-1.4-15.65-3.64-23.17-1.75-5.73-4.27-11.18-7.09-16.45-3.87-6.93-8.65-13.31-13.96-19.2-9.94-10.85-21.75-19.94-34.6-27.1-1.85-1.02-3.84-1.82-5.63-2.97zm-100.8 58.45c.98-1.18 1.99-2.33 3.12-3.38-.61.93-1.27 1.81-1.95 2.68-3.1 3.88-5.54 8.31-7.03 13.06-.87 3.27-1.68 6.6-1.73 10-.07 2.52-.08 5.07.32 7.57 1.13 7.63 4.33 14.85 8.77 21.12 2 2.7 4.25 5.27 6.92 7.33 1.62 1.27 3.53 2.09 5.34 3.05 3.11 1.68 6.32 3.23 9.07 5.48 2.67 2.09 4.55 5.33 4.4 8.79-.01 73.67 0 147.34-.01 221.02 0 1.35-.08 2.7.04 4.04.13 1.48.82 2.83 1.47 4.15.86 1.66 1.78 3.34 3.18 4.62.85.77 1.97 1.4 3.15 1.24 1.5-.2 2.66-1.35 3.45-2.57.96-1.51 1.68-3.16 2.28-4.85.76-2.13.44-4.42.54-6.63.14-4.03-.02-8.06.14-12.09.03-5.89.03-11.77.06-17.66.14-3.62.03-7.24.11-10.86.15-4.03-.02-8.06.14-12.09.03-5.99.03-11.98.07-17.97.14-3.62.02-7.24.11-10.86.14-3.93-.02-7.86.14-11.78.03-5.99.03-11.98.06-17.97.16-3.94-.01-7.88.19-11.82.29 1.44.13 2.92.22 4.38.19 3.61.42 7.23.76 10.84.32 3.44.44 6.89.86 10.32.37 3.1.51 6.22.95 9.31.57 4.09.87 8.21 1.54 12.29 1.46 9.04 2.83 18.11 5.09 26.99 1.13 4.82 2.4 9.61 4 14.3 2.54 7.9 5.72 15.67 10.31 22.62 1.73 2.64 3.87 4.98 6.1 7.21.27.25.55.51.88.71.6.25 1.31-.07 1.7-.57.71-.88 1.17-1.94 1.7-2.93 4.05-7.8 8.18-15.56 12.34-23.31.7-1.31 1.44-2.62 2.56-3.61 1.75-1.57 3.84-2.69 5.98-3.63 2.88-1.22 5.9-2.19 9.03-2.42 6.58-.62 13.11.75 19.56 1.85 3.69.58 7.4 1.17 11.13 1.41 3.74.1 7.48.05 11.21-.28 8.55-.92 16.99-2.96 24.94-6.25 5.3-2.24 10.46-4.83 15.31-7.93 11.46-7.21 21.46-16.57 30.04-27.01 1.17-1.42 2.25-2.9 3.46-4.28-1.2 3.24-2.67 6.37-4.16 9.48-1.25 2.9-2.84 5.61-4.27 8.42-5.16 9.63-11.02 18.91-17.75 27.52-4.03 5.21-8.53 10.05-13.33 14.57-6.64 6.05-14.07 11.37-22.43 14.76-8.21 3.37-17.31 4.63-26.09 3.29-3.56-.58-7.01-1.69-10.41-2.88-2.79-.97-5.39-2.38-8.03-3.69-3.43-1.71-6.64-3.81-9.71-6.08 2.71 3.06 5.69 5.86 8.7 8.61 4.27 3.76 8.74 7.31 13.63 10.23 3.98 2.45 8.29 4.4 12.84 5.51 1.46.37 2.96.46 4.45.6-1.25 1.1-2.63 2.04-3.99 2.98-9.61 6.54-20.01 11.86-30.69 16.43-20.86 8.7-43.17 13.97-65.74 15.34-4.66.24-9.32.36-13.98.36-4.98-.11-9.97-.13-14.92-.65-11.2-.76-22.29-2.73-33.17-5.43-10.35-2.71-20.55-6.12-30.3-10.55-8.71-3.86-17.12-8.42-24.99-13.79-1.83-1.31-3.74-2.53-5.37-4.08 6.6-1.19 13.03-3.39 18.99-6.48 5.74-2.86 10.99-6.66 15.63-11.07 2.24-2.19 4.29-4.59 6.19-7.09-3.43 2.13-6.93 4.15-10.62 5.78-4.41 2.16-9.07 3.77-13.81 5.02-5.73 1.52-11.74 1.73-17.61 1.14-8.13-.95-15.86-4.27-22.51-8.98-4.32-2.94-8.22-6.43-11.96-10.06-9.93-10.16-18.2-21.81-25.66-33.86-3.94-6.27-7.53-12.75-11.12-19.22-1.05-2.04-2.15-4.05-3.18-6.1 2.85 2.92 5.57 5.97 8.43 8.88 8.99 8.97 18.56 17.44 29.16 24.48 7.55 4.9 15.67 9.23 24.56 11.03 3.11.73 6.32.47 9.47.81 2.77.28 5.56.2 8.34.3 5.05.06 10.11.04 15.16-.16 3.65-.16 7.27-.66 10.89-1.09 2.07-.25 4.11-.71 6.14-1.2 3.88-.95 8.11-.96 11.83.61 4.76 1.85 8.44 5.64 11.38 9.71 2.16 3.02 4.06 6.22 5.66 9.58 1.16 2.43 2.46 4.79 3.55 7.26 1 2.24 2.15 4.42 3.42 6.52.67 1.02 1.4 2.15 2.62 2.55 1.06-.75 1.71-1.91 2.28-3.03 2.1-4.16 3.42-8.65 4.89-13.05 2.02-6.59 3.78-13.27 5.19-20.02 2.21-9.25 3.25-18.72 4.54-28.13.56-3.98.83-7.99 1.31-11.97.87-10.64 1.9-21.27 2.24-31.94.08-1.86.24-3.71.25-5.57.01-4.35.25-8.69.22-13.03-.01-2.38-.01-4.76 0-7.13.05-5.07-.2-10.14-.22-15.21-.2-6.61-.71-13.2-1.29-19.78-.73-5.88-1.55-11.78-3.12-17.51-2.05-7.75-5.59-15.03-9.8-21.82-3.16-5.07-6.79-9.88-11.09-14.03-3.88-3.86-8.58-7.08-13.94-8.45-1.5-.41-3.06-.45-4.59-.64.07-2.99.7-5.93 1.26-8.85 1.59-7.71 3.8-15.3 6.76-22.6 1.52-4.03 3.41-7.9 5.39-11.72 3.45-6.56 7.62-12.79 12.46-18.46zm31.27 1.7c.35-.06.71-.12 1.07-.19.19 1.79.09 3.58.1 5.37v38.13c-.01 1.74.13 3.49-.15 5.22-.36-.03-.71-.05-1.06-.05-.95-3.75-1.72-7.55-2.62-11.31-.38-1.53-.58-3.09-1.07-4.59-1.7-.24-3.43-.17-5.15-.2-5.06-.01-10.13 0-15.19-.01-1.66-.01-3.32.09-4.98-.03-.03-.39-.26-.91.16-1.18 1.28-.65 2.72-.88 4.06-1.35 3.43-1.14 6.88-2.16 10.31-3.31 1.39-.48 2.9-.72 4.16-1.54.04-.56.02-1.13-.05-1.68-1.23-.55-2.53-.87-3.81-1.28-3.13-1.03-6.29-1.96-9.41-3.02-1.79-.62-3.67-1-5.41-1.79-.03-.37-.07-.73-.11-1.09 5.09-.19 10.2.06 15.3-.12 3.36-.13 6.73.08 10.09-.07.12-.39.26-.77.37-1.16 1.08-4.94 2.33-9.83 3.39-14.75zm5.97-.2c.36.05.72.12 1.08.2.98 3.85 1.73 7.76 2.71 11.61.36 1.42.56 2.88 1.03 4.27 2.53.18 5.07-.01 7.61.05 5.16.12 10.33.12 15.49.07.76-.01 1.52.03 2.28.08-.04.36-.07.72-.1 1.08-1.82.83-3.78 1.25-5.67 1.89-3.73 1.23-7.48 2.39-11.22 3.57-.57.17-1.12.42-1.67.64-.15.55-.18 1.12-.12 1.69.87.48 1.82.81 2.77 1.09 4.88 1.52 9.73 3.14 14.63 4.6.38.13.78.27 1.13.49.4.27.23.79.15 1.18-1.66.13-3.31.03-4.97.04-5.17.01-10.33-.01-15.5.01-1.61.03-3.22-.02-4.82.21-.52 1.67-.72 3.42-1.17 5.11-.94 3.57-1.52 7.24-2.54 10.78-.36.01-.71.02-1.06.06-.29-1.73-.15-3.48-.15-5.22v-38.13c.02-1.78-.08-3.58.11-5.37zM65.05 168.33c1.12-2.15 2.08-4.4 3.37-6.46-1.82 7.56-2.91 15.27-3.62 23-.8 7.71-.85 15.49-.54 23.23 1.05 19.94 5.54 39.83 14.23 57.88 2.99 5.99 6.35 11.83 10.5 17.11 6.12 7.47 12.53 14.76 19.84 21.09 4.8 4.1 9.99 7.78 15.54 10.8 3.27 1.65 6.51 3.39 9.94 4.68 5.01 2.03 10.19 3.61 15.42 4.94 3.83.96 7.78 1.41 11.52 2.71 5 1.57 9.47 4.61 13.03 8.43 4.93 5.23 8.09 11.87 10.2 18.67.99 2.9 1.59 5.91 2.17 8.92.15.75.22 1.52.16 2.29-6.5 2.78-13.26 5.06-20.26 6.18-4.11.78-8.29.99-12.46 1.08-10.25.24-20.47-1.76-30.12-5.12-3.74-1.42-7.49-2.85-11.03-4.72-8.06-3.84-15.64-8.7-22.46-14.46-2.92-2.55-5.83-5.13-8.4-8.03-9.16-9.83-16.3-21.41-21.79-33.65-2.39-5.55-4.61-11.18-6.37-16.96-1.17-3.94-2.36-7.89-3.26-11.91-.75-2.94-1.22-5.95-1.87-8.92-.46-2.14-.69-4.32-1.03-6.48-.85-5.43-1.28-10.93-1.33-16.43.11-6.18.25-12.37 1.07-18.5.4-2.86.67-5.74 1.15-8.6.98-5.7 2.14-11.37 3.71-16.93 3.09-11.65 7.48-22.95 12.69-33.84zm363.73-6.44c1.1 1.66 1.91 3.48 2.78 5.26 2.1 4.45 4.24 8.9 6.02 13.49 7.61 18.76 12.3 38.79 13.04 59.05.02 1.76.07 3.52.11 5.29.13 9.57-1.27 19.09-3.18 28.45-.73 3.59-1.54 7.17-2.58 10.69-4.04 14.72-10 29-18.41 41.78-8.21 12.57-19.01 23.55-31.84 31.41-5.73 3.59-11.79 6.64-18.05 9.19-5.78 2.19-11.71 4.03-17.8 5.11-6.4 1.05-12.91 1.52-19.4 1.23-7.92-.48-15.78-2.07-23.21-4.85-1.94-.8-3.94-1.46-5.84-2.33-.21-1.51.25-2.99.53-4.46 1.16-5.74 3.03-11.36 5.7-16.58 2.37-4.51 5.52-8.65 9.46-11.9 2.43-2.05 5.24-3.61 8.16-4.83 3.58-1.5 7.47-1.97 11.24-2.83 7.23-1.71 14.37-3.93 21.15-7 10.35-4.65 19.71-11.38 27.65-19.46 1.59-1.61 3.23-3.18 4.74-4.87 3.37-3.76 6.71-7.57 9.85-11.53 7.48-10.07 12.82-21.59 16.71-33.48 1.58-5.3 3.21-10.6 4.21-16.05.63-2.87 1.04-5.78 1.52-8.68.87-6.09 1.59-12.22 1.68-18.38.12-6.65.14-13.32-.53-19.94-.73-7.99-1.87-15.96-3.71-23.78z\"]\n};\nvar faSquareWhatsapp = {\n prefix: 'fab',\n iconName: 'square-whatsapp',\n icon: [448, 512, [\"whatsapp-square\"], \"f40c\", \"M224 122.8c-72.7 0-131.8 59.1-131.9 131.8 0 24.9 7 49.2 20.2 70.1l3.1 5-13.3 48.6 49.9-13.1 4.8 2.9c20.2 12 43.4 18.4 67.1 18.4h.1c72.6 0 133.3-59.1 133.3-131.8 0-35.2-15.2-68.3-40.1-93.2-25-25-58-38.7-93.2-38.7zm77.5 188.4c-3.3 9.3-19.1 17.7-26.7 18.8-12.6 1.9-22.4.9-47.5-9.9-39.7-17.2-65.7-57.2-67.7-59.8-2-2.6-16.2-21.5-16.2-41s10.2-29.1 13.9-33.1c3.6-4 7.9-5 10.6-5 2.6 0 5.3 0 7.6.1 2.4.1 5.7-.9 8.9 6.8 3.3 7.9 11.2 27.4 12.2 29.4s1.7 4.3.3 6.9c-7.6 15.2-15.7 14.6-11.6 21.6 15.3 26.3 30.6 35.4 53.9 47.1 4 2 6.3 1.7 8.6-1 2.3-2.6 9.9-11.6 12.5-15.5 2.6-4 5.3-3.3 8.9-2 3.6 1.3 23.1 10.9 27.1 12.9s6.6 3 7.6 4.6c.9 1.9.9 9.9-2.4 19.1zM400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM223.9 413.2c-26.6 0-52.7-6.7-75.8-19.3L64 416l22.5-82.2c-13.9-24-21.2-51.3-21.2-79.3C65.4 167.1 136.5 96 223.9 96c42.4 0 82.2 16.5 112.2 46.5 29.9 30 47.9 69.8 47.9 112.2 0 87.4-72.7 158.5-160.1 158.5z\"]\n};\nvar faWhatsappSquare = faSquareWhatsapp;\nvar faNodeJs = {\n prefix: 'fab',\n iconName: 'node-js',\n icon: [448, 512, [], \"f3d3\", \"M224 508c-6.7 0-13.5-1.8-19.4-5.2l-61.7-36.5c-9.2-5.2-4.7-7-1.7-8 12.3-4.3 14.8-5.2 27.9-12.7 1.4-.8 3.2-.5 4.6.4l47.4 28.1c1.7 1 4.1 1 5.7 0l184.7-106.6c1.7-1 2.8-3 2.8-5V149.3c0-2.1-1.1-4-2.9-5.1L226.8 37.7c-1.7-1-4-1-5.7 0L36.6 144.3c-1.8 1-2.9 3-2.9 5.1v213.1c0 2 1.1 4 2.9 4.9l50.6 29.2c27.5 13.7 44.3-2.4 44.3-18.7V167.5c0-3 2.4-5.3 5.4-5.3h23.4c2.9 0 5.4 2.3 5.4 5.3V378c0 36.6-20 57.6-54.7 57.6-10.7 0-19.1 0-42.5-11.6l-48.4-27.9C8.1 389.2.7 376.3.7 362.4V149.3c0-13.8 7.4-26.8 19.4-33.7L204.6 9c11.7-6.6 27.2-6.6 38.8 0l184.7 106.7c12 6.9 19.4 19.8 19.4 33.7v213.1c0 13.8-7.4 26.7-19.4 33.7L243.4 502.8c-5.9 3.4-12.6 5.2-19.4 5.2zm149.1-210.1c0-39.9-27-50.5-83.7-58-57.4-7.6-63.2-11.5-63.2-24.9 0-11.1 4.9-25.9 47.4-25.9 37.9 0 51.9 8.2 57.7 33.8.5 2.4 2.7 4.2 5.2 4.2h24c1.5 0 2.9-.6 3.9-1.7s1.5-2.6 1.4-4.1c-3.7-44.1-33-64.6-92.2-64.6-52.7 0-84.1 22.2-84.1 59.5 0 40.4 31.3 51.6 81.8 56.6 60.5 5.9 65.2 14.8 65.2 26.7 0 20.6-16.6 29.4-55.5 29.4-48.9 0-59.6-12.3-63.2-36.6-.4-2.6-2.6-4.5-5.3-4.5h-23.9c-3 0-5.3 2.4-5.3 5.3 0 31.1 16.9 68.2 97.8 68.2 58.4-.1 92-23.2 92-63.4z\"]\n};\nvar faEdgeLegacy = {\n prefix: 'fab',\n iconName: 'edge-legacy',\n icon: [512, 512, [], \"e078\", \"M25.71,228.16l.35-.48c0,.16,0,.32-.07.48Zm460.58,15.51c0-44-7.76-84.46-28.81-122.4C416.5,47.88,343.91,8,258.89,8,119,7.72,40.62,113.21,26.06,227.68c42.42-61.31,117.07-121.38,220.37-125,0,0,109.67,0,99.42,105H170c6.37-37.39,18.55-59,34.34-78.93-75.05,34.9-121.85,96.1-120.75,188.32.83,71.45,50.13,144.84,120.75,172,83.35,31.84,192.77,7.2,240.13-21.33V363.31C363.6,419.8,173.6,424.23,172.21,295.74H486.29V243.67Z\"]\n};\nvar faSlack = {\n prefix: 'fab',\n iconName: 'slack',\n icon: [448, 512, [62447, \"slack-hash\"], \"f198\", \"M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1c0-25.9 21.16-47.06 47.06-47.06h47.06v47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V315.1zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06H164.9zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06H164.9zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06h-47.06V196.9zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06V196.9zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06v-47.06h47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06 0-25.9 21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06H283.1z\"]\n};\nvar faSlackHash = faSlack;\nvar faMedrt = {\n prefix: 'fab',\n iconName: 'medrt',\n icon: [544, 512, [], \"f3c8\", \"M113.7 256c0 121.8 83.9 222.8 193.5 241.1-18.7 4.5-38.2 6.9-58.2 6.9C111.4 504 0 393 0 256S111.4 8 248.9 8c20.1 0 39.6 2.4 58.2 6.9C197.5 33.2 113.7 134.2 113.7 256m297.4 100.3c-77.7 55.4-179.6 47.5-240.4-14.6 5.5 14.1 12.7 27.7 21.7 40.5 61.6 88.2 182.4 109.3 269.7 47 87.3-62.3 108.1-184.3 46.5-272.6-9-12.9-19.3-24.3-30.5-34.2 37.4 78.8 10.7 178.5-67 233.9m-218.8-244c-1.4 1-2.7 2.1-4 3.1 64.3-17.8 135.9 4 178.9 60.5 35.7 47 42.9 106.6 24.4 158 56.7-56.2 67.6-142.1 22.3-201.8-50-65.5-149.1-74.4-221.6-19.8M296 224c-4.4 0-8-3.6-8-8v-40c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v40c0 4.4-3.6 8-8 8h-40c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h40c4.4 0 8 3.6 8 8v40c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-40c0-4.4 3.6-8 8-8h40c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8h-40z\"]\n};\nvar faUsb = {\n prefix: 'fab',\n iconName: 'usb',\n icon: [640, 512, [], \"f287\", \"M641.5 256c0 3.1-1.7 6.1-4.5 7.5L547.9 317c-1.4.8-2.8 1.4-4.5 1.4-1.4 0-3.1-.3-4.5-1.1-2.8-1.7-4.5-4.5-4.5-7.8v-35.6H295.7c25.3 39.6 40.5 106.9 69.6 106.9H392V354c0-5 3.9-8.9 8.9-8.9H490c5 0 8.9 3.9 8.9 8.9v89.1c0 5-3.9 8.9-8.9 8.9h-89.1c-5 0-8.9-3.9-8.9-8.9v-26.7h-26.7c-75.4 0-81.1-142.5-124.7-142.5H140.3c-8.1 30.6-35.9 53.5-69 53.5C32 327.3 0 295.3 0 256s32-71.3 71.3-71.3c33.1 0 61 22.8 69 53.5 39.1 0 43.9 9.5 74.6-60.4C255 88.7 273 95.7 323.8 95.7c7.5-20.9 27-35.6 50.4-35.6 29.5 0 53.5 23.9 53.5 53.5s-23.9 53.5-53.5 53.5c-23.4 0-42.9-14.8-50.4-35.6H294c-29.1 0-44.3 67.4-69.6 106.9h310.1v-35.6c0-3.3 1.7-6.1 4.5-7.8 2.8-1.7 6.4-1.4 8.9.3l89.1 53.5c2.8 1.1 4.5 4.1 4.5 7.2z\"]\n};\nvar faTumblr = {\n prefix: 'fab',\n iconName: 'tumblr',\n icon: [320, 512, [], \"f173\", \"M309.8 480.3c-13.6 14.5-50 31.7-97.4 31.7-120.8 0-147-88.8-147-140.6v-144H17.9c-5.5 0-10-4.5-10-10v-68c0-7.2 4.5-13.6 11.3-16 62-21.8 81.5-76 84.3-117.1.8-11 6.5-16.3 16.1-16.3h70.9c5.5 0 10 4.5 10 10v115.2h83c5.5 0 10 4.4 10 9.9v81.7c0 5.5-4.5 10-10 10h-83.4V360c0 34.2 23.7 53.6 68 35.8 4.8-1.9 9-3.2 12.7-2.2 3.5.9 5.8 3.4 7.4 7.9l22 64.3c1.8 5 3.3 10.6-.4 14.5z\"]\n};\nvar faVaadin = {\n prefix: 'fab',\n iconName: 'vaadin',\n icon: [448, 512, [], \"f408\", \"M224.5 140.7c1.5-17.6 4.9-52.7 49.8-52.7h98.6c20.7 0 32.1-7.8 32.1-21.6V54.1c0-12.2 9.3-22.1 21.5-22.1S448 41.9 448 54.1v36.5c0 42.9-21.5 62-66.8 62H280.7c-30.1 0-33 14.7-33 27.1 0 1.3-.1 2.5-.2 3.7-.7 12.3-10.9 22.2-23.4 22.2s-22.7-9.8-23.4-22.2c-.1-1.2-.2-2.4-.2-3.7 0-12.3-3-27.1-33-27.1H66.8c-45.3 0-66.8-19.1-66.8-62V54.1C0 41.9 9.4 32 21.6 32s21.5 9.9 21.5 22.1v12.3C43.1 80.2 54.5 88 75.2 88h98.6c44.8 0 48.3 35.1 49.8 52.7h.9zM224 456c11.5 0 21.4-7 25.7-16.3 1.1-1.8 97.1-169.6 98.2-171.4 11.9-19.6-3.2-44.3-27.2-44.3-13.9 0-23.3 6.4-29.8 20.3L224 362l-66.9-117.7c-6.4-13.9-15.9-20.3-29.8-20.3-24 0-39.1 24.6-27.2 44.3 1.1 1.9 97.1 169.6 98.2 171.4 4.3 9.3 14.2 16.3 25.7 16.3z\"]\n};\nvar faQuora = {\n prefix: 'fab',\n iconName: 'quora',\n icon: [448, 512, [], \"f2c4\", \"M440.5 386.7h-29.3c-1.5 13.5-10.5 30.8-33 30.8-20.5 0-35.3-14.2-49.5-35.8 44.2-34.2 74.7-87.5 74.7-153C403.5 111.2 306.8 32 205 32 105.3 32 7.3 111.7 7.3 228.7c0 134.1 131.3 221.6 249 189C276 451.3 302 480 351.5 480c81.8 0 90.8-75.3 89-93.3zM297 329.2C277.5 300 253.3 277 205.5 277c-30.5 0-54.3 10-69 22.8l12.2 24.3c6.2-3 13-4 19.8-4 35.5 0 53.7 30.8 69.2 61.3-10 3-20.7 4.2-32.7 4.2-75 0-107.5-53-107.5-156.7C97.5 124.5 130 71 205 71c76.2 0 108.7 53.5 108.7 157.7.1 41.8-5.4 75.6-16.7 100.5z\"]\n};\nvar faReacteurope = {\n prefix: 'fab',\n iconName: 'reacteurope',\n icon: [576, 512, [], \"f75d\", \"M250.6 211.74l5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3-7.1-.1-2.3-6.8-2.3 6.8-7.2.1 5.7 4.3zm63.7 0l5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3-7.2-.1-2.3-6.8-2.3 6.8-7.2.1 5.7 4.3zm-91.3 50.5h-3.4c-4.8 0-3.8 4-3.8 12.1 0 4.7-2.3 6.1-5.8 6.1s-5.8-1.4-5.8-6.1v-36.6c0-4.7 2.3-6.1 5.8-6.1s5.8 1.4 5.8 6.1c0 7.2-.7 10.5 3.8 10.5h3.4c4.7-.1 3.8-3.9 3.8-12.3 0-9.9-6.7-14.1-16.8-14.1h-.2c-10.1 0-16.8 4.2-16.8 14.1V276c0 10.4 6.7 14.1 16.8 14.1h.2c10.1 0 16.8-3.8 16.8-14.1 0-9.86 1.1-13.76-3.8-13.76zm-80.7 17.4h-14.7v-19.3H139c2.5 0 3.8-1.3 3.8-3.8v-2.1c0-2.5-1.3-3.8-3.8-3.8h-11.4v-18.3H142c2.5 0 3.8-1.3 3.8-3.8v-2.1c0-2.5-1.3-3.8-3.8-3.8h-21.7c-2.4-.1-3.7 1.3-3.7 3.8v59.1c0 2.5 1.3 3.8 3.8 3.8h21.9c2.5 0 3.8-1.3 3.8-3.8v-2.1c0-2.5-1.3-3.8-3.8-3.8zm-42-18.5c4.6-2 7.3-6 7.3-12.4v-11.9c0-10.1-6.7-14.1-16.8-14.1H77.4c-2.5 0-3.8 1.3-3.8 3.8v59.1c0 2.5 1.3 3.8 3.8 3.8h3.4c2.5 0 3.8-1.3 3.8-3.8v-22.9h5.6l7.4 23.5a4.1 4.1 0 0 0 4.3 3.2h3.3c2.8 0 4-1.8 3.2-4.4zm-3.8-14c0 4.8-2.5 6.1-6.1 6.1h-5.8v-20.9h5.8c3.6 0 6.1 1.3 6.1 6.1zM176 226a3.82 3.82 0 0 0-4.2-3.4h-6.9a3.68 3.68 0 0 0-4 3.4l-11 59.2c-.5 2.7.9 4.1 3.4 4.1h3a3.74 3.74 0 0 0 4.1-3.5l1.8-11.3h12.2l1.8 11.3a3.74 3.74 0 0 0 4.1 3.5h3.5c2.6 0 3.9-1.4 3.4-4.1zm-12.3 39.3l4.7-29.7 4.7 29.7zm89.3 20.2v-53.2h7.5c2.5 0 3.8-1.3 3.8-3.8v-2.1c0-2.5-1.3-3.8-3.8-3.8h-25.8c-2.5 0-3.8 1.3-3.8 3.8v2.1c0 2.5 1.3 3.8 3.8 3.8h7.3v53.2c0 2.5 1.3 3.8 3.8 3.8h3.4c2.5.04 3.8-1.3 3.8-3.76zm248-.8h-19.4V258h16.1a1.89 1.89 0 0 0 2-2v-.8a1.89 1.89 0 0 0-2-2h-16.1v-25.8h19.1a1.89 1.89 0 0 0 2-2v-.8a1.77 1.77 0 0 0-2-1.9h-22.2a1.62 1.62 0 0 0-2 1.8v63a1.81 1.81 0 0 0 2 1.9H501a1.81 1.81 0 0 0 2-1.9v-.8a1.84 1.84 0 0 0-2-1.96zm-93.1-62.9h-.8c-10.1 0-15.3 4.7-15.3 14.1V276c0 9.3 5.2 14.1 15.3 14.1h.8c10.1 0 15.3-4.8 15.3-14.1v-40.1c0-9.36-5.2-14.06-15.3-14.06zm10.2 52.4c-.1 8-3 11.1-10.5 11.1s-10.5-3.1-10.5-11.1v-36.6c0-7.9 3-11.1 10.5-11.1s10.5 3.2 10.5 11.1zm-46.5-14.5c6.1-1.6 9.2-6.1 9.2-13.3v-9.7c0-9.4-5.2-14.1-15.3-14.1h-13.7a1.81 1.81 0 0 0-2 1.9v63a1.81 1.81 0 0 0 2 1.9h1.2a1.74 1.74 0 0 0 1.9-1.9v-26.9h11.6l10.4 27.2a2.32 2.32 0 0 0 2.3 1.5h1.5c1.4 0 2-1 1.5-2.3zm-6.4-3.9H355v-28.5h10.2c7.5 0 10.5 3.1 10.5 11.1v6.4c0 7.84-3 11.04-10.5 11.04zm85.9-33.1h-13.7a1.62 1.62 0 0 0-2 1.8v63a1.81 1.81 0 0 0 2 1.9h1.2a1.74 1.74 0 0 0 1.9-1.9v-26.1h10.6c10.1 0 15.3-4.8 15.3-14.1v-10.5c0-9.4-5.2-14.1-15.3-14.1zm10.2 22.8c0 7.9-3 11.1-10.5 11.1h-10.2v-29.2h10.2c7.5-.1 10.5 3.1 10.5 11zM259.5 308l-2.3-6.8-2.3 6.8-7.1.1 5.7 4.3-2.1 6.8 5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3zm227.6-136.1a364.42 364.42 0 0 0-35.6-11.3c19.6-78 11.6-134.7-22.3-153.9C394.7-12.66 343.3 11 291 61.94q5.1 4.95 10.2 10.2c82.5-80 119.6-53.5 120.9-52.8 22.4 12.7 36 55.8 15.5 137.8a587.83 587.83 0 0 0-84.6-13C281.1 43.64 212.4 2 170.8 2 140 2 127 23 123.2 29.74c-18.1 32-13.3 84.2.1 133.8-70.5 20.3-120.7 54.1-120.3 95 .5 59.6 103.2 87.8 122.1 92.8-20.5 81.9-10.1 135.6 22.3 153.9 28 15.8 75.1 6 138.2-55.2q-5.1-4.95-10.2-10.2c-82.5 80-119.7 53.5-120.9 52.8-22.3-12.6-36-55.6-15.5-137.9 12.4 2.9 41.8 9.5 84.6 13 71.9 100.4 140.6 142 182.1 142 30.8 0 43.8-21 47.6-27.7 18-31.9 13.3-84.1-.1-133.8 152.3-43.8 156.2-130.2 33.9-176.3zM135.9 36.84c2.9-5.1 11.9-20.3 34.9-20.3 36.8 0 98.8 39.6 163.3 126.2a714 714 0 0 0-93.9.9 547.76 547.76 0 0 1 42.2-52.4Q277.3 86 272.2 81a598.25 598.25 0 0 0-50.7 64.2 569.69 569.69 0 0 0-84.4 14.6c-.2-1.4-24.3-82.2-1.2-123zm304.8 438.3c-2.9 5.1-11.8 20.3-34.9 20.3-36.7 0-98.7-39.4-163.3-126.2a695.38 695.38 0 0 0 93.9-.9 547.76 547.76 0 0 1-42.2 52.4q5.1 5.25 10.2 10.2a588.47 588.47 0 0 0 50.7-64.2c47.3-4.7 80.3-13.5 84.4-14.6 22.7 84.4 4.5 117 1.2 123zm9.1-138.6c-3.6-11.9-7.7-24.1-12.4-36.4a12.67 12.67 0 0 1-10.7-5.7l-.1.1a19.61 19.61 0 0 1-5.4 3.6c5.7 14.3 10.6 28.4 14.7 42.2a535.3 535.3 0 0 1-72 13c3.5-5.3 17.2-26.2 32.2-54.2a24.6 24.6 0 0 1-6-3.2c-1.1 1.2-3.6 4.2-10.9 4.2-6.2 11.2-17.4 30.9-33.9 55.2a711.91 711.91 0 0 1-112.4 1c-7.9-11.2-21.5-31.1-36.8-57.8a21 21 0 0 1-3-1.5c-1.9 1.6-3.9 3.2-12.6 3.2 6.3 11.2 17.5 30.7 33.8 54.6a548.81 548.81 0 0 1-72.2-11.7q5.85-21 14.1-42.9c-3.2 0-5.4.2-8.4-1a17.58 17.58 0 0 1-6.9 1c-4.9 13.4-9.1 26.5-12.7 39.4C-31.7 297-12.1 216 126.7 175.64c3.6 11.9 7.7 24.1 12.4 36.4 10.4 0 12.9 3.4 14.4 5.3a12 12 0 0 1 2.3-2.2c-5.8-14.7-10.9-29.2-15.2-43.3 7-1.8 32.4-8.4 72-13-15.9 24.3-26.7 43.9-32.8 55.3a14.22 14.22 0 0 1 6.4 8 23.42 23.42 0 0 1 10.2-8.4c6.5-11.7 17.9-31.9 34.8-56.9a711.72 711.72 0 0 1 112.4-1c31.5 44.6 28.9 48.1 42.5 64.5a21.42 21.42 0 0 1 10.4-7.4c-6.4-11.4-17.6-31-34.3-55.5 40.4 4.1 65 10 72.2 11.7-4 14.4-8.9 29.2-14.6 44.2a20.74 20.74 0 0 1 6.8 4.3l.1.1a12.72 12.72 0 0 1 8.9-5.6c4.9-13.4 9.2-26.6 12.8-39.5a359.71 359.71 0 0 1 34.5 11c106.1 39.9 74 87.9 72.6 90.4-19.8 35.1-80.1 55.2-105.7 62.5zm-114.4-114h-1.2a1.74 1.74 0 0 0-1.9 1.9v49.8c0 7.9-2.6 11.1-10.1 11.1s-10.1-3.1-10.1-11.1v-49.8a1.69 1.69 0 0 0-1.9-1.9H309a1.81 1.81 0 0 0-2 1.9v51.5c0 9.6 5 14.1 15.1 14.1h.4c10.1 0 15.1-4.6 15.1-14.1v-51.5a2 2 0 0 0-2.2-1.9zM321.7 308l-2.3-6.8-2.3 6.8-7.1.1 5.7 4.3-2.1 6.8 5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3zm-31.1 7.4l-2.3-6.8-2.3 6.8-7.1.1 5.7 4.3-2.1 6.8 5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3zm5.1-30.8h-19.4v-26.7h16.1a1.89 1.89 0 0 0 2-2v-.8a1.89 1.89 0 0 0-2-2h-16.1v-25.8h19.1a1.89 1.89 0 0 0 2-2v-.8a1.77 1.77 0 0 0-2-1.9h-22.2a1.81 1.81 0 0 0-2 1.9v63a1.81 1.81 0 0 0 2 1.9h22.5a1.77 1.77 0 0 0 2-1.9v-.8a1.83 1.83 0 0 0-2-2.06zm-7.4-99.4L286 192l-7.1.1 5.7 4.3-2.1 6.8 5.8-4.1 5.8 4.1-2.1-6.8 5.7-4.3-7.1-.1z\"]\n};\nvar faMedium = {\n prefix: 'fab',\n iconName: 'medium',\n icon: [640, 512, [62407, \"medium-m\"], \"f23a\", \"M180.5,74.262C80.813,74.262,0,155.633,0,256S80.819,437.738,180.5,437.738,361,356.373,361,256,280.191,74.262,180.5,74.262Zm288.25,10.646c-49.845,0-90.245,76.619-90.245,171.095s40.406,171.1,90.251,171.1,90.251-76.619,90.251-171.1H559C559,161.5,518.6,84.908,468.752,84.908Zm139.506,17.821c-17.526,0-31.735,68.628-31.735,153.274s14.2,153.274,31.735,153.274S640,340.631,640,256C640,171.351,625.785,102.729,608.258,102.729Z\"]\n};\nvar faMediumM = faMedium;\nvar faAmilia = {\n prefix: 'fab',\n iconName: 'amilia',\n icon: [448, 512, [], \"f36d\", \"M240.1 32c-61.9 0-131.5 16.9-184.2 55.4-5.1 3.1-9.1 9.2-7.2 19.4 1.1 5.1 5.1 27.4 10.2 39.6 4.1 10.2 14.2 10.2 20.3 6.1 32.5-22.3 96.5-47.7 152.3-47.7 57.9 0 58.9 28.4 58.9 73.1v38.5C203 227.7 78.2 251 46.7 264.2 11.2 280.5 16.3 357.7 16.3 376s15.2 104 124.9 104c47.8 0 113.7-20.7 153.3-42.1v25.4c0 3 2.1 8.2 6.1 9.1 3.1 1 50.7 2 59.9 2s62.5.3 66.5-.7c4.1-1 5.1-6.1 5.1-9.1V168c-.1-80.3-57.9-136-192-136zm50.2 348c-21.4 13.2-48.7 24.4-79.1 24.4-52.8 0-58.9-33.5-59-44.7 0-12.2-3-42.7 18.3-52.9 24.3-13.2 75.1-29.4 119.8-33.5z\"]\n};\nvar faMixcloud = {\n prefix: 'fab',\n iconName: 'mixcloud',\n icon: [640, 512, [], \"f289\", \"M212.98 346.566H179.789V195.114L185.973 173.47H175.262L137.127 346.566H76.1069L37.7323 173.47H27.276L33.1913 195.114V346.566H0V165H65.6506L102.248 338.096H110.747L147.329 165H212.98L212.98 346.566ZM544.459 283.589L458.434 345.655V307.534L531.329 255.776L458.434 204.017V165.896L544.459 228.231H553.721L640 165.896V204.017L566.866 255.776L640 307.549V345.655L553.721 283.589H544.459ZM430.157 272.311H248.113V239.255H430.157V272.311Z\"]\n};\nvar faFlipboard = {\n prefix: 'fab',\n iconName: 'flipboard',\n icon: [448, 512, [], \"f44d\", \"M0 32v448h448V32H0zm358.4 179.2h-89.6v89.6h-89.6v89.6H89.6V121.6h268.8v89.6z\"]\n};\nvar faViacoin = {\n prefix: 'fab',\n iconName: 'viacoin',\n icon: [384, 512, [], \"f237\", \"M384 32h-64l-80.7 192h-94.5L64 32H0l48 112H0v48h68.5l13.8 32H0v48h102.8L192 480l89.2-208H384v-48h-82.3l13.8-32H384v-48h-48l48-112zM192 336l-27-64h54l-27 64z\"]\n};\nvar faCriticalRole = {\n prefix: 'fab',\n iconName: 'critical-role',\n icon: [448, 512, [], \"f6c9\", \"M225.82 0c.26.15 216.57 124.51 217.12 124.72 3 1.18 3.7 3.46 3.7 6.56q-.11 125.17 0 250.36a5.88 5.88 0 0 1-3.38 5.78c-21.37 12-207.86 118.29-218.93 124.58h-3C142 466.34 3.08 386.56 2.93 386.48a3.29 3.29 0 0 1-1.88-3.24c0-.87 0-225.94-.05-253.1a5 5 0 0 1 2.93-4.93C27.19 112.11 213.2 6 224.07 0zM215.4 20.42l-.22-.16Q118.06 75.55 21 130.87c0 .12.08.23.13.35l30.86 11.64c-7.71 6-8.32 6-10.65 5.13-.1 0-24.17-9.28-26.8-10v230.43c.88-1.41 64.07-110.91 64.13-111 1.62-2.82 3-1.92 9.12-1.52 1.4.09 1.48.22.78 1.42-41.19 71.33-36.4 63-67.48 116.94-.81 1.4-.61 1.13 1.25 1.13h186.5c1.44 0 1.69-.23 1.7-1.64v-8.88c0-1.34 2.36-.81-18.37-1-7.46-.07-14.14-3.22-21.38-12.7-7.38-9.66-14.62-19.43-21.85-29.21-2.28-3.08-3.45-2.38-16.76-2.38-1.75 0-1.78 0-1.76 1.82.29 26.21.15 25.27 1 32.66.52 4.37 2.16 4.2 9.69 4.81 3.14.26 3.88 4.08.52 4.92-1.57.39-31.6.51-33.67-.1a2.42 2.42 0 0 1 .3-4.73c3.29-.76 6.16.81 6.66-4.44 1.3-13.66 1.17-9 1.1-79.42 0-10.82-.35-12.58-5.36-13.55-1.22-.24-3.54-.16-4.69-.55-2.88-1-2-4.84 1.77-4.85 33.67 0 46.08-1.07 56.06 4.86 7.74 4.61 12 11.48 12.51 20.4.88 14.59-6.51 22.35-15 32.59a1.46 1.46 0 0 0 0 2.22c2.6 3.25 5 6.63 7.71 9.83 27.56 33.23 24.11 30.54 41.28 33.06.89.13 1-.42 1-1.15v-11c0-1 .32-1.43 1.41-1.26a72.37 72.37 0 0 0 23.58-.3c1.08-.15 1.5.2 1.48 1.33 0 .11.88 26.69.87 26.8-.05 1.52.67 1.62 1.89 1.62h186.71Q386.51 304.6 346 234.33c2.26-.66-.4 0 6.69-1.39 2-.39 2.05-.41 3.11 1.44 7.31 12.64 77.31 134 77.37 134.06V138c-1.72.5-103.3 38.72-105.76 39.68-1.08.42-1.55.2-1.91-.88-.63-1.9-1.34-3.76-2.09-5.62-.32-.79-.09-1.13.65-1.39.1 0 95.53-35.85 103-38.77-65.42-37.57-130.56-75-196-112.6l86.82 150.39-.28.33c-9.57-.9-10.46-1.6-11.8-3.94-1-1.69-73.5-127.71-82-142.16-9.1 14.67-83.56 146.21-85.37 146.32-2.93.17-5.88.08-9.25.08q43.25-74.74 86.18-149zm51.93 129.92a37.68 37.68 0 0 0 5.54-.85c1.69-.3 2.53.2 2.6 1.92 0 .11.07 19.06-.86 20.45s-1.88 1.22-2.6-.19c-5-9.69 6.22-9.66-39.12-12-.7 0-1 .23-1 .93 0 .13 3.72 122 3.73 122.11 0 .89.52 1.2 1.21 1.51a83.92 83.92 0 0 1 8.7 4.05c7.31 4.33 11.38 10.84 12.41 19.31 1.44 11.8-2.77 35.77-32.21 37.14-2.75.13-28.26 1.08-34.14-23.25-4.66-19.26 8.26-32.7 19.89-36.4a2.45 2.45 0 0 0 2-2.66c.1-5.63 3-107.1 3.71-121.35.05-1.08-.62-1.16-1.35-1.15-32.35.52-36.75-.34-40.22 8.52-2.42 6.18-4.14 1.32-3.95.23q1.59-9 3.31-18c.4-2.11 1.43-2.61 3.43-1.86 5.59 2.11 6.72 1.7 37.25 1.92 1.73 0 1.78-.08 1.82-1.85.68-27.49.58-22.59 1-29.55a2.69 2.69 0 0 0-1.63-2.8c-5.6-2.91-8.75-7.55-8.9-13.87-.35-14.81 17.72-21.67 27.38-11.51 6.84 7.19 5.8 18.91-2.45 24.15a4.35 4.35 0 0 0-2.22 4.34c0 .59-.11-4.31 1 30.05 0 .9.43 1.12 1.24 1.11.1 0 23-.09 34.47-.37zM68.27 141.7c19.84-4.51 32.68-.56 52.49 1.69 2.76.31 3.74 1.22 3.62 4-.21 5-1.16 22.33-1.24 23.15a2.65 2.65 0 0 1-1.63 2.34c-4.06 1.7-3.61-4.45-4-7.29-3.13-22.43-73.87-32.7-74.63 25.4-.31 23.92 17 53.63 54.08 50.88 27.24-2 19-20.19 24.84-20.47a2.72 2.72 0 0 1 3 3.36c-1.83 10.85-3.42 18.95-3.45 19.15-1.54 9.17-86.7 22.09-93.35-42.06-2.71-25.85 10.44-53.37 40.27-60.15zm80 87.67h-19.49a2.57 2.57 0 0 1-2.66-1.79c2.38-3.75 5.89.92 5.86-6.14-.08-25.75.21-38 .23-40.1 0-3.42-.53-4.65-3.32-4.94-7-.72-3.11-3.37-1.11-3.38 11.84-.1 22.62-.18 30.05.72 8.77 1.07 16.71 12.63 7.93 22.62-2 2.25-4 4.42-6.14 6.73.95 1.15 6.9 8.82 17.28 19.68 2.66 2.78 6.15 3.51 9.88 3.13a2.21 2.21 0 0 0 2.23-2.12c.3-3.42.26 4.73.45-40.58 0-5.65-.34-6.58-3.23-6.83-3.95-.35-4-2.26-.69-3.37l19.09-.09c.32 0 4.49.53 1 3.38 0 .05-.16 0-.24 0-3.61.26-3.94 1-4 4.62-.27 43.93.07 40.23.41 42.82.11.84.27 2.23 5.1 2.14 2.49 0 3.86 3.37 0 3.4-10.37.08-20.74 0-31.11.07-10.67 0-13.47-6.2-24.21-20.82-1.6-2.18-8.31-2.36-8.2-.37.88 16.47 0 17.78 4 17.67 4.75-.1 4.73 3.57.83 3.55zm275-10.15c-1.21 7.13.17 10.38-5.3 10.34-61.55-.42-47.82-.22-50.72-.31a18.4 18.4 0 0 1-3.63-.73c-2.53-.6 1.48-1.23-.38-5.6-1.43-3.37-2.78-6.78-4.11-10.19a1.94 1.94 0 0 0-2-1.44 138 138 0 0 0-14.58.07 2.23 2.23 0 0 0-1.62 1.06c-1.58 3.62-3.07 7.29-4.51 11-1.27 3.23 7.86 1.32 12.19 2.16 3 .57 4.53 3.72.66 3.73H322.9c-2.92 0-3.09-3.15-.74-3.21a6.3 6.3 0 0 0 5.92-3.47c1.5-3 2.8-6 4.11-9.09 18.18-42.14 17.06-40.17 18.42-41.61a1.83 1.83 0 0 1 3 0c2.93 3.34 18.4 44.71 23.62 51.92 2 2.7 5.74 2 6.36 2 3.61.13 4-1.11 4.13-4.29.09-1.87.08 1.17.07-41.24 0-4.46-2.36-3.74-5.55-4.27-.26 0-2.56-.63-.08-3.06.21-.2-.89-.24 21.7-.15 2.32 0 5.32 2.75-1.21 3.45a2.56 2.56 0 0 0-2.66 2.83c-.07 1.63-.19 38.89.29 41.21a3.06 3.06 0 0 0 3.23 2.43c13.25.43 14.92.44 16-3.41 1.67-5.78 4.13-2.52 3.73-.19zm-104.72 64.37c-4.24 0-4.42-3.39-.61-3.41 35.91-.16 28.11.38 37.19-.65 1.68-.19 2.38.24 2.25 1.89-.26 3.39-.64 6.78-1 10.16-.25 2.16-3.2 2.61-3.4-.15-.38-5.31-2.15-4.45-15.63-5.08-1.58-.07-1.64 0-1.64 1.52V304c0 1.65 0 1.6 1.62 1.47 3.12-.25 10.31.34 15.69-1.52.47-.16 3.3-1.79 3.07 1.76 0 .21-.76 10.35-1.18 11.39-.53 1.29-1.88 1.51-2.58.32-1.17-2 0-5.08-3.71-5.3-15.42-.9-12.91-2.55-12.91 6 0 12.25-.76 16.11 3.89 16.24 16.64.48 14.4 0 16.43-5.71.84-2.37 3.5-1.77 3.18.58-.44 3.21-.85 6.43-1.23 9.64 0 .36-.16 2.4-4.66 2.39-37.16-.08-34.54-.19-35.21-.31-2.72-.51-2.2-3 .22-3.45 1.1-.19 4 .54 4.16-2.56 2.44-56.22-.07-51.34-3.91-51.33zm-.41-109.52c2.46.61 3.13 1.76 2.95 4.65-.33 5.3-.34 9-.55 9.69-.66 2.23-3.15 2.12-3.34-.27-.38-4.81-3.05-7.82-7.57-9.15-26.28-7.73-32.81 15.46-27.17 30.22 5.88 15.41 22 15.92 28.86 13.78 5.92-1.85 5.88-6.5 6.91-7.58 1.23-1.3 2.25-1.84 3.12 1.1 0 .1.57 11.89-6 12.75-1.6.21-19.38 3.69-32.68-3.39-21-11.19-16.74-35.47-6.88-45.33 14-14.06 39.91-7.06 42.32-6.47zM289.8 280.14c3.28 0 3.66 3 .16 3.43-2.61.32-5-.42-5 5.46 0 2-.19 29.05.4 41.45.11 2.29 1.15 3.52 3.44 3.65 22 1.21 14.95-1.65 18.79-6.34 1.83-2.24 2.76.84 2.76 1.08.35 13.62-4 12.39-5.19 12.4l-38.16-.19c-1.93-.23-2.06-3-.42-3.38 2-.48 4.94.4 5.13-2.8 1-15.87.57-44.65.34-47.81-.27-3.77-2.8-3.27-5.68-3.71-2.47-.38-2-3.22.34-3.22 1.45-.02 17.97-.03 23.09-.02zm-31.63-57.79c.07 4.08 2.86 3.46 6 3.58 2.61.1 2.53 3.41-.07 3.43-6.48 0-13.7 0-21.61-.06-3.84 0-3.38-3.35 0-3.37 4.49 0 3.24 1.61 3.41-45.54 0-5.08-3.27-3.54-4.72-4.23-2.58-1.23-1.36-3.09.41-3.15 1.29 0 20.19-.41 21.17.21s1.87 1.65-.42 2.86c-1 .52-3.86-.28-4.15 2.47 0 .21-.82 1.63-.07 43.8zm-36.91 274.27a2.93 2.93 0 0 0 3.26 0c17-9.79 182-103.57 197.42-112.51-.14-.43 11.26-.18-181.52-.27-1.22 0-1.57.37-1.53 1.56 0 .1 1.25 44.51 1.22 50.38a28.33 28.33 0 0 1-1.36 7.71c-.55 1.83.38-.5-13.5 32.23-.73 1.72-1 2.21-2-.08-4.19-10.34-8.28-20.72-12.57-31a23.6 23.6 0 0 1-2-10.79c.16-2.46.8-16.12 1.51-48 0-1.95 0-2-2-2h-183c2.58 1.63 178.32 102.57 196 112.76zm-90.9-188.75c0 2.4.36 2.79 2.76 3 11.54 1.17 21 3.74 25.64-7.32 6-14.46 2.66-34.41-12.48-38.84-2-.59-16-2.76-15.94 1.51.05 8.04.01 11.61.02 41.65zm105.75-15.05c0 2.13 1.07 38.68 1.09 39.13.34 9.94-25.58 5.77-25.23-2.59.08-2 1.37-37.42 1.1-39.43-14.1 7.44-14.42 40.21 6.44 48.8a17.9 17.9 0 0 0 22.39-7.07c4.91-7.76 6.84-29.47-5.43-39a2.53 2.53 0 0 1-.36.12zm-12.28-198c-9.83 0-9.73 14.75-.07 14.87s10.1-14.88.07-14.91zm-80.15 103.83c0 1.8.41 2.4 2.17 2.58 13.62 1.39 12.51-11 12.16-13.36-1.69-11.22-14.38-10.2-14.35-7.81.05 4.5-.03 13.68.02 18.59zm212.32 6.4l-6.1-15.84c-2.16 5.48-4.16 10.57-6.23 15.84z\"]\n};\nvar faSitrox = {\n prefix: 'fab',\n iconName: 'sitrox',\n icon: [448, 512, [], \"e44a\", \"M212.439 0.00846128V0H448V128H64C64 57.6008 141.755 0.475338 212.439 0.00846128ZM237.256 192V192.007C307.135 192.475 384 249.6 384 320H210.809V319.995C140.915 319.563 64 262.424 64 192H237.256ZM235.565 511.993C306.251 511.521 384 454.399 384 384H0V512H235.565V511.993Z\"]\n};\nvar faDiscourse = {\n prefix: 'fab',\n iconName: 'discourse',\n icon: [448, 512, [], \"f393\", \"M225.9 32C103.3 32 0 130.5 0 252.1 0 256 .1 480 .1 480l225.8-.2c122.7 0 222.1-102.3 222.1-223.9C448 134.3 348.6 32 225.9 32zM224 384c-19.4 0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z\"]\n};\nvar faJoomla = {\n prefix: 'fab',\n iconName: 'joomla',\n icon: [448, 512, [], \"f1aa\", \"M.6 92.1C.6 58.8 27.4 32 60.4 32c30 0 54.5 21.9 59.2 50.2 32.6-7.6 67.1.6 96.5 30l-44.3 44.3c-20.5-20.5-42.6-16.3-55.4-3.5-14.3 14.3-14.3 37.9 0 52.2l99.5 99.5-44 44.3c-87.7-87.2-49.7-49.7-99.8-99.7-26.8-26.5-35-64.8-24.8-98.9C20.4 144.6.6 120.7.6 92.1zm129.5 116.4l44.3 44.3c10-10 89.7-89.7 99.7-99.8 14.3-14.3 37.6-14.3 51.9 0 12.8 12.8 17 35-3.5 55.4l44 44.3c31.2-31.2 38.5-67.6 28.9-101.2 29.2-4.1 51.9-29.2 51.9-59.5 0-33.2-26.8-60.1-59.8-60.1-30.3 0-55.4 22.5-59.5 51.6-33.8-9.9-71.7-1.5-98.3 25.1-18.3 19.1-71.1 71.5-99.6 99.9zm266.3 152.2c8.2-32.7-.9-68.5-26.3-93.9-11.8-12.2 5 4.7-99.5-99.7l-44.3 44.3 99.7 99.7c14.3 14.3 14.3 37.6 0 51.9-12.8 12.8-35 17-55.4-3.5l-44 44.3c27.6 30.2 68 38.8 102.7 28 5.5 27.4 29.7 48.1 58.9 48.1 33 0 59.8-26.8 59.8-60.1 0-30.2-22.5-55-51.6-59.1zm-84.3-53.1l-44-44.3c-87 86.4-50.4 50.4-99.7 99.8-14.3 14.3-37.6 14.3-51.9 0-13.1-13.4-16.9-35.3 3.2-55.4l-44-44.3c-30.2 30.2-38 65.2-29.5 98.3-26.7 6-46.2 29.9-46.2 58.2C0 453.2 26.8 480 59.8 480c28.6 0 52.5-19.8 58.6-46.7 32.7 8.2 68.5-.6 94.2-26 32.1-32 12.2-12.4 99.5-99.7z\"]\n};\nvar faMastodon = {\n prefix: 'fab',\n iconName: 'mastodon',\n icon: [448, 512, [], \"f4f6\", \"M433 179.11c0-97.2-63.71-125.7-63.71-125.7-62.52-28.7-228.56-28.4-290.48 0 0 0-63.72 28.5-63.72 125.7 0 115.7-6.6 259.4 105.63 289.1 40.51 10.7 75.32 13 103.33 11.4 50.81-2.8 79.32-18.1 79.32-18.1l-1.7-36.9s-36.31 11.4-77.12 10.1c-40.41-1.4-83-4.4-89.63-54a102.54 102.54 0 0 1-.9-13.9c85.63 20.9 158.65 9.1 178.75 6.7 56.12-6.7 105-41.3 111.23-72.9 9.8-49.8 9-121.5 9-121.5zm-75.12 125.2h-46.63v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.33V197c0-58.5-64-56.6-64-6.9v114.2H90.19c0-122.1-5.2-147.9 18.41-175 25.9-28.9 79.82-30.8 103.83 6.1l11.6 19.5 11.6-19.5c24.11-37.1 78.12-34.8 103.83-6.1 23.71 27.3 18.4 53 18.4 175z\"]\n};\nvar faAirbnb = {\n prefix: 'fab',\n iconName: 'airbnb',\n icon: [448, 512, [], \"f834\", \"M224 373.12c-25.24-31.67-40.08-59.43-45-83.18-22.55-88 112.61-88 90.06 0-5.45 24.25-20.29 52-45 83.18zm138.15 73.23c-42.06 18.31-83.67-10.88-119.3-50.47 103.9-130.07 46.11-200-18.85-200-54.92 0-85.16 46.51-73.28 100.5 6.93 29.19 25.23 62.39 54.43 99.5-32.53 36.05-60.55 52.69-85.15 54.92-50 7.43-89.11-41.06-71.3-91.09 15.1-39.16 111.72-231.18 115.87-241.56 15.75-30.07 25.56-57.4 59.38-57.4 32.34 0 43.4 25.94 60.37 59.87 36 70.62 89.35 177.48 114.84 239.09 13.17 33.07-1.37 71.29-37.01 86.64zm47-136.12C280.27 35.93 273.13 32 224 32c-45.52 0-64.87 31.67-84.66 72.79C33.18 317.1 22.89 347.19 22 349.81-3.22 419.14 48.74 480 111.63 480c21.71 0 60.61-6.06 112.37-62.4 58.68 63.78 101.26 62.4 112.37 62.4 62.89.05 114.85-60.86 89.61-130.19.02-3.89-16.82-38.9-16.82-39.58z\"]\n};\nvar faWolfPackBattalion = {\n prefix: 'fab',\n iconName: 'wolf-pack-battalion',\n icon: [512, 512, [], \"f514\", \"M267.73 471.53l10.56 15.84 5.28-12.32 5.28 7V512c21.06-7.92 21.11-66.86 25.51-97.21 4.62-31.89-.88-92.81 81.37-149.11-8.88-23.61-12-49.43-2.64-80.05C421 189 447 196.21 456.43 239.73l-30.35 8.36c11.15 23 17 46.76 13.2 72.14L412 313.18l-6.16 33.43-18.47-7-8.8 33.39-19.35-7 26.39 21.11 8.8-28.15L419 364.2l7-35.63 26.39 14.52c.25-20 7-58.06-8.8-84.45l26.39 5.28c4-22.07-2.38-39.21-7.92-56.74l22.43 9.68c-.44-25.07-29.94-56.79-61.58-58.5-20.22-1.09-56.74-25.17-54.1-51.9 2-19.87 17.45-42.62 43.11-49.7-44 36.51-9.68 67.3 5.28 73.46 4.4-11.44 17.54-69.08 0-130.2-40.39 22.87-89.65 65.1-93.2 147.79l-58 38.71-3.52 93.25L369.78 220l7 7-17.59 3.52-44 38.71-15.84-5.28-28.1 49.25-3.52 119.64 21.11 15.84-32.55 15.84-32.55-15.84 21.11-15.84-3.52-119.64-28.15-49.26-15.84 5.28-44-38.71-17.58-3.51 7-7 107.33 59.82-3.52-93.25-58.06-38.71C185 65.1 135.77 22.87 95.3 0c-17.54 61.12-4.4 118.76 0 130.2 15-6.16 49.26-36.95 5.28-73.46 25.66 7.08 41.15 29.83 43.11 49.7 2.63 26.74-33.88 50.81-54.1 51.9-31.65 1.72-61.15 33.44-61.59 58.51l22.43-9.68c-5.54 17.53-11.91 34.67-7.92 56.74l26.39-5.28c-15.76 26.39-9.05 64.43-8.8 84.45l26.39-14.52 7 35.63 24.63-5.28 8.8 28.15L153.35 366 134 373l-8.8-33.43-18.47 7-6.16-33.43-27.27 7c-3.82-25.38 2-49.1 13.2-72.14l-30.35-8.36c9.4-43.52 35.47-50.77 63.34-54.1 9.36 30.62 6.24 56.45-2.64 80.05 82.25 56.3 76.75 117.23 81.37 149.11 4.4 30.35 4.45 89.29 25.51 97.21v-29.83l5.28-7 5.28 12.32 10.56-15.84 11.44 21.11 11.43-21.1zm79.17-95L331.06 366c7.47-4.36 13.76-8.42 19.35-12.32-.6 7.22-.27 13.84-3.51 22.84zm28.15-49.26c-.4 10.94-.9 21.66-1.76 31.67-7.85-1.86-15.57-3.8-21.11-7 8.24-7.94 15.55-16.32 22.87-24.68zm24.63 5.28c0-13.43-2.05-24.21-5.28-33.43a235 235 0 0 1-18.47 27.27zm3.52-80.94c19.44 12.81 27.8 33.66 29.91 56.3-12.32-4.53-24.63-9.31-36.95-10.56 5.06-12 6.65-28.14 7-45.74zm-1.76-45.74c.81 14.3 1.84 28.82 1.76 42.23 19.22-8.11 29.78-9.72 44-14.08-10.61-18.96-27.2-25.53-45.76-28.16zM165.68 376.52L181.52 366c-7.47-4.36-13.76-8.42-19.35-12.32.6 7.26.27 13.88 3.51 22.88zm-28.15-49.26c.4 10.94.9 21.66 1.76 31.67 7.85-1.86 15.57-3.8 21.11-7-8.24-7.93-15.55-16.31-22.87-24.67zm-24.64 5.28c0-13.43 2-24.21 5.28-33.43a235 235 0 0 0 18.47 27.27zm-3.52-80.94c-19.44 12.81-27.8 33.66-29.91 56.3 12.32-4.53 24.63-9.31 37-10.56-5-12-6.65-28.14-7-45.74zm1.76-45.74c-.81 14.3-1.84 28.82-1.76 42.23-19.22-8.11-29.78-9.72-44-14.08 10.63-18.95 27.23-25.52 45.76-28.15z\"]\n};\nvar faBuyNLarge = {\n prefix: 'fab',\n iconName: 'buy-n-large',\n icon: [576, 512, [], \"f8a6\", \"M288 32C133.27 32 7.79 132.32 7.79 256S133.27 480 288 480s280.21-100.32 280.21-224S442.73 32 288 32zm-85.39 357.19L64.1 390.55l77.25-290.74h133.44c63.15 0 84.93 28.65 78 72.84a60.24 60.24 0 0 1-1.5 6.85 77.39 77.39 0 0 0-17.21-1.93c-42.35 0-76.69 33.88-76.69 75.65 0 37.14 27.14 68 62.93 74.45-18.24 37.16-56.16 60.92-117.71 61.52zM358 207.11h32l-22.16 90.31h-35.41l-11.19-35.63-7.83 35.63h-37.83l26.63-90.31h31.34l15 36.75zm145.86 182.08H306.79L322.63 328a78.8 78.8 0 0 0 11.47.83c42.34 0 76.69-33.87 76.69-75.65 0-32.65-21-60.46-50.38-71.06l21.33-82.35h92.5l-53.05 205.36h103.87zM211.7 269.39H187l-13.8 56.47h24.7c16.14 0 32.11-3.18 37.94-26.65 5.56-22.31-7.99-29.82-24.14-29.82zM233 170h-21.34L200 217.71h21.37c18 0 35.38-14.64 39.21-30.14C265.23 168.71 251.07 170 233 170z\"]\n};\nvar faGulp = {\n prefix: 'fab',\n iconName: 'gulp',\n icon: [256, 512, [], \"f3ae\", \"M209.8 391.1l-14.1 24.6-4.6 80.2c0 8.9-28.3 16.1-63.1 16.1s-63.1-7.2-63.1-16.1l-5.8-79.4-14.9-25.4c41.2 17.3 126 16.7 165.6 0zm-196-253.3l13.6 125.5c5.9-20 20.8-47 40-55.2 6.3-2.7 12.7-2.7 18.7.9 5.2 3 9.6 9.3 10.1 11.8 1.2 6.5-2 9.1-4.5 9.1-3 0-5.3-4.6-6.8-7.3-4.1-7.3-10.3-7.6-16.9-2.8-6.9 5-12.9 13.4-17.1 20.7-5.1 8.8-9.4 18.5-12 28.2-1.5 5.6-2.9 14.6-.6 19.9 1 2.2 2.5 3.6 4.9 3.6 5 0 12.3-6.6 15.8-10.1 4.5-4.5 10.3-11.5 12.5-16l5.2-15.5c2.6-6.8 9.9-5.6 9.9 0 0 10.2-3.7 13.6-10 34.7-5.8 19.5-7.6 25.8-7.6 25.8-.7 2.8-3.4 7.5-6.3 7.5-1.2 0-2.1-.4-2.6-1.2-1-1.4-.9-5.3-.8-6.3.2-3.2 6.3-22.2 7.3-25.2-2 2.2-4.1 4.4-6.4 6.6-5.4 5.1-14.1 11.8-21.5 11.8-3.4 0-5.6-.9-7.7-2.4l7.6 79.6c2 5 39.2 17.1 88.2 17.1 49.1 0 86.3-12.2 88.2-17.1l10.9-94.6c-5.7 5.2-12.3 11.6-19.6 14.8-5.4 2.3-17.4 3.8-17.4-5.7 0-5.2 9.1-14.8 14.4-21.5 1.4-1.7 4.7-5.9 4.7-8.1 0-2.9-6-2.2-11.7 2.5-3.2 2.7-6.2 6.3-8.7 9.7-4.3 6-6.6 11.2-8.5 15.5-6.2 14.2-4.1 8.6-9.1 22-5 13.3-4.2 11.8-5.2 14-.9 1.9-2.2 3.5-4 4.5-1.9 1-4.5.9-6.1-.3-.9-.6-1.3-1.9-1.3-3.7 0-.9.1-1.8.3-2.7 1.5-6.1 7.8-18.1 15-34.3 1.6-3.7 1-2.6.8-2.3-6.2 6-10.9 8.9-14.4 10.5-5.8 2.6-13 2.6-14.5-4.1-.1-.4-.1-.8-.2-1.2-11.8 9.2-24.3 11.7-20-8.1-4.6 8.2-12.6 14.9-22.4 14.9-4.1 0-7.1-1.4-8.6-5.1-2.3-5.5 1.3-14.9 4.6-23.8 1.7-4.5 4-9.9 7.1-16.2 1.6-3.4 4.2-5.4 7.6-4.5.6.2 1.1.4 1.6.7 2.6 1.8 1.6 4.5.3 7.2-3.8 7.5-7.1 13-9.3 20.8-.9 3.3-2 9 1.5 9 2.4 0 4.7-.8 6.9-2.4 4.6-3.4 8.3-8.5 11.1-13.5 2-3.6 4.4-8.3 5.6-12.3.5-1.7 1.1-3.3 1.8-4.8 1.1-2.5 2.6-5.1 5.2-5.1 1.3 0 2.4.5 3.2 1.5 1.7 2.2 1.3 4.5.4 6.9-2 5.6-4.7 10.6-6.9 16.7-1.3 3.5-2.7 8-2.7 11.7 0 3.4 3.7 2.6 6.8 1.2 2.4-1.1 4.8-2.8 6.8-4.5 1.2-4.9.9-3.8 26.4-68.2 1.3-3.3 3.7-4.7 6.1-4.7 1.2 0 2.2.4 3.2 1.1 1.7 1.3 1.7 4.1 1 6.2-.7 1.9-.6 1.3-4.5 10.5-5.2 12.1-8.6 20.8-13.2 31.9-1.9 4.6-7.7 18.9-8.7 22.3-.6 2.2-1.3 5.8 1 5.8 5.4 0 19.3-13.1 23.1-17 .2-.3.5-.4.9-.6.6-1.9 1.2-3.7 1.7-5.5 1.4-3.8 2.7-8.2 5.3-11.3.8-1 1.7-1.6 2.7-1.6 2.8 0 4.2 1.2 4.2 4 0 1.1-.7 5.1-1.1 6.2 1.4-1.5 2.9-3 4.5-4.5 15-13.9 25.7-6.8 25.7.2 0 7.4-8.9 17.7-13.8 23.4-1.6 1.9-4.9 5.4-5 6.4 0 1.3.9 1.8 2.2 1.8 2 0 6.4-3.5 8-4.7 5-3.9 11.8-9.9 16.6-14.1l14.8-136.8c-30.5 17.1-197.6 17.2-228.3.2zm229.7-8.5c0 21-231.2 21-231.2 0 0-8.8 51.8-15.9 115.6-15.9 9 0 17.8.1 26.3.4l12.6-48.7L228.1.6c1.4-1.4 5.8-.2 9.9 3.5s6.6 7.9 5.3 9.3l-.1.1L185.9 74l-10 40.7c39.9 2.6 67.6 8.1 67.6 14.6zm-69.4 4.6c0-.8-.9-1.5-2.5-2.1l-.2.8c0 1.3-5 2.4-11.1 2.4s-11.1-1.1-11.1-2.4c0-.1 0-.2.1-.3l.2-.7c-1.8.6-3 1.4-3 2.3 0 2.1 6.2 3.7 13.7 3.7 7.7.1 13.9-1.6 13.9-3.7z\"]\n};\nvar faCreativeCommonsSamplingPlus = {\n prefix: 'fab',\n iconName: 'creative-commons-sampling-plus',\n icon: [496, 512, [], \"f4f1\", \"M247.6 8C389.4 8 496 118.1 496 256c0 147.1-118.5 248-248.4 248C113.6 504 0 394.5 0 256 0 123.1 104.7 8 247.6 8zm.8 44.7C130.2 52.7 44.7 150.6 44.7 256c0 109.8 91.2 202.8 203.7 202.8 103.2 0 202.8-81.1 202.8-202.8.1-113.8-90.2-203.3-202.8-203.3zm107 205.6c-4.7 0-9 2.8-10.7 7.2l-4 9.5-11-92.8c-1.7-13.9-22-13.4-23.1.4l-4.3 51.4-5.2-68.8c-1.1-14.3-22.1-14.2-23.2 0l-3.5 44.9-5.9-94.3c-.9-14.5-22.3-14.4-23.2 0l-5.1 83.7-4.3-66.3c-.9-14.4-22.2-14.4-23.2 0l-5.3 80.2-4.1-57c-1.1-14.3-22-14.3-23.2-.2l-7.7 89.8-1.8-12.2c-1.7-11.4-17.1-13.6-22-3.3l-13.2 27.7H87.5v23.2h51.3c4.4 0 8.4-2.5 10.4-6.4l10.7 73.1c2 13.5 21.9 13 23.1-.7l3.8-43.6 5.7 78.3c1.1 14.4 22.3 14.2 23.2-.1l4.6-70.4 4.8 73.3c.9 14.4 22.3 14.4 23.2-.1l4.9-80.5 4.5 71.8c.9 14.3 22.1 14.5 23.2.2l4.6-58.6 4.9 64.4c1.1 14.3 22 14.2 23.1.1l6.8-83 2.7 22.3c1.4 11.8 17.7 14.1 22.3 3.1l18-43.4h50.5V258l-58.4.3zm-78 5.2h-21.9v21.9c0 4.1-3.3 7.5-7.5 7.5-4.1 0-7.5-3.3-7.5-7.5v-21.9h-21.9c-4.1 0-7.5-3.3-7.5-7.5 0-4.1 3.4-7.5 7.5-7.5h21.9v-21.9c0-4.1 3.4-7.5 7.5-7.5s7.5 3.3 7.5 7.5v21.9h21.9c4.1 0 7.5 3.3 7.5 7.5 0 4.1-3.4 7.5-7.5 7.5z\"]\n};\nvar faStrava = {\n prefix: 'fab',\n iconName: 'strava',\n icon: [384, 512, [], \"f428\", \"M158.4 0L7 292h89.2l62.2-116.1L220.1 292h88.5zm150.2 292l-43.9 88.2-44.6-88.2h-67.6l112.2 220 111.5-220z\"]\n};\nvar faEmber = {\n prefix: 'fab',\n iconName: 'ember',\n icon: [640, 512, [], \"f423\", \"M639.9 254.6c-1.1-10.7-10.7-6.8-10.7-6.8s-15.6 12.1-29.3 10.7c-13.7-1.3-9.4-32-9.4-32s3-28.1-5.1-30.4c-8.1-2.4-18 7.3-18 7.3s-12.4 13.7-18.3 31.2l-1.6.5s1.9-30.6-.3-37.6c-1.6-3.5-16.4-3.2-18.8 3s-14.2 49.2-15 67.2c0 0-23.1 19.6-43.3 22.8s-25-9.4-25-9.4 54.8-15.3 52.9-59.1-44.2-27.6-49-24c-4.6 3.5-29.4 18.4-36.6 59.7-.2 1.4-.7 7.5-.7 7.5s-21.2 14.2-33 18c0 0 33-55.6-7.3-80.9-11.4-6.8-21.3-.5-27.2 5.3 13.6-17.3 46.4-64.2 36.9-105.2-5.8-24.4-18-27.1-29.2-23.1-17 6.7-23.5 16.7-23.5 16.7s-22 32-27.1 79.5-12.6 105.1-12.6 105.1-10.5 10.2-20.2 10.7-5.4-28.7-5.4-28.7 7.5-44.6 7-52.1-1.1-11.6-9.9-14.2c-8.9-2.7-18.5 8.6-18.5 8.6s-25.5 38.7-27.7 44.6l-1.3 2.4-1.3-1.6s18-52.7.8-53.5-28.5 18.8-28.5 18.8-19.6 32.8-20.4 36.5l-1.3-1.6s8.1-38.2 6.4-47.6c-1.6-9.4-10.5-7.5-10.5-7.5s-11.3-1.3-14.2 5.9-13.7 55.3-15 70.7c0 0-28.2 20.2-46.8 20.4-18.5.3-16.7-11.8-16.7-11.8s68-23.3 49.4-69.2c-8.3-11.8-18-15.5-31.7-15.3-13.7.3-30.3 8.6-41.3 33.3-5.3 11.8-6.8 23-7.8 31.5 0 0-12.3 2.4-18.8-2.9s-10 0-10 0-11.2 14-.1 18.3 28.1 6.1 28.1 6.1c1.6 7.5 6.2 19.5 19.6 29.7 20.2 15.3 58.8-1.3 58.8-1.3l15.9-8.8s.5 14.6 12.1 16.7 16.4 1 36.5-47.9c11.8-25 12.6-23.6 12.6-23.6l1.3-.3s-9.1 46.8-5.6 59.7C187.7 319.4 203 318 203 318s8.3 2.4 15-21.2 19.6-49.9 19.6-49.9h1.6s-5.6 48.1 3 63.7 30.9 5.3 30.9 5.3 15.6-7.8 18-10.2c0 0 18.5 15.8 44.6 12.9 58.3-11.5 79.1-25.9 79.1-25.9s10 24.4 41.1 26.7c35.5 2.7 54.8-18.6 54.8-18.6s-.3 13.5 12.1 18.6 20.7-22.8 20.7-22.8l20.7-57.2h1.9s1.1 37.3 21.5 43.2 47-13.7 47-13.7 6.4-3.5 5.3-14.3zm-578 5.3c.8-32 21.8-45.9 29-39 7.3 7 4.6 22-9.1 31.4-13.7 9.5-19.9 7.6-19.9 7.6zm272.8-123.8s19.1-49.7 23.6-25.5-40 96.2-40 96.2c.5-16.2 16.4-70.7 16.4-70.7zm22.8 138.4c-12.6 33-43.3 19.6-43.3 19.6s-3.5-11.8 6.4-44.9 33.3-20.2 33.3-20.2 16.2 12.4 3.6 45.5zm84.6-14.6s-3-10.5 8.1-30.6c11-20.2 19.6-9.1 19.6-9.1s9.4 10.2-1.3 25.5-26.4 14.2-26.4 14.2z\"]\n};\nvar faCanadianMapleLeaf = {\n prefix: 'fab',\n iconName: 'canadian-maple-leaf',\n icon: [512, 512, [], \"f785\", \"M383.8 351.7c2.5-2.5 105.2-92.4 105.2-92.4l-17.5-7.5c-10-4.9-7.4-11.5-5-17.4 2.4-7.6 20.1-67.3 20.1-67.3s-47.7 10-57.7 12.5c-7.5 2.4-10-2.5-12.5-7.5s-15-32.4-15-32.4-52.6 59.9-55.1 62.3c-10 7.5-20.1 0-17.6-10 0-10 27.6-129.6 27.6-129.6s-30.1 17.4-40.1 22.4c-7.5 5-12.6 5-17.6-5C293.5 72.3 255.9 0 255.9 0s-37.5 72.3-42.5 79.8c-5 10-10 10-17.6 5-10-5-40.1-22.4-40.1-22.4S183.3 182 183.3 192c2.5 10-7.5 17.5-17.6 10-2.5-2.5-55.1-62.3-55.1-62.3S98.1 167 95.6 172s-5 9.9-12.5 7.5C73 177 25.4 167 25.4 167s17.6 59.7 20.1 67.3c2.4 6 5 12.5-5 17.4L23 259.3s102.6 89.9 105.2 92.4c5.1 5 10 7.5 5.1 22.5-5.1 15-10.1 35.1-10.1 35.1s95.2-20.1 105.3-22.6c8.7-.9 18.3 2.5 18.3 12.5S241 512 241 512h30s-5.8-102.7-5.8-112.8 9.5-13.4 18.4-12.5c10 2.5 105.2 22.6 105.2 22.6s-5-20.1-10-35.1 0-17.5 5-22.5z\"]\n};\nvar faTeamspeak = {\n prefix: 'fab',\n iconName: 'teamspeak',\n icon: [512, 512, [], \"f4f9\", \"M244.2 346.79c2.4-12.3-12-30-32.4-48.7-20.9-19.2-48.2-39.1-63.4-46.6-21.7-12-41.7-1.8-46.3 22.7-5 26.2 0 51.4 14.5 73.9 10.2 15.5 25.4 22.7 43.4 24 11.6.6 52.5 2.2 61.7-1 11.9-4.3 20.1-11.8 22.5-24.3zm205 20.8a5.22 5.22 0 0 0-8.3 2.4c-8 25.4-44.7 112.5-172.1 121.5-149.7 10.5 80.3 43.6 145.4-6.4 22.7-17.4 47.6-35 46.6-85.4-.4-10.1-4.9-26.69-11.6-32.1zm62-122.4c-.3-18.9-8.6-33.4-26-42.2-2.9-1.3-5-2.7-5.9-6.4A222.64 222.64 0 0 0 438.9 103c-1.1-1.5-3.5-3.2-2.2-5 8.5-11.5-.3-18-7-24.4Q321.4-31.11 177.4 13.09c-40.1 12.3-73.9 35.6-102 67.4-4 4.3-6.7 9.1-3 14.5 3 4 1.3 6.2-1 9.3C51.6 132 38.2 162.59 32.1 196c-.7 4.3-2.9 6-6.4 7.8-14.2 7-22.5 18.5-24.9 34L0 264.29v20.9c0 30.8 21 50.4 51.8 49 7.7-.3 11.7-4.3 12-11.5 2-77.5-2.4-95.4 3.7-125.8C92.1 72.39 234.3 5 345.3 65.39 411.4 102 445.7 159 447.6 234.79c.8 28.2 0 56.5 0 84.6 0 7 2.2 12.5 9.4 14.2 24.1 5 49.2-12 53.2-36.7 2.9-17.1 1-34.5 1-51.7zm-159.6 131.5c36.5 2.8 59.3-28.5 58.4-60.5-2.1-45.2-66.2-16.5-87.8-8-73.2 28.1-45 54.9-22.2 60.8z\"]\n};\nvar faPushed = {\n prefix: 'fab',\n iconName: 'pushed',\n icon: [432, 512, [], \"f3e1\", \"M407 111.9l-98.5-9 14-33.4c10.4-23.5-10.8-40.4-28.7-37L22.5 76.9c-15.1 2.7-26 18.3-21.4 36.6l105.1 348.3c6.5 21.3 36.7 24.2 47.7 7l35.3-80.8 235.2-231.3c16.4-16.8 4.3-42.9-17.4-44.8zM297.6 53.6c5.1-.7 7.5 2.5 5.2 7.4L286 100.9 108.6 84.6l189-31zM22.7 107.9c-3.1-5.1 1-10 6.1-9.1l248.7 22.7-96.9 230.7L22.7 107.9zM136 456.4c-2.6 4-7.9 3.1-9.4-1.2L43.5 179.7l127.7 197.6c-7 15-35.2 79.1-35.2 79.1zm272.8-314.5L210.1 337.3l89.7-213.7 106.4 9.7c4 1.1 5.7 5.3 2.6 8.6z\"]\n};\nvar faWordpressSimple = {\n prefix: 'fab',\n iconName: 'wordpress-simple',\n icon: [512, 512, [], \"f411\", \"M256 8C119.3 8 8 119.2 8 256c0 136.7 111.3 248 248 248s248-111.3 248-248C504 119.2 392.7 8 256 8zM33 256c0-32.3 6.9-63 19.3-90.7l106.4 291.4C84.3 420.5 33 344.2 33 256zm223 223c-21.9 0-43-3.2-63-9.1l66.9-194.4 68.5 187.8c.5 1.1 1 2.1 1.6 3.1-23.1 8.1-48 12.6-74 12.6zm30.7-327.5c13.4-.7 25.5-2.1 25.5-2.1 12-1.4 10.6-19.1-1.4-18.4 0 0-36.1 2.8-59.4 2.8-21.9 0-58.7-2.8-58.7-2.8-12-.7-13.4 17.7-1.4 18.4 0 0 11.4 1.4 23.4 2.1l34.7 95.2L200.6 393l-81.2-241.5c13.4-.7 25.5-2.1 25.5-2.1 12-1.4 10.6-19.1-1.4-18.4 0 0-36.1 2.8-59.4 2.8-4.2 0-9.1-.1-14.4-.3C109.6 73 178.1 33 256 33c58 0 110.9 22.2 150.6 58.5-1-.1-1.9-.2-2.9-.2-21.9 0-37.4 19.1-37.4 39.6 0 18.4 10.6 33.9 21.9 52.3 8.5 14.8 18.4 33.9 18.4 61.5 0 19.1-7.3 41.2-17 72.1l-22.2 74.3-80.7-239.6zm81.4 297.2l68.1-196.9c12.7-31.8 17-57.2 17-79.9 0-8.2-.5-15.8-1.5-22.9 17.4 31.8 27.3 68.2 27.3 107 0 82.3-44.6 154.1-110.9 192.7z\"]\n};\nvar faNutritionix = {\n prefix: 'fab',\n iconName: 'nutritionix',\n icon: [400, 512, [], \"f3d6\", \"M88 8.1S221.4-.1 209 112.5c0 0 19.1-74.9 103-40.6 0 0-17.7 74-88 56 0 0 14.6-54.6 66.1-56.6 0 0-39.9-10.3-82.1 48.8 0 0-19.8-94.5-93.6-99.7 0 0 75.2 19.4 77.6 107.5 0 .1-106.4 7-104-119.8zm312 315.6c0 48.5-9.7 95.3-32 132.3-42.2 30.9-105 48-168 48-62.9 0-125.8-17.1-168-48C9.7 419 0 372.2 0 323.7 0 275.3 17.7 229 40 192c42.2-30.9 97.1-48.6 160-48.6 63 0 117.8 17.6 160 48.6 22.3 37 40 83.3 40 131.7zM120 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM192 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM264 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zM336 428c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm0-66.2c0-15.5-12.5-28-28-28s-28 12.5-28 28 12.5 28 28 28 28-12.5 28-28zm24-39.6c-4.8-22.3-7.4-36.9-16-56-38.8-19.9-90.5-32-144-32S94.8 180.1 56 200c-8.8 19.5-11.2 33.9-16 56 42.2-7.9 98.7-14.8 160-14.8s117.8 6.9 160 14.8z\"]\n};\nvar faWodu = {\n prefix: 'fab',\n iconName: 'wodu',\n icon: [640, 512, [], \"e088\", \"M178.414 339.706H141.1L112.166 223.475h-.478L83.228 339.706H45.2L0 168.946H37.548L64.574 285.177h.478L94.707 168.946h35.157l29.178 117.667h.479L187.5 168.946h36.831zM271.4 212.713c38.984 0 64.1 25.828 64.1 65.291 0 39.222-25.111 65.05-64.1 65.05-38.743 0-63.855-25.828-63.855-65.05C207.547 238.541 232.659 212.713 271.4 212.713zm0 104.753c23.2 0 30.133-19.852 30.133-39.462 0-19.852-6.934-39.7-30.133-39.7-27.7 0-29.894 19.85-29.894 39.7C241.508 297.614 248.443 317.466 271.4 317.466zM435.084 323.922h-.478c-7.893 13.392-21.765 19.132-37.548 19.132-37.31 0-55.485-32.045-55.485-66.246 0-33.243 18.415-64.095 54.767-64.095 14.589 0 28.938 6.218 36.831 18.416h.24V168.946h33.96v170.76H435.084zM405.428 238.3c-22.24 0-29.894 19.134-29.894 39.463 0 19.371 8.848 39.7 29.894 39.7 22.482 0 29.178-19.613 29.178-39.94C434.606 257.436 427.432 238.3 405.428 238.3zM592.96 339.706H560.673V322.487h-.718c-8.609 13.87-23.436 20.567-37.786 20.567-36.113 0-45.2-20.328-45.2-50.941V216.061h33.959V285.9c0 20.329 5.979 30.372 21.765 30.372 18.415 0 26.306-10.283 26.306-35.393V216.061H592.96zM602.453 302.876H640v36.83H602.453z\"]\n};\nvar faGooglePay = {\n prefix: 'fab',\n iconName: 'google-pay',\n icon: [640, 512, [], \"e079\", \"M105.72,215v41.25h57.1a49.66,49.66,0,0,1-21.14,32.6c-9.54,6.55-21.72,10.28-36,10.28-27.6,0-50.93-18.91-59.3-44.22a65.61,65.61,0,0,1,0-41l0,0c8.37-25.46,31.7-44.37,59.3-44.37a56.43,56.43,0,0,1,40.51,16.08L176.47,155a101.24,101.24,0,0,0-70.75-27.84,105.55,105.55,0,0,0-94.38,59.11,107.64,107.64,0,0,0,0,96.18v.15a105.41,105.41,0,0,0,94.38,59c28.47,0,52.55-9.53,70-25.91,20-18.61,31.41-46.15,31.41-78.91A133.76,133.76,0,0,0,205.38,215Zm389.41-4c-10.13-9.38-23.93-14.14-41.39-14.14-22.46,0-39.34,8.34-50.5,24.86l20.85,13.26q11.45-17,31.26-17a34.05,34.05,0,0,1,22.75,8.79A28.14,28.14,0,0,1,487.79,248v5.51c-9.1-5.07-20.55-7.75-34.64-7.75-16.44,0-29.65,3.88-39.49,11.77s-14.82,18.31-14.82,31.56a39.74,39.74,0,0,0,13.94,31.27c9.25,8.34,21,12.51,34.79,12.51,16.29,0,29.21-7.3,39-21.89h1v17.72h22.61V250C510.25,233.45,505.26,220.34,495.13,211ZM475.9,300.3a37.32,37.32,0,0,1-26.57,11.16A28.61,28.61,0,0,1,431,305.21a19.41,19.41,0,0,1-7.77-15.63c0-7,3.22-12.81,9.54-17.42s14.53-7,24.07-7C470,265,480.3,268,487.64,273.94,487.64,284.07,483.68,292.85,475.9,300.3Zm-93.65-142A55.71,55.71,0,0,0,341.74,142H279.07V328.74H302.7V253.1h39c16,0,29.5-5.36,40.51-15.93.88-.89,1.76-1.79,2.65-2.68A54.45,54.45,0,0,0,382.25,158.26Zm-16.58,62.23a30.65,30.65,0,0,1-23.34,9.68H302.7V165h39.63a32,32,0,0,1,22.6,9.23A33.18,33.18,0,0,1,365.67,220.49ZM614.31,201,577.77,292.7h-.45L539.9,201H514.21L566,320.55l-29.35,64.32H561L640,201Z\"]\n};\nvar faIntercom = {\n prefix: 'fab',\n iconName: 'intercom',\n icon: [448, 512, [], \"f7af\", \"M392 32H56C25.1 32 0 57.1 0 88v336c0 30.9 25.1 56 56 56h336c30.9 0 56-25.1 56-56V88c0-30.9-25.1-56-56-56zm-108.3 82.1c0-19.8 29.9-19.8 29.9 0v199.5c0 19.8-29.9 19.8-29.9 0V114.1zm-74.6-7.5c0-19.8 29.9-19.8 29.9 0v216.5c0 19.8-29.9 19.8-29.9 0V106.6zm-74.7 7.5c0-19.8 29.9-19.8 29.9 0v199.5c0 19.8-29.9 19.8-29.9 0V114.1zM59.7 144c0-19.8 29.9-19.8 29.9 0v134.3c0 19.8-29.9 19.8-29.9 0V144zm323.4 227.8c-72.8 63-241.7 65.4-318.1 0-15-12.8 4.4-35.5 19.4-22.7 65.9 55.3 216.1 53.9 279.3 0 14.9-12.9 34.3 9.8 19.4 22.7zm5.2-93.5c0 19.8-29.9 19.8-29.9 0V144c0-19.8 29.9-19.8 29.9 0v134.3z\"]\n};\nvar faZhihu = {\n prefix: 'fab',\n iconName: 'zhihu',\n icon: [640, 512, [], \"f63f\", \"M170.54 148.13v217.54l23.43.01 7.71 26.37 42.01-26.37h49.53V148.13H170.54zm97.75 193.93h-27.94l-27.9 17.51-5.08-17.47-11.9-.04V171.75h72.82v170.31zm-118.46-94.39H97.5c1.74-27.1 2.2-51.59 2.2-73.46h51.16s1.97-22.56-8.58-22.31h-88.5c3.49-13.12 7.87-26.66 13.12-40.67 0 0-24.07 0-32.27 21.57-3.39 8.9-13.21 43.14-30.7 78.12 5.89-.64 25.37-1.18 36.84-22.21 2.11-5.89 2.51-6.66 5.14-14.53h28.87c0 10.5-1.2 66.88-1.68 73.44H20.83c-11.74 0-15.56 23.62-15.56 23.62h65.58C66.45 321.1 42.83 363.12 0 396.34c20.49 5.85 40.91-.93 51-9.9 0 0 22.98-20.9 35.59-69.25l53.96 64.94s7.91-26.89-1.24-39.99c-7.58-8.92-28.06-33.06-36.79-41.81L87.9 311.95c4.36-13.98 6.99-27.55 7.87-40.67h61.65s-.09-23.62-7.59-23.62v.01zm412.02-1.6c20.83-25.64 44.98-58.57 44.98-58.57s-18.65-14.8-27.38-4.06c-6 8.15-36.83 48.2-36.83 48.2l19.23 14.43zm-150.09-59.09c-9.01-8.25-25.91 2.13-25.91 2.13s39.52 55.04 41.12 57.45l19.46-13.73s-25.67-37.61-34.66-45.86h-.01zM640 258.35c-19.78 0-130.91.93-131.06.93v-101c4.81 0 12.42-.4 22.85-1.2 40.88-2.41 70.13-4 87.77-4.81 0 0 12.22-27.19-.59-33.44-3.07-1.18-23.17 4.58-23.17 4.58s-165.22 16.49-232.36 18.05c1.6 8.82 7.62 17.08 15.78 19.55 13.31 3.48 22.69 1.7 49.15.89 24.83-1.6 43.68-2.43 56.51-2.43v99.81H351.41s2.82 22.31 25.51 22.85h107.94v70.92c0 13.97-11.19 21.99-24.48 21.12-14.08.11-26.08-1.15-41.69-1.81 1.99 3.97 6.33 14.39 19.31 21.84 9.88 4.81 16.17 6.57 26.02 6.57 29.56 0 45.67-17.28 44.89-45.31v-73.32h122.36c9.68 0 8.7-23.78 8.7-23.78l.03-.01z\"]\n};\nvar faKorvue = {\n prefix: 'fab',\n iconName: 'korvue',\n icon: [446, 512, [], \"f42f\", \"M386.5 34h-327C26.8 34 0 60.8 0 93.5v327.1C0 453.2 26.8 480 59.5 480h327.1c33 0 59.5-26.8 59.5-59.5v-327C446 60.8 419.2 34 386.5 34zM87.1 120.8h96v116l61.8-116h110.9l-81.2 132H87.1v-132zm161.8 272.1l-65.7-113.6v113.6h-96V262.1h191.5l88.6 130.8H248.9z\"]\n};\nvar faPix = {\n prefix: 'fab',\n iconName: 'pix',\n icon: [512, 512, [], \"e43a\", \"M242.4 292.5C247.8 287.1 257.1 287.1 262.5 292.5L339.5 369.5C353.7 383.7 372.6 391.5 392.6 391.5H407.7L310.6 488.6C280.3 518.1 231.1 518.1 200.8 488.6L103.3 391.2H112.6C132.6 391.2 151.5 383.4 165.7 369.2L242.4 292.5zM262.5 218.9C256.1 224.4 247.9 224.5 242.4 218.9L165.7 142.2C151.5 127.1 132.6 120.2 112.6 120.2H103.3L200.7 22.76C231.1-7.586 280.3-7.586 310.6 22.76L407.8 119.9H392.6C372.6 119.9 353.7 127.7 339.5 141.9L262.5 218.9zM112.6 142.7C126.4 142.7 139.1 148.3 149.7 158.1L226.4 234.8C233.6 241.1 243 245.6 252.5 245.6C261.9 245.6 271.3 241.1 278.5 234.8L355.5 157.8C365.3 148.1 378.8 142.5 392.6 142.5H430.3L488.6 200.8C518.9 231.1 518.9 280.3 488.6 310.6L430.3 368.9H392.6C378.8 368.9 365.3 363.3 355.5 353.5L278.5 276.5C264.6 262.6 240.3 262.6 226.4 276.6L149.7 353.2C139.1 363 126.4 368.6 112.6 368.6H80.78L22.76 310.6C-7.586 280.3-7.586 231.1 22.76 200.8L80.78 142.7H112.6z\"]\n};\nvar faSteamSymbol = {\n prefix: 'fab',\n iconName: 'steam-symbol',\n icon: [448, 512, [], \"f3f6\", \"M395.5 177.5c0 33.8-27.5 61-61 61-33.8 0-61-27.3-61-61s27.3-61 61-61c33.5 0 61 27.2 61 61zm52.5.2c0 63-51 113.8-113.7 113.8L225 371.3c-4 43-40.5 76.8-84.5 76.8-40.5 0-74.7-28.8-83-67L0 358V250.7L97.2 290c15.1-9.2 32.2-13.3 52-11.5l71-101.7c.5-62.3 51.5-112.8 114-112.8C397 64 448 115 448 177.7zM203 363c0-34.7-27.8-62.5-62.5-62.5-4.5 0-9 .5-13.5 1.5l26 10.5c25.5 10.2 38 39 27.7 64.5-10.2 25.5-39.2 38-64.7 27.5-10.2-4-20.5-8.3-30.7-12.2 10.5 19.7 31.2 33.2 55.2 33.2 34.7 0 62.5-27.8 62.5-62.5zm207.5-185.3c0-42-34.3-76.2-76.2-76.2-42.3 0-76.5 34.2-76.5 76.2 0 42.2 34.3 76.2 76.5 76.2 41.9.1 76.2-33.9 76.2-76.2z\"]\n};\nvar icons = {\n faMonero: faMonero,\n faHooli: faHooli,\n faYelp: faYelp,\n faCcVisa: faCcVisa,\n faLastfm: faLastfm,\n faShopware: faShopware,\n faCreativeCommonsNc: faCreativeCommonsNc,\n faAws: faAws,\n faRedhat: faRedhat,\n faYoast: faYoast,\n faCloudflare: faCloudflare,\n faUps: faUps,\n faWpexplorer: faWpexplorer,\n faDyalog: faDyalog,\n faBity: faBity,\n faStackpath: faStackpath,\n faBuysellads: faBuysellads,\n faFirstOrder: faFirstOrder,\n faModx: faModx,\n faGuilded: faGuilded,\n faVnv: faVnv,\n faSquareJs: faSquareJs,\n faJsSquare: faJsSquare,\n faMicrosoft: faMicrosoft,\n faQq: faQq,\n faOrcid: faOrcid,\n faJava: faJava,\n faInvision: faInvision,\n faCreativeCommonsPdAlt: faCreativeCommonsPdAlt,\n faCentercode: faCentercode,\n faGlideG: faGlideG,\n faDrupal: faDrupal,\n faHireAHelper: faHireAHelper,\n faCreativeCommonsBy: faCreativeCommonsBy,\n faUnity: faUnity,\n faWhmcs: faWhmcs,\n faRocketchat: faRocketchat,\n faVk: faVk,\n faUntappd: faUntappd,\n faMailchimp: faMailchimp,\n faCss3Alt: faCss3Alt,\n faSquareReddit: faSquareReddit,\n faRedditSquare: faRedditSquare,\n faVimeoV: faVimeoV,\n faContao: faContao,\n faSquareFontAwesome: faSquareFontAwesome,\n faDeskpro: faDeskpro,\n faSistrix: faSistrix,\n faSquareInstagram: faSquareInstagram,\n faInstagramSquare: faInstagramSquare,\n faBattleNet: faBattleNet,\n faTheRedYeti: faTheRedYeti,\n faSquareHackerNews: faSquareHackerNews,\n faHackerNewsSquare: faHackerNewsSquare,\n faEdge: faEdge,\n faNapster: faNapster,\n faSquareSnapchat: faSquareSnapchat,\n faSnapchatSquare: faSnapchatSquare,\n faGooglePlusG: faGooglePlusG,\n faArtstation: faArtstation,\n faMarkdown: faMarkdown,\n faSourcetree: faSourcetree,\n faGooglePlus: faGooglePlus,\n faDiaspora: faDiaspora,\n faFoursquare: faFoursquare,\n faStackOverflow: faStackOverflow,\n faGithubAlt: faGithubAlt,\n faPhoenixSquadron: faPhoenixSquadron,\n faPagelines: faPagelines,\n faAlgolia: faAlgolia,\n faRedRiver: faRedRiver,\n faCreativeCommonsSa: faCreativeCommonsSa,\n faSafari: faSafari,\n faGoogle: faGoogle,\n faSquareFontAwesomeStroke: faSquareFontAwesomeStroke,\n faFontAwesomeAlt: faFontAwesomeAlt,\n faAtlassian: faAtlassian,\n faLinkedinIn: faLinkedinIn,\n faDigitalOcean: faDigitalOcean,\n faNimblr: faNimblr,\n faChromecast: faChromecast,\n faEvernote: faEvernote,\n faHackerNews: faHackerNews,\n faCreativeCommonsSampling: faCreativeCommonsSampling,\n faAdversal: faAdversal,\n faCreativeCommons: faCreativeCommons,\n faWatchmanMonitoring: faWatchmanMonitoring,\n faFonticons: faFonticons,\n faWeixin: faWeixin,\n faShirtsinbulk: faShirtsinbulk,\n faCodepen: faCodepen,\n faGitAlt: faGitAlt,\n faLyft: faLyft,\n faRev: faRev,\n faWindows: faWindows,\n faWizardsOfTheCoast: faWizardsOfTheCoast,\n faSquareViadeo: faSquareViadeo,\n faViadeoSquare: faViadeoSquare,\n faMeetup: faMeetup,\n faCentos: faCentos,\n faAdn: faAdn,\n faCloudsmith: faCloudsmith,\n faPiedPiperAlt: faPiedPiperAlt,\n faSquareDribbble: faSquareDribbble,\n faDribbbleSquare: faDribbbleSquare,\n faCodiepie: faCodiepie,\n faNode: faNode,\n faMix: faMix,\n faSteam: faSteam,\n faCcApplePay: faCcApplePay,\n faScribd: faScribd,\n faOpenid: faOpenid,\n faInstalod: faInstalod,\n faExpeditedssl: faExpeditedssl,\n faSellcast: faSellcast,\n faSquareTwitter: faSquareTwitter,\n faTwitterSquare: faTwitterSquare,\n faRProject: faRProject,\n faDelicious: faDelicious,\n faFreebsd: faFreebsd,\n faVuejs: faVuejs,\n faAccusoft: faAccusoft,\n faIoxhost: faIoxhost,\n faFonticonsFi: faFonticonsFi,\n faAppStore: faAppStore,\n faCcMastercard: faCcMastercard,\n faItunesNote: faItunesNote,\n faGolang: faGolang,\n faKickstarter: faKickstarter,\n faGrav: faGrav,\n faWeibo: faWeibo,\n faUncharted: faUncharted,\n faFirstdraft: faFirstdraft,\n faSquareYoutube: faSquareYoutube,\n faYoutubeSquare: faYoutubeSquare,\n faWikipediaW: faWikipediaW,\n faWpressr: faWpressr,\n faRendact: faRendact,\n faAngellist: faAngellist,\n faGalacticRepublic: faGalacticRepublic,\n faNfcDirectional: faNfcDirectional,\n faSkype: faSkype,\n faJoget: faJoget,\n faFedora: faFedora,\n faStripeS: faStripeS,\n faMeta: faMeta,\n faLaravel: faLaravel,\n faHotjar: faHotjar,\n faBluetoothB: faBluetoothB,\n faStickerMule: faStickerMule,\n faCreativeCommonsZero: faCreativeCommonsZero,\n faHips: faHips,\n faBehance: faBehance,\n faReddit: faReddit,\n faDiscord: faDiscord,\n faChrome: faChrome,\n faAppStoreIos: faAppStoreIos,\n faCcDiscover: faCcDiscover,\n faWpbeginner: faWpbeginner,\n faConfluence: faConfluence,\n faMdb: faMdb,\n faDochub: faDochub,\n faAccessibleIcon: faAccessibleIcon,\n faEbay: faEbay,\n faAmazon: faAmazon,\n faUnsplash: faUnsplash,\n faYarn: faYarn,\n faSquareSteam: faSquareSteam,\n faSteamSquare: faSteamSquare,\n fa500px: fa500px,\n faSquareVimeo: faSquareVimeo,\n faVimeoSquare: faVimeoSquare,\n faAsymmetrik: faAsymmetrik,\n faFontAwesome: faFontAwesome,\n faFontAwesomeFlag: faFontAwesomeFlag,\n faFontAwesomeLogoFull: faFontAwesomeLogoFull,\n faGratipay: faGratipay,\n faApple: faApple,\n faHive: faHive,\n faGitkraken: faGitkraken,\n faKeybase: faKeybase,\n faApplePay: faApplePay,\n faPadlet: faPadlet,\n faAmazonPay: faAmazonPay,\n faSquareGithub: faSquareGithub,\n faGithubSquare: faGithubSquare,\n faStumbleupon: faStumbleupon,\n faFedex: faFedex,\n faPhoenixFramework: faPhoenixFramework,\n faShopify: faShopify,\n faNeos: faNeos,\n faHackerrank: faHackerrank,\n faResearchgate: faResearchgate,\n faSwift: faSwift,\n faAngular: faAngular,\n faSpeakap: faSpeakap,\n faAngrycreative: faAngrycreative,\n faYCombinator: faYCombinator,\n faEmpire: faEmpire,\n faEnvira: faEnvira,\n faSquareGitlab: faSquareGitlab,\n faGitlabSquare: faGitlabSquare,\n faStudiovinari: faStudiovinari,\n faPiedPiper: faPiedPiper,\n faWordpress: faWordpress,\n faProductHunt: faProductHunt,\n faFirefox: faFirefox,\n faLinode: faLinode,\n faGoodreads: faGoodreads,\n faSquareOdnoklassniki: faSquareOdnoklassniki,\n faOdnoklassnikiSquare: faOdnoklassnikiSquare,\n faJsfiddle: faJsfiddle,\n faSith: faSith,\n faThemeisle: faThemeisle,\n faPage4: faPage4,\n faHashnode: faHashnode,\n faReact: faReact,\n faCcPaypal: faCcPaypal,\n faSquarespace: faSquarespace,\n faCcStripe: faCcStripe,\n faCreativeCommonsShare: faCreativeCommonsShare,\n faBitcoin: faBitcoin,\n faKeycdn: faKeycdn,\n faOpera: faOpera,\n faItchIo: faItchIo,\n faUmbraco: faUmbraco,\n faGalacticSenate: faGalacticSenate,\n faUbuntu: faUbuntu,\n faDraft2digital: faDraft2digital,\n faStripe: faStripe,\n faHouzz: faHouzz,\n faGg: faGg,\n faDhl: faDhl,\n faSquarePinterest: faSquarePinterest,\n faPinterestSquare: faPinterestSquare,\n faXing: faXing,\n faBlackberry: faBlackberry,\n faCreativeCommonsPd: faCreativeCommonsPd,\n faPlaystation: faPlaystation,\n faQuinscape: faQuinscape,\n faLess: faLess,\n faBloggerB: faBloggerB,\n faOpencart: faOpencart,\n faVine: faVine,\n faPaypal: faPaypal,\n faGitlab: faGitlab,\n faTypo3: faTypo3,\n faRedditAlien: faRedditAlien,\n faYahoo: faYahoo,\n faDailymotion: faDailymotion,\n faAffiliatetheme: faAffiliatetheme,\n faPiedPiperPp: faPiedPiperPp,\n faBootstrap: faBootstrap,\n faOdnoklassniki: faOdnoklassniki,\n faNfcSymbol: faNfcSymbol,\n faEthereum: faEthereum,\n faSpeakerDeck: faSpeakerDeck,\n faCreativeCommonsNcEu: faCreativeCommonsNcEu,\n faPatreon: faPatreon,\n faAvianex: faAvianex,\n faEllo: faEllo,\n faGofore: faGofore,\n faBimobject: faBimobject,\n faFacebookF: faFacebookF,\n faSquareGooglePlus: faSquareGooglePlus,\n faGooglePlusSquare: faGooglePlusSquare,\n faMandalorian: faMandalorian,\n faFirstOrderAlt: faFirstOrderAlt,\n faOsi: faOsi,\n faGoogleWallet: faGoogleWallet,\n faDAndDBeyond: faDAndDBeyond,\n faPeriscope: faPeriscope,\n faFulcrum: faFulcrum,\n faCloudscale: faCloudscale,\n faForumbee: faForumbee,\n faMizuni: faMizuni,\n faSchlix: faSchlix,\n faSquareXing: faSquareXing,\n faXingSquare: faXingSquare,\n faBandcamp: faBandcamp,\n faWpforms: faWpforms,\n faCloudversify: faCloudversify,\n faUsps: faUsps,\n faMegaport: faMegaport,\n faMagento: faMagento,\n faSpotify: faSpotify,\n faOptinMonster: faOptinMonster,\n faFly: faFly,\n faAviato: faAviato,\n faItunes: faItunes,\n faCuttlefish: faCuttlefish,\n faBlogger: faBlogger,\n faFlickr: faFlickr,\n faViber: faViber,\n faSoundcloud: faSoundcloud,\n faDigg: faDigg,\n faTencentWeibo: faTencentWeibo,\n faSymfony: faSymfony,\n faMaxcdn: faMaxcdn,\n faEtsy: faEtsy,\n faFacebookMessenger: faFacebookMessenger,\n faAudible: faAudible,\n faThinkPeaks: faThinkPeaks,\n faBilibili: faBilibili,\n faErlang: faErlang,\n faCottonBureau: faCottonBureau,\n faDashcube: faDashcube,\n fa42Group: fa42Group,\n faInnosoft: faInnosoft,\n faStackExchange: faStackExchange,\n faElementor: faElementor,\n faSquarePiedPiper: faSquarePiedPiper,\n faPiedPiperSquare: faPiedPiperSquare,\n faCreativeCommonsNd: faCreativeCommonsNd,\n faPalfed: faPalfed,\n faSuperpowers: faSuperpowers,\n faResolving: faResolving,\n faXbox: faXbox,\n faSearchengin: faSearchengin,\n faTiktok: faTiktok,\n faSquareFacebook: faSquareFacebook,\n faFacebookSquare: faFacebookSquare,\n faRenren: faRenren,\n faLinux: faLinux,\n faGlide: faGlide,\n faLinkedin: faLinkedin,\n faHubspot: faHubspot,\n faDeploydog: faDeploydog,\n faTwitch: faTwitch,\n faRavelry: faRavelry,\n faMixer: faMixer,\n faSquareLastfm: faSquareLastfm,\n faLastfmSquare: faLastfmSquare,\n faVimeo: faVimeo,\n faMendeley: faMendeley,\n faUniregistry: faUniregistry,\n faFigma: faFigma,\n faCreativeCommonsRemix: faCreativeCommonsRemix,\n faCcAmazonPay: faCcAmazonPay,\n faDropbox: faDropbox,\n faInstagram: faInstagram,\n faCmplid: faCmplid,\n faFacebook: faFacebook,\n faGripfire: faGripfire,\n faJediOrder: faJediOrder,\n faUikit: faUikit,\n faFortAwesomeAlt: faFortAwesomeAlt,\n faPhabricator: faPhabricator,\n faUssunnah: faUssunnah,\n faEarlybirds: faEarlybirds,\n faTradeFederation: faTradeFederation,\n faAutoprefixer: faAutoprefixer,\n faWhatsapp: faWhatsapp,\n faSlideshare: faSlideshare,\n faGooglePlay: faGooglePlay,\n faViadeo: faViadeo,\n faLine: faLine,\n faGoogleDrive: faGoogleDrive,\n faServicestack: faServicestack,\n faSimplybuilt: faSimplybuilt,\n faBitbucket: faBitbucket,\n faImdb: faImdb,\n faDeezer: faDeezer,\n faRaspberryPi: faRaspberryPi,\n faJira: faJira,\n faDocker: faDocker,\n faScreenpal: faScreenpal,\n faBluetooth: faBluetooth,\n faGitter: faGitter,\n faDAndD: faDAndD,\n faMicroblog: faMicroblog,\n faCcDinersClub: faCcDinersClub,\n faGgCircle: faGgCircle,\n faPiedPiperHat: faPiedPiperHat,\n faKickstarterK: faKickstarterK,\n faYandex: faYandex,\n faReadme: faReadme,\n faHtml5: faHtml5,\n faSellsy: faSellsy,\n faSass: faSass,\n faWirsindhandwerk: faWirsindhandwerk,\n faWsh: faWsh,\n faBuromobelexperte: faBuromobelexperte,\n faSalesforce: faSalesforce,\n faOctopusDeploy: faOctopusDeploy,\n faMedapps: faMedapps,\n faNs8: faNs8,\n faPinterestP: faPinterestP,\n faApper: faApper,\n faFortAwesome: faFortAwesome,\n faWaze: faWaze,\n faCcJcb: faCcJcb,\n faSnapchat: faSnapchat,\n faSnapchatGhost: faSnapchatGhost,\n faFantasyFlightGames: faFantasyFlightGames,\n faRust: faRust,\n faWix: faWix,\n faSquareBehance: faSquareBehance,\n faBehanceSquare: faBehanceSquare,\n faSupple: faSupple,\n faRebel: faRebel,\n faCss3: faCss3,\n faStaylinked: faStaylinked,\n faKaggle: faKaggle,\n faSpaceAwesome: faSpaceAwesome,\n faDeviantart: faDeviantart,\n faCpanel: faCpanel,\n faGoodreadsG: faGoodreadsG,\n faSquareGit: faSquareGit,\n faGitSquare: faGitSquare,\n faSquareTumblr: faSquareTumblr,\n faTumblrSquare: faTumblrSquare,\n faTrello: faTrello,\n faCreativeCommonsNcJp: faCreativeCommonsNcJp,\n faGetPocket: faGetPocket,\n faPerbyte: faPerbyte,\n faGrunt: faGrunt,\n faWeebly: faWeebly,\n faConnectdevelop: faConnectdevelop,\n faLeanpub: faLeanpub,\n faBlackTie: faBlackTie,\n faThemeco: faThemeco,\n faPython: faPython,\n faAndroid: faAndroid,\n faBots: faBots,\n faFreeCodeCamp: faFreeCodeCamp,\n faHornbill: faHornbill,\n faJs: faJs,\n faIdeal: faIdeal,\n faGit: faGit,\n faDev: faDev,\n faSketch: faSketch,\n faYandexInternational: faYandexInternational,\n faCcAmex: faCcAmex,\n faUber: faUber,\n faGithub: faGithub,\n faPhp: faPhp,\n faAlipay: faAlipay,\n faYoutube: faYoutube,\n faSkyatlas: faSkyatlas,\n faFirefoxBrowser: faFirefoxBrowser,\n faReplyd: faReplyd,\n faSuse: faSuse,\n faJenkins: faJenkins,\n faTwitter: faTwitter,\n faRockrms: faRockrms,\n faPinterest: faPinterest,\n faBuffer: faBuffer,\n faNpm: faNpm,\n faYammer: faYammer,\n faBtc: faBtc,\n faDribbble: faDribbble,\n faStumbleuponCircle: faStumbleuponCircle,\n faInternetExplorer: faInternetExplorer,\n faTelegram: faTelegram,\n faTelegramPlane: faTelegramPlane,\n faOldRepublic: faOldRepublic,\n faSquareWhatsapp: faSquareWhatsapp,\n faWhatsappSquare: faWhatsappSquare,\n faNodeJs: faNodeJs,\n faEdgeLegacy: faEdgeLegacy,\n faSlack: faSlack,\n faSlackHash: faSlackHash,\n faMedrt: faMedrt,\n faUsb: faUsb,\n faTumblr: faTumblr,\n faVaadin: faVaadin,\n faQuora: faQuora,\n faReacteurope: faReacteurope,\n faMedium: faMedium,\n faMediumM: faMediumM,\n faAmilia: faAmilia,\n faMixcloud: faMixcloud,\n faFlipboard: faFlipboard,\n faViacoin: faViacoin,\n faCriticalRole: faCriticalRole,\n faSitrox: faSitrox,\n faDiscourse: faDiscourse,\n faJoomla: faJoomla,\n faMastodon: faMastodon,\n faAirbnb: faAirbnb,\n faWolfPackBattalion: faWolfPackBattalion,\n faBuyNLarge: faBuyNLarge,\n faGulp: faGulp,\n faCreativeCommonsSamplingPlus: faCreativeCommonsSamplingPlus,\n faStrava: faStrava,\n faEmber: faEmber,\n faCanadianMapleLeaf: faCanadianMapleLeaf,\n faTeamspeak: faTeamspeak,\n faPushed: faPushed,\n faWordpressSimple: faWordpressSimple,\n faNutritionix: faNutritionix,\n faWodu: faWodu,\n faGooglePay: faGooglePay,\n faIntercom: faIntercom,\n faZhihu: faZhihu,\n faKorvue: faKorvue,\n faPix: faPix,\n faSteamSymbol: faSteamSymbol\n};\n\nexport { icons as fab, prefix, faMonero, faHooli, faYelp, faCcVisa, faLastfm, faShopware, faCreativeCommonsNc, faAws, faRedhat, faYoast, faCloudflare, faUps, faWpexplorer, faDyalog, faBity, faStackpath, faBuysellads, faFirstOrder, faModx, faGuilded, faVnv, faSquareJs, faJsSquare, faMicrosoft, faQq, faOrcid, faJava, faInvision, faCreativeCommonsPdAlt, faCentercode, faGlideG, faDrupal, faHireAHelper, faCreativeCommonsBy, faUnity, faWhmcs, faRocketchat, faVk, faUntappd, faMailchimp, faCss3Alt, faSquareReddit, faRedditSquare, faVimeoV, faContao, faSquareFontAwesome, faDeskpro, faSistrix, faSquareInstagram, faInstagramSquare, faBattleNet, faTheRedYeti, faSquareHackerNews, faHackerNewsSquare, faEdge, faNapster, faSquareSnapchat, faSnapchatSquare, faGooglePlusG, faArtstation, faMarkdown, faSourcetree, faGooglePlus, faDiaspora, faFoursquare, faStackOverflow, faGithubAlt, faPhoenixSquadron, faPagelines, faAlgolia, faRedRiver, faCreativeCommonsSa, faSafari, faGoogle, faSquareFontAwesomeStroke, faFontAwesomeAlt, faAtlassian, faLinkedinIn, faDigitalOcean, faNimblr, faChromecast, faEvernote, faHackerNews, faCreativeCommonsSampling, faAdversal, faCreativeCommons, faWatchmanMonitoring, faFonticons, faWeixin, faShirtsinbulk, faCodepen, faGitAlt, faLyft, faRev, faWindows, faWizardsOfTheCoast, faSquareViadeo, faViadeoSquare, faMeetup, faCentos, faAdn, faCloudsmith, faPiedPiperAlt, faSquareDribbble, faDribbbleSquare, faCodiepie, faNode, faMix, faSteam, faCcApplePay, faScribd, faOpenid, faInstalod, faExpeditedssl, faSellcast, faSquareTwitter, faTwitterSquare, faRProject, faDelicious, faFreebsd, faVuejs, faAccusoft, faIoxhost, faFonticonsFi, faAppStore, faCcMastercard, faItunesNote, faGolang, faKickstarter, faGrav, faWeibo, faUncharted, faFirstdraft, faSquareYoutube, faYoutubeSquare, faWikipediaW, faWpressr, faRendact, faAngellist, faGalacticRepublic, faNfcDirectional, faSkype, faJoget, faFedora, faStripeS, faMeta, faLaravel, faHotjar, faBluetoothB, faStickerMule, faCreativeCommonsZero, faHips, faBehance, faReddit, faDiscord, faChrome, faAppStoreIos, faCcDiscover, faWpbeginner, faConfluence, faMdb, faDochub, faAccessibleIcon, faEbay, faAmazon, faUnsplash, faYarn, faSquareSteam, faSteamSquare, fa500px, faSquareVimeo, faVimeoSquare, faAsymmetrik, faFontAwesome, faFontAwesomeFlag, faFontAwesomeLogoFull, faGratipay, faApple, faHive, faGitkraken, faKeybase, faApplePay, faPadlet, faAmazonPay, faSquareGithub, faGithubSquare, faStumbleupon, faFedex, faPhoenixFramework, faShopify, faNeos, faHackerrank, faResearchgate, faSwift, faAngular, faSpeakap, faAngrycreative, faYCombinator, faEmpire, faEnvira, faSquareGitlab, faGitlabSquare, faStudiovinari, faPiedPiper, faWordpress, faProductHunt, faFirefox, faLinode, faGoodreads, faSquareOdnoklassniki, faOdnoklassnikiSquare, faJsfiddle, faSith, faThemeisle, faPage4, faHashnode, faReact, faCcPaypal, faSquarespace, faCcStripe, faCreativeCommonsShare, faBitcoin, faKeycdn, faOpera, faItchIo, faUmbraco, faGalacticSenate, faUbuntu, faDraft2digital, faStripe, faHouzz, faGg, faDhl, faSquarePinterest, faPinterestSquare, faXing, faBlackberry, faCreativeCommonsPd, faPlaystation, faQuinscape, faLess, faBloggerB, faOpencart, faVine, faPaypal, faGitlab, faTypo3, faRedditAlien, faYahoo, faDailymotion, faAffiliatetheme, faPiedPiperPp, faBootstrap, faOdnoklassniki, faNfcSymbol, faEthereum, faSpeakerDeck, faCreativeCommonsNcEu, faPatreon, faAvianex, faEllo, faGofore, faBimobject, faFacebookF, faSquareGooglePlus, faGooglePlusSquare, faMandalorian, faFirstOrderAlt, faOsi, faGoogleWallet, faDAndDBeyond, faPeriscope, faFulcrum, faCloudscale, faForumbee, faMizuni, faSchlix, faSquareXing, faXingSquare, faBandcamp, faWpforms, faCloudversify, faUsps, faMegaport, faMagento, faSpotify, faOptinMonster, faFly, faAviato, faItunes, faCuttlefish, faBlogger, faFlickr, faViber, faSoundcloud, faDigg, faTencentWeibo, faSymfony, faMaxcdn, faEtsy, faFacebookMessenger, faAudible, faThinkPeaks, faBilibili, faErlang, faCottonBureau, faDashcube, fa42Group, faInnosoft, faStackExchange, faElementor, faSquarePiedPiper, faPiedPiperSquare, faCreativeCommonsNd, faPalfed, faSuperpowers, faResolving, faXbox, faSearchengin, faTiktok, faSquareFacebook, faFacebookSquare, faRenren, faLinux, faGlide, faLinkedin, faHubspot, faDeploydog, faTwitch, faRavelry, faMixer, faSquareLastfm, faLastfmSquare, faVimeo, faMendeley, faUniregistry, faFigma, faCreativeCommonsRemix, faCcAmazonPay, faDropbox, faInstagram, faCmplid, faFacebook, faGripfire, faJediOrder, faUikit, faFortAwesomeAlt, faPhabricator, faUssunnah, faEarlybirds, faTradeFederation, faAutoprefixer, faWhatsapp, faSlideshare, faGooglePlay, faViadeo, faLine, faGoogleDrive, faServicestack, faSimplybuilt, faBitbucket, faImdb, faDeezer, faRaspberryPi, faJira, faDocker, faScreenpal, faBluetooth, faGitter, faDAndD, faMicroblog, faCcDinersClub, faGgCircle, faPiedPiperHat, faKickstarterK, faYandex, faReadme, faHtml5, faSellsy, faSass, faWirsindhandwerk, faWsh, faBuromobelexperte, faSalesforce, faOctopusDeploy, faMedapps, faNs8, faPinterestP, faApper, faFortAwesome, faWaze, faCcJcb, faSnapchat, faSnapchatGhost, faFantasyFlightGames, faRust, faWix, faSquareBehance, faBehanceSquare, faSupple, faRebel, faCss3, faStaylinked, faKaggle, faSpaceAwesome, faDeviantart, faCpanel, faGoodreadsG, faSquareGit, faGitSquare, faSquareTumblr, faTumblrSquare, faTrello, faCreativeCommonsNcJp, faGetPocket, faPerbyte, faGrunt, faWeebly, faConnectdevelop, faLeanpub, faBlackTie, faThemeco, faPython, faAndroid, faBots, faFreeCodeCamp, faHornbill, faJs, faIdeal, faGit, faDev, faSketch, faYandexInternational, faCcAmex, faUber, faGithub, faPhp, faAlipay, faYoutube, faSkyatlas, faFirefoxBrowser, faReplyd, faSuse, faJenkins, faTwitter, faRockrms, faPinterest, faBuffer, faNpm, faYammer, faBtc, faDribbble, faStumbleuponCircle, faInternetExplorer, faTelegram, faTelegramPlane, faOldRepublic, faSquareWhatsapp, faWhatsappSquare, faNodeJs, faEdgeLegacy, faSlack, faSlackHash, faMedrt, faUsb, faTumblr, faVaadin, faQuora, faReacteurope, faMedium, faMediumM, faAmilia, faMixcloud, faFlipboard, faViacoin, faCriticalRole, faSitrox, faDiscourse, faJoomla, faMastodon, faAirbnb, faWolfPackBattalion, faBuyNLarge, faGulp, faCreativeCommonsSamplingPlus, faStrava, faEmber, faCanadianMapleLeaf, faTeamspeak, faPushed, faWordpressSimple, faNutritionix, faWodu, faGooglePay, faIntercom, faZhihu, faKorvue, faPix, faSteamSymbol };\n"],"names":["faGithub","prefix","iconName","icon","faDiscourse","faMastodon"],"sourceRoot":""} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..239e16d --- /dev/null +++ b/404.html @@ -0,0 +1,10 @@ +404: Not Found | Skohub Blog

404: Not Found

You just hit a route that doesn't exist.

+ + \ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 0000000..ebd3c65 --- /dev/null +++ b/404/index.html @@ -0,0 +1,10 @@ +404: Not Found | Skohub Blog

404: Not Found

You just hit a route that doesn't exist.

+ + \ No newline at end of file diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html new file mode 100644 index 0000000..6d4968b --- /dev/null +++ b/_gatsby/slices/_gatsby-scripts-1.html @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..c3e9545 --- /dev/null +++ b/about/index.html @@ -0,0 +1,10 @@ +About | Skohub Blog

About

SkoHub supports a novel approach for finding content on the web. The general idea is to extend the scope of Knowledge Organization Systems (KOS) to also act as communication hubs for publishers and information seekers. In effect, SkoHub allows to follow specific subjects in order to be notified when new content about that subject is published.

The approach is realized by putting Knowledge Organization Systems online according to the SKOS standard. Additionally, they are exposed using the (social) networking protocols ActivityPub and Linked Data Notifications. This effectively turns the published vocabularies into hubs that provide structured metadata about and links to web content in real time.

The project to create a production-ready version of SkoHub has been carried out by the North-Rhine Westphalian Library Service Centre (hbz) in cooperation with graphthinking GmbH with four deliverables. The core is the back end infrastructure for publishing vocabularies on the web (Skohub Vocabs) and for receiving and pushing notifications (SkoHub PubSub). Additionally, we provide an editor to describe web resources according to a common metadata schema and to send notifications (SkoHub Editor). The editor can also be used as a browser plugin for Firefox and Chrome (SkoHub Extension).

+ + \ No newline at end of file diff --git a/app-fe620b60292e32d725ed.js b/app-fe620b60292e32d725ed.js new file mode 100644 index 0000000..91f1a0a --- /dev/null +++ b/app-fe620b60292e32d725ed.js @@ -0,0 +1,3 @@ +/*! For license information please see app-fe620b60292e32d725ed.js.LICENSE.txt */ +(self.webpackChunkskohub_blog=self.webpackChunkskohub_blog||[]).push([[143],{4506:function(e,t){"use strict";t.H=void 0;t.H=(e,t="always")=>{const n=e.endsWith(".html"),r=e.endsWith(".xml"),o=e.endsWith(".pdf");return"/"===e?e:((n||r||o)&&(t="never"),"always"===t?e.endsWith("/")?e:`${e}/`:"never"===t&&e.endsWith("/")?e.slice(0,-1):e)}},9679:function(e,t,n){"use strict";t.p2=t.$C=void 0;var r=n(1432);t.$C=r.ScrollHandler;var o=n(4855);t.p2=o.useScrollRestoration},1432:function(e,t,n){"use strict";var r=n(4836);t.__esModule=!0,t.ScrollHandler=t.ScrollContext=void 0;var o=r(n(6115)),a=r(n(7867)),i=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=u(t);if(n&&n.has(e))return n.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,n&&n.set(e,r);return r}(n(7294)),s=r(n(5697)),c=n(1142);function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(u=function(e){return e?n:t})(e)}var l=i.createContext(new c.SessionStorage);t.ScrollContext=l,l.displayName="GatsbyScrollContext";var p=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;a{}},7730:function(e,t){"use strict";t.__esModule=!0,t.getForwards=function(e){return null==e?void 0:e.flatMap((e=>(null==e?void 0:e.forward)||[]))}},2731:function(e,t,n){"use strict";t.__esModule=!0,t.injectPartytownSnippet=function(e){if(!e.length)return;const t=document.querySelector("script[data-partytown]"),n=document.querySelector('iframe[src*="~partytown/partytown-sandbox-sw"]');t&&t.remove();n&&n.remove();const a=(0,o.getForwards)(e),i=document.createElement("script");i.dataset.partytown="",i.innerHTML=(0,r.partytownSnippet)({forward:a}),document.head.appendChild(i)};var r=n(2911),o=n(7730)},5418:function(e,t,n){t.components={"component---src-pages-404-js":()=>Promise.all([n.e(948),n.e(351),n.e(883)]).then(n.bind(n,429)),"component---src-pages-about-js":()=>Promise.all([n.e(948),n.e(351),n.e(682)]).then(n.bind(n,5465)),"component---src-pages-contact-js":()=>Promise.all([n.e(948),n.e(351),n.e(501)]).then(n.bind(n,5791)),"component---src-pages-index-js":()=>Promise.all([n.e(948),n.e(351),n.e(678)]).then(n.bind(n,6558)),"component---src-pages-using-typescript-tsx":()=>Promise.all([n.e(948),n.e(351),n.e(970)]).then(n.bind(n,8619)),"component---src-templates-blog-post-js":()=>Promise.all([n.e(948),n.e(351),n.e(989)]).then(n.bind(n,4982))}},4741:function(e,t,n){e.exports=[{plugin:n(8696),options:{plugins:[],siteUrl:"https://blog.skohub.io"}},{plugin:n(2154),options:{plugins:[],maxWidth:630,showCaptions:!0,linkImagesToOriginal:!0,markdownCaptions:!1,backgroundColor:"white",quality:50,withWebp:!1,withAvif:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1}},{plugin:n(9608),options:{plugins:[],name:"Skohub Blog",short_name:"Skohub Blog",start_url:"/",background_color:"#ffffff",theme_color:"#26c884",display:"minimal-ui",icon:"src/images/skohub.png",legacy:!0,theme_color_in_head:!0,cache_busting_mode:"query",crossOrigin:"anonymous",include_favicon:!0,cacheDigest:"3b68e7175ff10cac1dc50da0827ce2e1"}},{plugin:n(7420),options:{plugins:[]}},{plugin:n(4094),options:{plugins:[]}}]},3092:function(e,t,n){const r=n(4741),{getResourceURLsForPathname:o,loadPage:a,loadPageSync:i}=n(8575).jN;t.h=function(e,t,n,s){void 0===t&&(t={});let c=r.map((n=>{if(!n.plugin[e])return;t.getResourceURLsForPathname=o,t.loadPage=a,t.loadPageSync=i;const r=n.plugin[e](t,n.options);return r&&s&&(t=s({args:t,result:r,plugin:n})),r}));return c=c.filter((e=>void 0!==e)),c.length>0?c:n?[n]:[]},t.I=(e,t,n)=>r.reduce(((n,r)=>r.plugin[e]?n.then((()=>r.plugin[e](t,r.options))):n),Promise.resolve())},4004:function(e,t){t.M=()=>""},8299:function(e,t,n){"use strict";n.d(t,{Z:function(){return r}});var r=function(e){return e=e||Object.create(null),{on:function(t,n){(e[t]||(e[t]=[])).push(n)},off:function(t,n){e[t]&&e[t].splice(e[t].indexOf(n)>>>0,1)},emit:function(t,n){(e[t]||[]).slice().map((function(e){e(n)})),(e["*"]||[]).slice().map((function(e){e(t,n)}))}}}()},7802:function(e,t,n){"use strict";n.d(t,{UD:function(){return d},Cj:function(){return f},GA:function(){return h},DS:function(){return p}});var r=n(7896),o=n(1505),a=e=>{if(void 0===e)return e;let[t,n=""]=e.split("?");return n&&(n="?"+n),"/"===t?"/"+n:"/"===t.charAt(t.length-1)?t.slice(0,-1)+n:t+n},i=n(6073);const s=new Map;let c=[];const u=e=>{let t=e;if(-1!==e.indexOf("?")){const[n,r]=e.split("?");t=n+"?"+encodeURIComponent(r)}const n=decodeURIComponent(t);return(0,o.Z)(n,decodeURIComponent("")).split("#")[0]};function l(e){return e.startsWith("/")||e.startsWith("https://")||e.startsWith("http://")?e:new URL(e,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}const p=e=>{c=e},d=e=>{const t=m(e),n=c.map((e=>{let{path:t,matchPath:n}=e;return{path:n,originalPath:t}})),o=(0,r.pick)(n,t);return o?a(o.route.originalPath):null},h=e=>{const t=m(e),n=c.map((e=>{let{path:t,matchPath:n}=e;return{path:n,originalPath:t}})),o=(0,r.pick)(n,t);return o?o.params:{}},f=e=>{const t=u(l(e));if(s.has(t))return s.get(t);const n=(0,i.J)(e);if(n)return f(n.toPath);let r=d(t);return r||(r=m(e)),s.set(t,r),r},m=e=>{let t=u(l(e));return"/index.html"===t&&(t="/"),t=a(t),t}},1883:function(e,t,n){"use strict";n.r(t),n.d(t,{Link:function(){return s.rU},PageRenderer:function(){return a()},Script:function(){return S.Script},ScriptStrategy:function(){return S.ScriptStrategy},Slice:function(){return E},StaticQuery:function(){return c.i1},StaticQueryContext:function(){return c.B9},collectedScriptsByPage:function(){return S.collectedScriptsByPage},graphql:function(){return R},navigate:function(){return s.c4},parsePath:function(){return s.cP},prefetchPathname:function(){return C},scriptCache:function(){return S.scriptCache},scriptCallbackCache:function(){return S.scriptCallbackCache},useScrollRestoration:function(){return i.p2},useStaticQuery:function(){return c.K2},withAssetPrefix:function(){return s.mc},withPrefix:function(){return s.dq}});var r=n(8575),o=n(2743),a=n.n(o),i=n(9679),s=n(1562),c=n(1757);var u=n(4578);function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},l(e)}var p=n(9611);function d(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function h(e,t,n){return h=d()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&(0,p.Z)(o,n.prototype),o},h.apply(null,arguments)}function f(e){var t="function"==typeof Map?new Map:void 0;return f=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return h(e,arguments,l(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,p.Z)(r,e)},f(e)}var m=n(7294),g=n(4004),v=n(8995);const y=e=>{let{sliceId:t,children:n}=e;const r=[m.createElement("slice-start",{id:t+"-1"}),m.createElement("slice-end",{id:t+"-1"})];return n&&(r.push(n),r.push(m.createElement("slice-start",{id:t+"-2"}),m.createElement("slice-end",{id:t+"-2"}))),r},w=e=>{let{sliceName:t,allowEmpty:n,children:r,...o}=e;const a=(0,m.useContext)(v.u0),i=(0,m.useContext)(v.Db),s=a[t];if(!s){if(n)return null;throw new Error('Slice "'+s+'" for "'+t+'" slot not found')}const c=((e,t)=>Object.keys(t).length?e+"-"+(0,g.M)(t):e)(s,o);let u=i[c];return u?r&&(u.hasChildren=!0):i[c]=u={props:o,sliceName:s,hasChildren:!!r},m.createElement(y,{sliceId:c},r)},b=e=>{let{sliceName:t,allowEmpty:n,children:r,...o}=e;const a=(0,m.useContext)(v.u0),i=(0,m.useContext)(v.m3),s=a[t],c=i.get(s);if(!c){if(n)return null;throw new Error('Slice "'+s+'" for "'+t+'" slot not found')}return m.createElement(c.component,Object.assign({sliceContext:c.sliceContext,data:c.data},o),r)};function E(e){{const t={...e,sliceName:e.alias};delete t.alias,delete t.__renderedByLocation;const n=(0,m.useContext)(v.Bs),r=P(e);if(Object.keys(r).length)throw new _("browser"===n.renderEnvironment,t.sliceName,r,e.__renderedByLocation);if("server"===n.renderEnvironment)return m.createElement(w,t);if("browser"===n.renderEnvironment)return m.createElement(b,t);if("engines"===n.renderEnvironment)return m.createElement(b,t);if("slices"===n.renderEnvironment){let t="";try{t='\n\nSlice component "'+n.sliceRoot.name+'" ('+n.sliceRoot.componentPath+') tried to render '}catch{}throw new Error("Nested slices are not supported."+t+"\n\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices")}throw new Error('Slice context "'+n.renderEnvironment+'" is not supported.')}}let _=function(e){function t(n,r,o,a){var i;const s=Object.entries(o).map((e=>{let[t,n]=e;return'not serializable "'+n+'" type passed to "'+t+'" prop'})).join(", "),c="SlicePropsError";let u="",l="";if(n){const e=m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack().trim().split("\n").slice(1);e[0]=e[0].trim(),u="\n"+e.join("\n"),l='Slice "'+r+'" was passed props that are not serializable ('+s+")."}else{l=c+': Slice "'+r+'" was passed props that are not serializable ('+s+").";u=l+"\n"+(new Error).stack.trim().split("\n").slice(2).join("\n")}return(i=e.call(this,l)||this).name=c,u?i.stack=u:Error.captureStackTrace(function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(i),t),a&&(i.forcedLocation={...a,functionName:"Slice"}),i}return(0,u.Z)(t,e),t}(f(Error));const P=function(e,t,n,r){void 0===t&&(t={}),void 0===n&&(n=[]),void 0===r&&(r=null);for(const[o,a]of Object.entries(e)){if(null==a||!r&&"children"===o)continue;const e=r?r+"."+o:o;"function"==typeof a?t[e]=typeof a:"object"==typeof a&&n.indexOf(a)<=0&&(n.push(a),P(a,t,n,e))}return t};var S=n(3521);const C=r.ZP.enqueue;function R(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},8575:function(e,t,n){"use strict";n.d(t,{uQ:function(){return d},kL:function(){return _},ZP:function(){return C},Nt:function(){return k},hs:function(){return R},jN:function(){return S},N1:function(){return P}});var r=n(4578);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n{if("undefined"==typeof document)return void r();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),Object.keys(t).forEach((e=>{o.setAttribute(e,t[e])})),o.onload=n,o.onerror=r;(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.onload=()=>{200===r.status?t():n()},r.send(null)}))},c={};var u=function(e,t){return new Promise((n=>{c[e]?n():s(e,t).then((()=>{n(),c[e]=!0})).catch((()=>{}))}))},l=n(8299),p=n(7802);const d={Error:"error",Success:"success"},h=e=>{const[t,n]=e.split("?");var r;return"/page-data/"+("/"===t?"index":(r="/"===(r=t)[0]?r.slice(1):r).endsWith("/")?r.slice(0,-1):r)+"/page-data.json"+(n?"?"+n:"")},f=e=>e.startsWith("//");function m(e,t){return void 0===t&&(t="GET"),new Promise((n=>{const r=new XMLHttpRequest;r.open(t,e,!0),r.onreadystatechange=()=>{4==r.readyState&&n(r)},r.send(null)}))}const g=/bot|crawler|spider|crawling/i,v=function(e,t,n){var r;void 0===t&&(t=null);const o={componentChunkName:e.componentChunkName,path:e.path,webpackCompilationHash:e.webpackCompilationHash,matchPath:e.matchPath,staticQueryHashes:e.staticQueryHashes,getServerDataError:e.getServerDataError,slicesMap:null!==(r=e.slicesMap)&&void 0!==r?r:{}};return{component:t,head:n,json:e.result,page:o}};function y(e){return new Promise((t=>{try{const n=e.readRoot();t(n)}catch(n){if(!Object.hasOwnProperty.call(n,"_response")||!Object.hasOwnProperty.call(n,"_status"))throw n;setTimeout((()=>{y(e).then(t)}),200)}}))}let w=function(){function e(e,t){this.inFlightNetworkRequests=new Map,this.pageDb=new Map,this.inFlightDb=new Map,this.staticQueryDb={},this.pageDataDb=new Map,this.partialHydrationDb=new Map,this.slicesDataDb=new Map,this.sliceInflightDb=new Map,this.slicesDb=new Map,this.isPrefetchQueueRunning=!1,this.prefetchQueued=[],this.prefetchTriggered=new Set,this.prefetchCompleted=new Set,this.loadComponent=e,(0,p.DS)(t)}var t=e.prototype;return t.memoizedGet=function(e){let t=this.inFlightNetworkRequests.get(e);return t||(t=m(e,"GET"),this.inFlightNetworkRequests.set(e,t)),t.then((t=>(this.inFlightNetworkRequests.delete(e),t))).catch((t=>{throw this.inFlightNetworkRequests.delete(e),t}))},t.setApiRunner=function(e){this.apiRunner=e,this.prefetchDisabled=e("disableCorePrefetching").some((e=>e))},t.fetchPageDataJson=function(e){const{pagePath:t,retries:n=0}=e,r=h(t);return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{const n=JSON.parse(a);if(void 0===n.path)throw new Error("not a valid pageData response");const r=t.split("?")[1];return r&&!n.path.includes(r)&&(n.path+="?"+r),Object.assign(e,{status:d.Success,payload:n})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:d.Error}):this.fetchPageDataJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPageDataJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPageDataJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:d.Error})}))},t.fetchPartialHydrationJson=function(e){const{pagePath:t,retries:n=0}=e,r=h(t).replace(".json","-rsc.json");return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{return Object.assign(e,{status:d.Success,payload:a})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:d.Error}):this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPartialHydrationJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:d.Error})}))},t.loadPageDataJson=function(e){const t=(0,p.Cj)(e);if(this.pageDataDb.has(t)){const e=this.pageDataDb.get(t);return Promise.resolve(e)}return this.fetchPageDataJson({pagePath:t}).then((e=>(this.pageDataDb.set(t,e),e)))},t.loadPartialHydrationJson=function(e){const t=(0,p.Cj)(e);if(this.partialHydrationDb.has(t)){const e=this.partialHydrationDb.get(t);return Promise.resolve(e)}return this.fetchPartialHydrationJson({pagePath:t}).then((e=>(this.partialHydrationDb.set(t,e),e)))},t.loadSliceDataJson=function(e){if(this.slicesDataDb.has(e)){const t=this.slicesDataDb.get(e);return Promise.resolve({sliceName:e,jsonPayload:t})}return m("/slice-data/"+e+".json","GET").then((t=>{const n=JSON.parse(t.responseText);return this.slicesDataDb.set(e,n),{sliceName:e,jsonPayload:n}}))},t.findMatchPath=function(e){return(0,p.UD)(e)},t.loadPage=function(e){const t=(0,p.Cj)(e);if(this.pageDb.has(t)){const e=this.pageDb.get(t);return e.error?Promise.resolve({error:e.error,status:e.status}):Promise.resolve(e.payload)}if(this.inFlightDb.has(t))return this.inFlightDb.get(t);const n=[this.loadAppData(),this.loadPageDataJson(t)];const r=Promise.all(n).then((e=>{const[n,r,o]=e;if(r.status===d.Error||(null==o?void 0:o.status)===d.Error)return{status:d.Error};let s=r.payload;const{componentChunkName:c,staticQueryHashes:u=[],slicesMap:p={}}=s,h={},f=Array.from(new Set(Object.values(p))),m=e=>{if(this.slicesDb.has(e.name))return this.slicesDb.get(e.name);if(this.sliceInflightDb.has(e.name))return this.sliceInflightDb.get(e.name);const t=this.loadComponent(e.componentChunkName).then((t=>{return{component:(n=t,n&&n.default||n),sliceContext:e.result.sliceContext,data:e.result.data};var n}));return this.sliceInflightDb.set(e.name,t),t.then((t=>{this.slicesDb.set(e.name,t),this.sliceInflightDb.delete(e.name)})),t};return Promise.all(f.map((e=>this.loadSliceDataJson(e)))).then((e=>{const p=[],f=a(u);for(const{jsonPayload:t,sliceName:n}of Object.values(e)){p.push({name:n,...t});for(const e of t.staticQueryHashes)f.includes(e)||f.push(e)}const g=[Promise.all(p.map(m)),this.loadComponent(c,"head")];g.push(this.loadComponent(c));const w=Promise.all(g).then((e=>{const[t,a,c]=e;h.createdAt=new Date;for(const n of t)(!n||n instanceof Error)&&(h.status=d.Error,h.error=n);let u;if((!c||c instanceof Error)&&(h.status=d.Error,h.error=c),h.status!==d.Error){if(h.status=d.Success,!0!==r.notFound&&!0!==(null==o?void 0:o.notFound)||(h.notFound=!0),s=Object.assign(s,{webpackCompilationHash:n?n.webpackCompilationHash:""}),"string"==typeof(null==o?void 0:o.payload)){u=v(s,null,a),u.partialHydration=o.payload;const e=new ReadableStream({start(e){const t=new TextEncoder;e.enqueue(t.encode(o.payload))},pull(e){e.close()},cancel(){}});return y((0,i.createFromReadableStream)(e)).then((e=>(u.partialHydration=e,u)))}u=v(s,c,a)}return u})),b=Promise.all(f.map((e=>{if(this.staticQueryDb[e]){const t=this.staticQueryDb[e];return{staticQueryHash:e,jsonPayload:t}}return this.memoizedGet("/page-data/sq/d/"+e+".json").then((t=>{const n=JSON.parse(t.responseText);return{staticQueryHash:e,jsonPayload:n}})).catch((()=>{throw new Error("We couldn't load \"/page-data/sq/d/"+e+'.json"')}))}))).then((e=>{const t={};return e.forEach((e=>{let{staticQueryHash:n,jsonPayload:r}=e;t[n]=r,this.staticQueryDb[n]=r})),t}));return Promise.all([w,b]).then((e=>{let n,[r,o]=e;return r&&(n={...r,staticQueryResults:o},h.payload=n,l.Z.emit("onPostLoadPageResources",{page:n,pageResources:n})),this.pageDb.set(t,h),h.error?{error:h.error,status:h.status}:n})).catch((e=>({error:e,status:d.Error})))}))}));return r.then((()=>{this.inFlightDb.delete(t)})).catch((e=>{throw this.inFlightDb.delete(t),e})),this.inFlightDb.set(t,r),r},t.loadPageSync=function(e,t){void 0===t&&(t={});const n=(0,p.Cj)(e);if(this.pageDb.has(n)){var r;const e=this.pageDb.get(n);if(e.payload)return e.payload;if(null!==(r=t)&&void 0!==r&&r.withErrorDetails)return{error:e.error,status:e.status}}},t.shouldPrefetch=function(e){return!!(()=>{if("connection"in navigator&&void 0!==navigator.connection){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}return!0})()&&((!navigator.userAgent||!g.test(navigator.userAgent))&&!this.pageDb.has(e))},t.prefetch=function(e){if(!this.shouldPrefetch(e))return{then:e=>e(!1),abort:()=>{}};if(this.prefetchTriggered.has(e))return{then:e=>e(!0),abort:()=>{}};const t={resolve:null,reject:null,promise:null};t.promise=new Promise(((e,n)=>{t.resolve=e,t.reject=n})),this.prefetchQueued.push([e,t]);const n=new AbortController;return n.signal.addEventListener("abort",(()=>{const t=this.prefetchQueued.findIndex((t=>{let[n]=t;return n===e}));-1!==t&&this.prefetchQueued.splice(t,1)})),this.isPrefetchQueueRunning||(this.isPrefetchQueueRunning=!0,setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)),{then:(e,n)=>t.promise.then(e,n),abort:n.abort.bind(n)}},t._processNextPrefetchBatch=function(){(window.requestIdleCallback||(e=>setTimeout(e,0)))((()=>{const e=this.prefetchQueued.splice(0,4),t=Promise.all(e.map((e=>{let[t,n]=e;return this.prefetchTriggered.has(t)||(this.apiRunner("onPrefetchPathname",{pathname:t}),this.prefetchTriggered.add(t)),this.prefetchDisabled?n.resolve(!1):this.doPrefetch((0,p.Cj)(t)).then((()=>{this.prefetchCompleted.has(t)||(this.apiRunner("onPostPrefetchPathname",{pathname:t}),this.prefetchCompleted.add(t)),n.resolve(!0)}))})));this.prefetchQueued.length?t.then((()=>{setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)})):this.isPrefetchQueueRunning=!1}))},t.doPrefetch=function(e){const t=h(e);return u(t,{crossOrigin:"anonymous",as:"fetch"}).then((()=>this.loadPageDataJson(e)))},t.hovering=function(e){this.loadPage(e)},t.getResourceURLsForPathname=function(e){const t=(0,p.Cj)(e),n=this.pageDataDb.get(t);if(n){const e=v(n.payload);return[].concat(a(b(e.page.componentChunkName)),[h(t)])}return null},t.isPageNotFound=function(e){const t=(0,p.Cj)(e),n=this.pageDb.get(t);return!n||n.notFound},t.loadAppData=function(e){return void 0===e&&(e=0),this.memoizedGet("/page-data/app-data.json").then((t=>{const{status:n,responseText:r}=t;let o;if(200!==n&&e<3)return this.loadAppData(e+1);if(200===n)try{const e=JSON.parse(r);if(void 0===e.webpackCompilationHash)throw new Error("not a valid app-data response");o=e}catch(a){}return o}))},e}();const b=e=>(window.___chunkMapping[e]||[]).map((e=>""+e));let E,_=function(e){function t(t,n,r){var o;return o=e.call(this,(function(e,n){if(void 0===n&&(n="components"),!t[n="components"][e])throw new Error("We couldn't find the correct component chunk with the name \""+e+'"');return t[n][e]().catch((e=>e))}),n)||this,r&&o.pageDataDb.set((0,p.Cj)(r.path),{pagePath:r.path,payload:r,status:"success"}),o}(0,r.Z)(t,e);var n=t.prototype;return n.doPrefetch=function(t){return e.prototype.doPrefetch.call(this,t).then((e=>{if(e.status!==d.Success)return Promise.resolve();const t=e.payload,n=t.componentChunkName,r=b(n);return Promise.all(r.map(u)).then((()=>t))}))},n.loadPageDataJson=function(t){return e.prototype.loadPageDataJson.call(this,t).then((e=>e.notFound?f(t)?e:m(t,"HEAD").then((t=>200===t.status?{status:d.Error}:e)):e))},n.loadPartialHydrationJson=function(t){return e.prototype.loadPartialHydrationJson.call(this,t).then((e=>e.notFound?f(t)?e:m(t,"HEAD").then((t=>200===t.status?{status:d.Error}:e)):e))},t}(w);const P=e=>{E=e},S={enqueue:e=>E.prefetch(e),getResourceURLsForPathname:e=>E.getResourceURLsForPathname(e),loadPage:e=>E.loadPage(e),loadPageSync:function(e,t){return void 0===t&&(t={}),E.loadPageSync(e,t)},prefetch:e=>E.prefetch(e),isPageNotFound:e=>E.isPageNotFound(e),hovering:e=>E.hovering(e),loadAppData:()=>E.loadAppData()};var C=S;function R(){return E?E.staticQueryDb:{}}function k(){return E?E.slicesDb:{}}},4779:function(e,t,n){"use strict";n.d(t,{Z:function(){return E}});var r=n(7294),o=n(5697),a=n.n(o),i=n(3092),s=n(7802),c=n(1883),u=n(7896),l=n(4941);function p(e){let{children:t,callback:n}=e;return(0,r.useEffect)((()=>{n()})),t}const d=["link","meta","style","title","base","noscript","script","html","body"];function h(e,t){if(e instanceof HTMLElement&&t instanceof HTMLElement){const n=t.getAttribute("nonce");if(n&&!e.getAttribute("nonce")){const r=t.cloneNode(!0);return r.setAttribute("nonce",""),r.nonce=n,n===e.nonce&&e.isEqualNode(r)}}return e.isEqualNode(t)}const f=document.createElement("div"),m=new Set,g=new Set,v=(e,t,n,r)=>{const o=document.getElementsByTagName(e)[0];o&&(o.setAttribute(t,n),r.add(t))},y=()=>{var e;const t=[],n=new Map;for(const u of f.childNodes){var r,o;const e=u.nodeName.toLowerCase(),i=null===(r=u.attributes)||void 0===r||null===(o=r.id)||void 0===o?void 0:o.value;if(!d.includes(e))continue;if("html"===e){for(const e of u.attributes)v("html",e.name,e.value,m);continue}if("body"===e){for(const e of u.attributes)v("body",e.name,e.value,g);continue}let s=u.cloneNode(!0);if(s.setAttribute("data-gatsby-head",!0),"script"===s.nodeName.toLowerCase()){const e=document.createElement("script");for(const t of s.attributes)e.setAttribute(t.name,t.value);e.innerHTML=s.innerHTML,s=e}if(i){if(n.has(i)){var a;const e=n.get(i);null===(a=t[e].parentNode)||void 0===a||a.removeChild(t[e]),t[e]=s;continue}t.push(s),n.set(i,t.length-1)}else t.push(s)}const i=document.querySelectorAll("[data-gatsby-head]");var s;if(0===i.length)return void(s=document.head).append.apply(s,t);const c=[];!function(e){let{oldNodes:t,newNodes:n,onStale:r,onNew:o}=e;for(const a of t){const e=n.findIndex((e=>h(e,a)));-1===e?r(a):n.splice(e,1)}for(const a of n)o(a)}({oldNodes:i,newNodes:t,onStale:e=>e.parentNode.removeChild(e),onNew:e=>c.push(e)}),(e=document.head).append.apply(e,c)};function w(e){let{pageComponent:t,staticQueryResults:n,pageComponentProps:o}=e;(0,r.useEffect)((()=>{if(null!=t&&t.Head){!function(e){if("function"!=typeof e)throw new Error('Expected "Head" export to be a function got "'+typeof e+'".')}(t.Head);const{render:a}=(0,l.U)(),i=t.Head;a(r.createElement(p,{callback:y},r.createElement(c.StaticQueryContext.Provider,{value:n},r.createElement(u.LocationProvider,null,r.createElement(i,{location:{pathname:(e=o).location.pathname},params:e.params,data:e.data||{},serverData:e.serverData,pageContext:e.pageContext})))),f)}var e;return()=>{(()=>{const e=document.querySelectorAll("[data-gatsby-head]");for(const t of e)t.parentNode.removeChild(t)})(),m.forEach((e=>{document.getElementsByTagName("html")[0].removeAttribute(e)})),g.forEach((e=>{document.getElementsByTagName("body")[0].removeAttribute(e)}))}}))}function b(e){const t={...e,params:{...(0,s.GA)(e.location.pathname),...e.pageResources.json.pageContext.__params}};let n;var o;n=e.pageResources.partialHydration?e.pageResources.partialHydration:(0,r.createElement)((o=e.pageResources.component)&&o.default||o,{...t,key:e.path||e.pageResources.page.path});w({pageComponent:e.pageResources.head,staticQueryResults:e.pageResources.staticQueryResults,pageComponentProps:t});return(0,i.h)("wrapPageElement",{element:n,props:t},n,(e=>{let{result:n}=e;return{element:n,props:t}})).pop()}b.propTypes={location:a().object.isRequired,pageResources:a().object.isRequired,data:a().object,pageContext:a().object.isRequired};var E=b},5824:function(e,t,n){"use strict";var r=n(4578),o=n(3092),a=n(7294),i=n(7896),s=n(9679),c=n(1757),u=n(8995),l=n(8575),p=n(6073),d=n(8299);const h={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};var f=n(1562);function m(e){const t=(0,p.J)(e),{hash:n,search:r}=window.location;return null!=t&&(window.___replace(t.toPath+r+n),!0)}let g="";window.addEventListener("unhandledrejection",(e=>{/loading chunk \d* failed./i.test(e.reason)&&g&&(window.location.pathname=g)}));const v=(e,t)=>{m(e.pathname)||(g=e.pathname,(0,o.h)("onPreRouteUpdate",{location:e,prevLocation:t}))},y=(e,t)=>{m(e.pathname)||(0,o.h)("onRouteUpdate",{location:e,prevLocation:t})},w=function(e,t){if(void 0===t&&(t={}),"number"==typeof e)return void i.globalHistory.navigate(e);const{pathname:n,search:r,hash:a}=(0,f.cP)(e),s=(0,p.J)(n);if(s&&(e=s.toPath+r+a),window.___swUpdated)return void(window.location=n+r+a);const c=setTimeout((()=>{d.Z.emit("onDelayedLoadPageResources",{pathname:n}),(0,o.h)("onRouteUpdateDelayed",{location:window.location})}),1e3);l.ZP.loadPage(n+r).then((o=>{if(!o||o.status===l.uQ.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(c);o&&o.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=n+r+a),(0,i.navigate)(e,t),clearTimeout(c)}))};function b(e,t){let{location:n}=t;const{pathname:r,hash:a}=n,i=(0,o.h)("shouldUpdateScroll",{prevRouterProps:e,pathname:r,routerProps:{location:n},getSavedScrollPosition:e=>[0,this._stateStorage.read(e,e.key)]});if(i.length>0)return i[i.length-1];if(e){const{location:{pathname:t}}=e;if(t===r)return a?decodeURI(a.slice(1)):[0,0]}return!0}let E=function(e){function t(t){var n;return(n=e.call(this,t)||this).announcementRef=a.createRef(),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidUpdate=function(e,t){requestAnimationFrame((()=>{let e="new page at "+this.props.location.pathname;document.title&&(e=document.title);const t=document.querySelectorAll("#gatsby-focus-wrapper h1");t&&t.length&&(e=t[0].textContent);const n="Navigated to "+e;if(this.announcementRef.current){this.announcementRef.current.innerText!==n&&(this.announcementRef.current.innerText=n)}}))},n.render=function(){return a.createElement("div",Object.assign({},h,{ref:this.announcementRef}))},t}(a.Component);const _=(e,t)=>{var n,r;return e.href!==t.href||(null==e||null===(n=e.state)||void 0===n?void 0:n.key)!==(null==t||null===(r=t.state)||void 0===r?void 0:r.key)};let P=function(e){function t(t){var n;return n=e.call(this,t)||this,v(t.location,null),n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidMount=function(){y(this.props.location,null)},n.shouldComponentUpdate=function(e){return!!_(e.location,this.props.location)&&(v(this.props.location,e.location),!0)},n.componentDidUpdate=function(e){_(e.location,this.props.location)&&y(this.props.location,e.location)},n.render=function(){return a.createElement(a.Fragment,null,this.props.children,a.createElement(E,{location:location}))},t}(a.Component);var S=n(4779),C=n(5418);function R(e,t){for(var n in e)if(!(n in t))return!0;for(var r in t)if(e[r]!==t[r])return!0;return!1}var k=function(e){function t(t){var n;n=e.call(this)||this;const{location:r,pageResources:o}=t;return n.state={location:{...r},pageResources:o||l.ZP.loadPageSync(r.pathname+r.search,{withErrorDetails:!0})},n}(0,r.Z)(t,e),t.getDerivedStateFromProps=function(e,t){let{location:n}=e;if(t.location.href!==n.href){return{pageResources:l.ZP.loadPageSync(n.pathname+n.search,{withErrorDetails:!0}),location:{...n}}}return{location:{...n}}};var n=t.prototype;return n.loadResources=function(e){l.ZP.loadPage(e).then((t=>{t&&t.status!==l.uQ.Error?this.setState({location:{...window.location},pageResources:t}):(window.history.replaceState({},"",location.href),window.location=e)}))},n.shouldComponentUpdate=function(e,t){return t.pageResources?this.state.pageResources!==t.pageResources||(this.state.pageResources.component!==t.pageResources.component||(this.state.pageResources.json!==t.pageResources.json||(!(this.state.location.key===t.location.key||!t.pageResources.page||!t.pageResources.page.matchPath&&!t.pageResources.page.path)||function(e,t,n){return R(e.props,t)||R(e.state,n)}(this,e,t)))):(this.loadResources(e.location.pathname+e.location.search),!1)},n.render=function(){return this.props.children(this.state)},t}(a.Component),O=n(1505),x=n(4941);const j=new l.kL(C,[],window.pageData);(0,l.N1)(j),j.setApiRunner(o.h);const{render:T,hydrate:D}=(0,x.U)();window.asyncRequires=C,window.___emitter=d.Z,window.___loader=l.jN,i.globalHistory.listen((e=>{e.location.action=e.action})),window.___push=e=>w(e,{replace:!1}),window.___replace=e=>w(e,{replace:!0}),window.___navigate=(e,t)=>w(e,t);const N="gatsby-reload-compilation-hash-match";(0,o.I)("onClientEntry").then((()=>{(0,o.h)("registerServiceWorker").filter(Boolean).length>0&&n(9939);const e=e=>a.createElement(i.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.createElement(S.Z,e)),t=a.createContext({}),p={renderEnvironment:"browser"};let d=function(e){function n(){return e.apply(this,arguments)||this}return(0,r.Z)(n,e),n.prototype.render=function(){const{children:e}=this.props;return a.createElement(i.Location,null,(n=>{let{location:r}=n;return a.createElement(k,{location:r},(n=>{let{pageResources:r,location:o}=n;const i=(0,l.hs)(),s=(0,l.Nt)();return a.createElement(c.B9.Provider,{value:i},a.createElement(u.Bs.Provider,{value:p},a.createElement(u.m3.Provider,{value:s},a.createElement(u.u0.Provider,{value:r.page.slicesMap},a.createElement(t.Provider,{value:{pageResources:r,location:o}},e)))))}))}))},n}(a.Component),h=function(n){function o(){return n.apply(this,arguments)||this}return(0,r.Z)(o,n),o.prototype.render=function(){return a.createElement(t.Consumer,null,(t=>{let{pageResources:n,location:r}=t;return a.createElement(P,{location:r},a.createElement(s.$C,{location:r,shouldUpdateScroll:b},a.createElement(i.Router,{basepath:"",location:r,id:"gatsby-focus-wrapper"},a.createElement(e,Object.assign({path:"/404.html"===n.page.path||"/500.html"===n.page.path?(0,O.Z)(r.pathname,""):encodeURI((n.page.matchPath||n.page.path).split("?")[0])},this.props,{location:r,pageResources:n},n.json)))))}))},o}(a.Component);const{pagePath:f,location:m}=window;f&&""+f!==m.pathname+(f.includes("?")?m.search:"")&&!(j.findMatchPath((0,O.Z)(m.pathname,""))||f.match(/^\/(404|500)(\/?|.html)$/)||f.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&(0,i.navigate)(""+f+(f.includes("?")?"":m.search)+m.hash,{replace:!0});const g=()=>{try{return sessionStorage}catch{return null}};l.jN.loadPage(m.pathname+m.search).then((e=>{var t;const n=g();if(null!=e&&null!==(t=e.page)&&void 0!==t&&t.webpackCompilationHash&&e.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),n)){if(!("1"===n.getItem(N)))return n.setItem(N,"1"),void window.location.reload(!0)}if(n&&n.removeItem(N),!e||e.status===l.uQ.Error){const t="page resources for "+m.pathname+" not found. Not rendering React";if(e&&e.error)throw console.error(t),e.error;throw new Error(t)}const r=(0,o.h)("wrapRootElement",{element:a.createElement(h,null)},a.createElement(h,null),(e=>{let{result:t}=e;return{element:t}})).pop(),i=function(){const e=a.useRef(!1);return a.useEffect((()=>{e.current||(e.current=!0,performance.mark&&performance.mark("onInitialClientRender"),(0,o.h)("onInitialClientRender"))}),[]),a.createElement(d,null,r)},s=document.getElementById("gatsby-focus-wrapper");let c=T;s&&s.children.length&&(c=D);const u=(0,o.h)("replaceHydrateFunction",void 0,c)[0];function p(){const e="undefined"!=typeof window?document.getElementById("___gatsby"):null;u(a.createElement(i,null),e)}const f=document;if("complete"===f.readyState||"loading"!==f.readyState&&!f.documentElement.doScroll)setTimeout((function(){p()}),0);else{const e=function(){f.removeEventListener("DOMContentLoaded",e,!1),window.removeEventListener("load",e,!1),p()};f.addEventListener("DOMContentLoaded",e,!1),window.addEventListener("load",e,!1)}}))}))},224:function(e,t,n){"use strict";n.r(t);var r=n(7294),o=n(8575),a=n(4779);t.default=e=>{let{location:t}=e;const n=o.ZP.loadPageSync(t.pathname);return n?r.createElement(a.Z,{location:t,pageResources:n,...n.json}):null}},2743:function(e,t,n){var r;e.exports=(r=n(224))&&r.default||r},4941:function(e,t,n){"use strict";n.d(t,{U:function(){return o}});const r=new WeakMap;function o(){const e=n(745);return{render:(t,n)=>{let o=r.get(n);o||r.set(n,o=e.createRoot(n)),o.render(t)},hydrate:(t,n)=>e.hydrateRoot(n,t)}}},6073:function(e,t,n){"use strict";n.d(t,{J:function(){return a}});const r=new Map,o=new Map;function a(e){let t=r.get(e);return t||(t=o.get(e.toLowerCase())),t}[].forEach((e=>{e.ignoreCase?o.set(e.fromPath,e):r.set(e.fromPath,e)}))},9939:function(e,t,n){"use strict";n.r(t);var r=n(3092);"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(e){e.addEventListener("updatefound",(()=>{(0,r.h)("onServiceWorkerUpdateFound",{serviceWorker:e});const t=e.installing;console.log("installingWorker",t),t.addEventListener("statechange",(()=>{switch(t.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,(0,r.h)("onServiceWorkerUpdateReady",{serviceWorker:e}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),(0,r.h)("onServiceWorkerInstalled",{serviceWorker:e}));break;case"redundant":console.error("The installing service worker became redundant."),(0,r.h)("onServiceWorkerRedundant",{serviceWorker:e});break;case"activated":(0,r.h)("onServiceWorkerActive",{serviceWorker:e})}}))}))})).catch((function(e){console.error("Error during service worker registration:",e)}))},8995:function(e,t,n){"use strict";n.d(t,{Bs:function(){return a},Db:function(){return s},m3:function(){return o},u0:function(){return i}});var r=n(7294);const o=r.createContext({}),a=r.createContext({}),i=r.createContext({}),s=r.createContext({})},1757:function(e,t,n){"use strict";n.d(t,{i1:function(){return c},B9:function(){return o},K2:function(){return u}});var r=n(7294);const o=(a="StaticQuery",i={},r.createServerContext?function(e,t){return void 0===t&&(t=null),globalThis.__SERVER_CONTEXT||(globalThis.__SERVER_CONTEXT={}),globalThis.__SERVER_CONTEXT[e]||(globalThis.__SERVER_CONTEXT[e]=r.createServerContext(e,t)),globalThis.__SERVER_CONTEXT[e]}(a,i):r.createContext(i));var a,i;function s(e){let{staticQueryData:t,data:n,query:o,render:a}=e;const i=n?n.data:t[o]&&t[o].data;return r.createElement(r.Fragment,null,i&&a(i),!i&&r.createElement("div",null,"Loading (StaticQuery)"))}const c=e=>{const{data:t,query:n,render:a,children:i}=e;return r.createElement(o.Consumer,null,(e=>r.createElement(s,{data:t,query:n,render:a||i,staticQueryData:e})))},u=e=>{var t;r.useContext;const n=r.useContext(o);if(isNaN(Number(e)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+e+"`);\n");if(null!==(t=n[e])&&void 0!==t&&t.data)return n[e].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")}},1505:function(e,t,n){"use strict";function r(e,t){return void 0===t&&(t=""),t?e===t?"/":e.startsWith(t+"/")?e.slice(t.length):e:e}n.d(t,{Z:function(){return r}})},7420:function(e,t,n){"use strict";n.r(t)},8696:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return r}});const r=function(e,t){let{location:n}=e;void 0===t&&(t={stripQueryString:!1});const r=document.querySelector("link[rel='canonical']"),o=r.getAttribute("href"),a=r.getAttribute("data-baseProtocol"),i=r.getAttribute("data-baseHost");if(o&&a&&i){let e=a+"//"+i+n.pathname;const{stripQueryString:o}=t;o||(e+=n.search),e+=n.hash,r.setAttribute("href",""+e)}}},9608:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return r}});n(1883),n(292);const r=function(e,t){let{location:n}=e}},292:function(e,t,n){"use strict";var r=n(1883)},855:function(e,t){"use strict";t.DEFAULT_OPTIONS={maxWidth:650,wrapperStyle:"",backgroundColor:"white",linkImagesToOriginal:!0,showCaptions:!1,markdownCaptions:!1,withWebp:!1,withAvif:!1,tracedSVG:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1},t.EMPTY_ALT="GATSBY_EMPTY_ALT",t.imageClass="gatsby-resp-image-image",t.imageWrapperClass="gatsby-resp-image-wrapper",t.imageBackgroundClass="gatsby-resp-image-background-image"},2154:function(e,t,n){"use strict";var r=n(855),o=r.DEFAULT_OPTIONS,a=r.imageClass,i=r.imageBackgroundClass,s=r.imageWrapperClass;t.onRouteUpdate=function(e,t){for(var n=Object.assign({},o,t),r=document.querySelectorAll("."+s),c=function(e){var t=r[e],o=t.querySelector("."+i),s=t.querySelector("."+a),c=function(){o.style.transition="opacity 0.5s 0.5s",s.style.transition="opacity 0.5s",u()},u=function e(){o.style.opacity=0,s.style.opacity=1,s.style.color="inherit",s.style.boxShadow="inset 0px 0px 0px 400px "+n.backgroundColor,s.removeEventListener("load",c),s.removeEventListener("error",e)};s.style.opacity=0,s.addEventListener("load",c),s.addEventListener("error",u),s.complete&&u()},u=0;u((e,t)=>{const{forward:n=[],...r}=e||{},o=JSON.stringify(r,((e,t)=>("function"==typeof t&&(t=String(t)).startsWith(e+"(")&&(t="function "+t),t)));return["!(function(w,p,f,c){",Object.keys(r).length>0?`c=w[p]=Object.assign(w[p]||{},${o});`:"c=w[p]=w[p]||{};","c[f]=(c[f]||[])",n.length>0?`.concat(${JSON.stringify(n)})`:"","})(window,'partytown','forward');",t].join("")})(e,'/* Partytown 0.7.5 - MIT builder.io */\n!function(t,e,n,i,r,o,a,d,s,c,p,l){function u(){l||(l=1,"/"==(a=(o.lib||"/~partytown/")+(o.debug?"debug/":""))[0]&&(s=e.querySelectorAll(\'script[type="text/partytown"]\'),i!=t?i.dispatchEvent(new CustomEvent("pt1",{detail:t})):(d=setTimeout(f,1e4),e.addEventListener("pt0",w),r?h(1):n.serviceWorker?n.serviceWorker.register(a+(o.swPath||"partytown-sw.js"),{scope:a}).then((function(t){t.active?h():t.installing&&t.installing.addEventListener("statechange",(function(t){"activated"==t.target.state&&h()}))}),console.error):f())))}function h(t){c=e.createElement(t?"script":"iframe"),t||(c.setAttribute("style","display:block;width:0;height:0;border:0;visibility:hidden"),c.setAttribute("aria-hidden",!0)),c.src=a+"partytown-"+(t?"atomics.js?v=0.7.5":"sandbox-sw.html?"+Date.now()),e.body.appendChild(c)}function f(n,r){for(w(),i==t&&(o.forward||[]).map((function(e){delete t[e.split(".")[0]]})),n=0;n=0||(o[n]=e[n]);return o}const u=e=>{const{search:t,hash:n,href:r,origin:o,protocol:a,host:i,hostname:s,port:c}=e.location;let{pathname:u}=e.location;return!u&&r&&d&&(u=new URL(r).pathname),{pathname:encodeURI(decodeURI(u)),search:t,hash:n,href:r,origin:o,protocol:a,host:i,hostname:s,port:c,state:e.history.state,key:e.history.state&&e.history.state.key||"initial"}},l=(e,t)=>{let n=[],r=u(e),o=!1,a=()=>{};return{get location(){return r},get transitioning(){return o},_onTransitionComplete(){o=!1,a()},listen(t){n.push(t);const o=()=>{r=u(e),t({location:r,action:"POP"})};return e.addEventListener("popstate",o),()=>{e.removeEventListener("popstate",o),n=n.filter((e=>e!==t))}},navigate(t,{state:i,replace:c=!1}={}){if("number"==typeof t)e.history.go(t);else{i=s({},i,{key:Date.now()+""});try{o||c?e.history.replaceState(i,null,t):e.history.pushState(i,null,t)}catch(n){e.location[c?"replace":"assign"](t)}}r=u(e),o=!0;const l=new Promise((e=>a=e));return n.forEach((e=>e({location:r,action:"PUSH"}))),l}}},p=(e="/")=>{const t=e.indexOf("?"),n={pathname:t>-1?e.substr(0,t):e,search:t>-1?e.substr(t):""};let r=0;const o=[n],a=[null];return{get location(){return o[r]},addEventListener(e,t){},removeEventListener(e,t){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState(e,t,n){const[i,s=""]=n.split("?");r++,o.push({pathname:i,search:s.length?`?${s}`:s}),a.push(e)},replaceState(e,t,n){const[i,s=""]=n.split("?");o[r]={pathname:i,search:s},a[r]=e},go(e){const t=r+e;t<0||t>a.length-1||(r=t)}}}},d=!("undefined"==typeof window||!window.document||!window.document.createElement),h=l(d?window:p()),{navigate:f}=h;function m(e,t){return o.createServerContext?((e,t=null)=>(globalThis.__SERVER_CONTEXT||(globalThis.__SERVER_CONTEXT={}),globalThis.__SERVER_CONTEXT[e]||(globalThis.__SERVER_CONTEXT[e]=o.createServerContext(e,t)),globalThis.__SERVER_CONTEXT[e]))(e,t):o.createContext(t)}const g=m("Base",{baseuri:"/",basepath:"/"}),v=m("Location"),y=()=>o.useContext(g),w=()=>o.useContext(v);function b(e){this.uri=e}const E=e=>e instanceof b,_=e=>{throw new b(e)};function P(e){const{to:t,replace:n=!0,state:r,noThrow:a,baseuri:i}=e;o.useEffect((()=>{Promise.resolve().then((()=>{const o=O(t,i);f(x(o,e),{replace:n,state:r})}))}),[]);const s=O(t,i);return a||_(x(s,e)),null}const S=e=>{const t=w(),{baseuri:n}=y();return o.createElement(P,s({},t,{baseuri:n},e))};S.propTypes={from:a.string,to:a.string.isRequired};const C=(e,t)=>e.substr(0,t.length)===t,R=(e,t)=>{let n,r;const[o]=t.split("?"),a=I(o),s=""===a[0],c=M(e);for(let u=0,l=c.length;u dynamic segment "${r[1]}" is a reserved name. Please use a different name in path "${o.path}".`);const t=decodeURIComponent(n);p[r[1]]=t}else if(t!==n){e=!0;break}}if(!e){n={route:o,params:p,uri:"/"+a.slice(0,h).join("/")};break}}return n||r||null},k=(e,t)=>R([{path:e}],t),O=(e,t)=>{if(C(e,"/"))return e;const[n,r]=e.split("?"),[o]=t.split("?"),a=I(n),i=I(o);if(""===a[0])return A(o,r);if(!C(a[0],".")){const e=i.concat(a).join("/");return A(("/"===o?"":"/")+e,r)}const s=i.concat(a),c=[];for(let u=0,l=s.length;u{const[n,r=""]=e.split("?");let o="/"+I(n).map((e=>{const n=T.exec(e);return n?t[n[1]]:e})).join("/");const{location:{search:a=""}={}}=t,i=a.split("?")[1]||"";return o=A(o,r,i),o},j=(e,t)=>{const n=e=>D(e);return I(e).filter(n).sort().join("/")===I(t).filter(n).sort().join("/")},T=/^:(.+)/,D=e=>T.test(e),N=e=>e&&"*"===e[0],L=(e,t)=>({route:e,score:e.default?0:I(e.path).reduce(((e,t)=>(e+=4,(e=>""===e)(t)?e+=1:D(t)?e+=2:N(t)?e-=5:e+=3,e)),0),index:t}),M=e=>e.map(L).sort(((e,t)=>e.scoret.score?-1:e.index-t.index)),I=e=>e.replace(/(^\/+|\/+$)/g,"").split("/"),A=(e,...t)=>e+((t=t.filter((e=>e&&e.length>0)))&&t.length>0?`?${t.join("&")}`:""),H=["uri","path"],U=(e,t)=>{const n=Object.keys(e);return n.length===Object.keys(t).length&&n.every((n=>t.hasOwnProperty(n)&&e[n]===t[n]))},W=e=>e.replace(/(^\/+|\/+$)/g,""),q=e=>t=>{if(!t)return null;if(t.type===o.Fragment&&t.props.children)return o.Children.map(t.props.children,q(e));if(i(t.props.path||t.props.default||t.type===S,`: Children of must have a \`path\` or \`default\` prop, or be a \`\`. None found on element type \`${t.type}\``),i(!!(t.type!==S||t.props.from&&t.props.to),` requires both "from" and "to" props when inside a .`),i(!(t.type===S&&!j(t.props.from,t.props.to)),` has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.`),t.props.default)return{value:t,default:!0};const n=t.type===S?t.props.from:t.props.path,r="/"===n?e:`${W(e)}/${W(n)}`;return{value:t,default:t.props.default,path:t.props.children?`${W(r)}/*`:r}},F=["innerRef"],B=["to","state","replace","getProps"],Q=["key"];let{forwardRef:J}=r||(r=n.t(o,2));void 0===J&&(J=e=>e);const $=()=>{},Z=J(((e,t)=>{let{innerRef:n}=e,r=c(e,F);const{baseuri:a}=y(),{location:i}=w(),{to:u,state:l,replace:p,getProps:d=$}=r,h=c(r,B),m=O(u,a),g=encodeURI(m),v=i.pathname===g,b=C(i.pathname,g);return o.createElement("a",s({ref:t||n,"aria-current":v?"page":void 0},h,d({isCurrent:v,isPartiallyCurrent:b,href:m,location:i}),{href:m,onClick:e=>{if(h.onClick&&h.onClick(e),(e=>!e.defaultPrevented&&0===e.button&&!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey))(e)){e.preventDefault();let t=p;if("boolean"!=typeof p&&v){const e=c(s({},i.state),Q);t=U(s({},l),e)}f(m,{state:l,replace:t})}}}))}));Z.displayName="Link",Z.propTypes={to:a.string.isRequired};class G extends o.Component{constructor(...e){super(...e),this.displayName="ReactUseErrorBoundary"}componentDidCatch(...e){this.setState({}),this.props.onError(...e)}render(){return this.props.children}}const K=o.createContext({componentDidCatch:{current:void 0},error:void 0,setError:()=>!1});function z({children:e}){const[t,n]=o.useState(),r=o.useRef(),a=o.useMemo((()=>({componentDidCatch:r,error:t,setError:n})),[t]);return o.createElement(K.Provider,{value:a},o.createElement(G,{error:t,onError:(e,t)=>{n(e),null==r.current||r.current(e,t)}},e))}z.displayName="ReactUseErrorBoundaryContext";const V=function(e){var t,n;function r(t){return o.createElement(z,null,o.createElement(e,s({key:"WrappedComponent"},t)))}return r.displayName=`WithErrorBoundary(${null!=(t=null!=(n=e.displayName)?n:e.name)?t:"Component"})`,r}((({history:e=h,children:t})=>{const{location:n}=e,[r,a]=o.useState({location:n}),[i]=function(e){const t=o.useContext(K);t.componentDidCatch.current=void 0;const n=o.useCallback((()=>{t.setError(void 0)}),[]);return[t.error,n]}();if(o.useEffect((()=>{e._onTransitionComplete()}),[r.location]),o.useEffect((()=>{let t=!1;const n=e.listen((({location:e})=>{Promise.resolve().then((()=>{requestAnimationFrame((()=>{t||a({location:e})}))}))}));return()=>{t=!0,n()}}),[]),i){if(!E(i))throw i;f(i.uri,{replace:!0})}return o.createElement(v.Provider,{value:r},"function"==typeof t?t(r):t||null)})),X=({children:e})=>{const t=w();return t?e(t):o.createElement(V,null,e)},Y=({url:e,children:t})=>{const n=e.indexOf("?");let r,a="";return n>-1?(r=e.substring(0,n),a=e.substring(n)):r=e,o.createElement(v.Provider,{value:{location:{pathname:r,search:a,hash:""}}},t)},ee=({path:e,children:t})=>{const{baseuri:n}=y(),{location:r}=w(),o=O(e,n),a=k(o,r.pathname);return t({location:r,match:a?s({},a.params,{uri:a.uri,path:e}):null})},te=["uri","location","component"],ne=["children","style","component","uri","location"],re=e=>{let{uri:t,location:n,component:r}=e,a=c(e,te);return o.createElement(ae,s({},a,{component:r,uri:t,location:n}))};let oe=0;const ae=e=>{let{children:t,style:n,component:r="div",uri:a,location:i}=e,u=c(e,ne);const l=o.useRef(),p=o.useRef(!0),d=o.useRef(a),h=o.useRef(i.pathname),f=o.useRef(!1);o.useEffect((()=>(oe++,m(),()=>{oe--,0===oe&&(p.current=!0)})),[]),o.useEffect((()=>{let e=!1,t=!1;a!==d.current&&(d.current=a,e=!0),i.pathname!==h.current&&(h.current=i.pathname,t=!0),f.current=e||t&&i.pathname===a,f.current&&m()}),[a,i]);const m=o.useCallback((()=>{var e;p.current?p.current=!1:(e=l.current,f.current&&e&&e.focus())}),[]);return o.createElement(r,s({style:s({outline:"none"},n),tabIndex:"-1",ref:l},u),t)},ie=["location","primary","children","basepath","baseuri","component"],se=e=>{const t=y(),n=w();return o.createElement(ce,s({},t,n,e))};function ce(e){const{location:t,primary:n=!0,children:r,basepath:a,component:i="div"}=e,u=c(e,ie),l=o.Children.toArray(r).reduce(((e,t)=>{const n=q(a)(t);return e.concat(n)}),[]),{pathname:p}=t,d=R(l,p);if(d){const{params:e,uri:r,route:c,route:{value:l}}=d,p=c.default?a:c.path.replace(/\*$/,""),h=s({},e,{uri:r,location:t}),f=o.cloneElement(l,h,l.props.children?o.createElement(se,{location:t,primary:n},l.props.children):void 0),m=n?re:i,v=n?s({uri:r,location:t,component:i},u):u;return o.createElement(g.Provider,{value:{baseuri:r,basepath:p}},o.createElement(m,v,f))}return null}const ue=()=>{const e=w();if(!e)throw new Error("useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");return e.location},le=()=>{throw new Error("useNavigate is removed. Use import { navigate } from 'gatsby' instead")},pe=()=>{const e=y();if(!e)throw new Error("useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");const t=ue(),n=k(e.basepath,t.pathname);return n?n.params:null},de=e=>{if(!e)throw new Error("useMatch(path: string) requires an argument of a string to match against");const t=y();if(!t)throw new Error("useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");const n=ue(),r=O(e,t.baseuri),o=k(r,n.pathname);return o?s({},o.params,{uri:o.uri,path:e}):null}},1562:function(e,t,n){"use strict";n.d(t,{c4:function(){return E},cP:function(){return c},dq:function(){return p},mc:function(){return g},rU:function(){return b}});var r=n(5697),o=n(7294),a=n(7896),i=n(4506);function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t{if("string"==typeof e)return!(e=>u.test(e))(e)};function p(e,t=""){var n;if(!l(e))return e;if(e.startsWith("./")||e.startsWith("../"))return e;const r=null!=(n=null!=t?t:"")?n:"/";return`${null!=r&&r.endsWith("/")?r.slice(0,-1):r}${e.startsWith("/")?e:`/${e}`}`}const d=e=>null==e?void 0:e.startsWith("/");function h(e,t){const{pathname:n,search:r,hash:o}=c(e);return`${(0,i.H)(n,t)}${r}${o}`}const f=(e,t)=>"number"==typeof e?e:l(e)?d(e)?function(e){const t=p(e),n="always";return h(t,n)}(e):function(e,t){if(d(e))return e;const n="always",r=(0,a.resolve)(e,t);return h(r,n)}(e,t):e,m=["to","getProps","onClick","onMouseEnter","activeClassName","activeStyle","innerRef","partiallyActive","state","replace","_location"];function g(e){return p(e,"")}const v={activeClassName:r.string,activeStyle:r.object,partiallyActive:r.bool};function y(e){return o.createElement(a.Location,null,(({location:t})=>o.createElement(w,s({},e,{_location:t}))))}class w extends o.Component{constructor(e){super(e),this.defaultGetProps=({isPartiallyCurrent:e,isCurrent:t})=>(this.props.partiallyActive?e:t)?{className:[this.props.className,this.props.activeClassName].filter(Boolean).join(" "),style:s({},this.props.style,this.props.activeStyle)}:null;let t=!1;"undefined"!=typeof window&&window.IntersectionObserver&&(t=!0),this.state={IOSupported:t},this.abortPrefetch=null,this.handleRef=this.handleRef.bind(this)}_prefetch(){let e=window.location.pathname+window.location.search;this.props._location&&this.props._location.pathname&&(e=this.props._location.pathname+this.props._location.search);const t=c(f(this.props.to,e)),n=t.pathname+t.search;if(e!==n)return ___loader.enqueue(n)}componentWillUnmount(){if(!this.io)return;const{instance:e,el:t}=this.io;this.abortPrefetch&&this.abortPrefetch.abort(),e.unobserve(t),e.disconnect()}handleRef(e){this.props.innerRef&&Object.prototype.hasOwnProperty.call(this.props.innerRef,"current")?this.props.innerRef.current=e:this.props.innerRef&&this.props.innerRef(e),this.state.IOSupported&&e&&(this.io=((e,t)=>{const n=new window.IntersectionObserver((n=>{n.forEach((n=>{e===n.target&&t(n.isIntersecting||n.intersectionRatio>0)}))}));return n.observe(e),{instance:n,el:e}})(e,(e=>{e?this.abortPrefetch=this._prefetch():this.abortPrefetch&&this.abortPrefetch.abort()})))}render(){const e=this.props,{to:t,getProps:n=this.defaultGetProps,onClick:r,onMouseEnter:i,state:u,replace:p,_location:d}=e,h=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}(e,m),g=f(t,d.pathname);return l(g)?o.createElement(a.Link,s({to:g,state:u,getProps:n,innerRef:this.handleRef,onMouseEnter:e=>{i&&i(e);const t=c(g);___loader.hovering(t.pathname+t.search)},onClick:e=>{if(r&&r(e),!(0!==e.button||this.props.target||e.defaultPrevented||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)){e.preventDefault();let t=p;const n=encodeURI(g)===d.pathname;"boolean"!=typeof p&&n&&(t=!0),window.___navigate(g,{state:u,replace:t})}return!0}},h)):o.createElement("a",s({href:g},h))}}w.propTypes=s({},v,{onClick:r.func,to:r.string.isRequired,replace:r.bool,state:r.object});const b=o.forwardRef(((e,t)=>o.createElement(y,s({innerRef:t},e)))),E=(e,t)=>{window.___navigate(f(e,window.location.pathname),t)}},3521:function(e,t,n){"use strict";n.r(t),n.d(t,{Script:function(){return f},ScriptStrategy:function(){return u},collectedScriptsByPage:function(){return s},scriptCache:function(){return d},scriptCallbackCache:function(){return h}});var r=n(7294),o=n(7896);function a(){return a=Object.assign?Object.assign.bind():function(e){for(var t=1;ti.get(e)||[],set(e,t){const n=i.get(e)||[];n.push(t),i.set(e,n)},delete(e){i.delete(e)}},c="undefined"!=typeof self&&self.requestIdleCallback&&self.requestIdleCallback.bind(window)||function(e){const t=Date.now();return setTimeout((function(){e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})}),1)};var u,l;(l=u||(u={})).postHydrate="post-hydrate",l.idle="idle",l.offMainThread="off-main-thread";const p=new Set(["src","strategy","dangerouslySetInnerHTML","children","onLoad","onError"]),d=new Set,h=new Map;function f(e){return r.createElement(o.Location,null,(()=>r.createElement(m,e)))}function m(e){const{src:t,strategy:n=u.postHydrate}=e||{},{pathname:i}=(0,o.useLocation)();if((0,r.useEffect)((()=>{let t;switch(n){case u.postHydrate:t=g(e);break;case u.idle:c((()=>{t=g(e)}));break;case u.offMainThread:{const t=y(e);s.set(i,t)}}return()=>{const{script:e,loadCallback:n,errorCallback:r}=t||{};n&&(null==e||e.removeEventListener("load",n)),r&&(null==e||e.removeEventListener("error",r)),null==e||e.remove()}}),[]),n===u.offMainThread){const o=v(e),c=y(e);return"undefined"==typeof window&&s.set(i,c),r.createElement("script",o?a({type:"text/partytown","data-strategy":n,crossOrigin:"anonymous"},c,{dangerouslySetInnerHTML:{__html:v(e)}}):a({type:"text/partytown",src:w(t),"data-strategy":n,crossOrigin:"anonymous"},c))}return null}function g(e){const{id:t,src:n,strategy:r=u.postHydrate,onLoad:o,onError:i}=e||{},s=t||n,c=["load","error"],l={load:o,error:i};if(s){for(const e of c)if(null!=l&&l[e]){var p;const t=h.get(s)||{},{callbacks:n=[]}=(null==t?void 0:t[e])||{};var f,m;n.push(null==l?void 0:l[e]),null!=t&&null!=(p=t[e])&&p.event?null==l||null==(f=l[e])||f.call(l,null==t||null==(m=t[e])?void 0:m.event):h.set(s,a({},t,{[e]:{callbacks:n}}))}if(d.has(s))return null}const g=v(e),w=y(e),E=document.createElement("script");t&&(E.id=t),E.dataset.strategy=r;for(const[a,u]of Object.entries(w))E.setAttribute(a,u);g&&(E.textContent=g),n&&(E.src=n);const _={};if(s){for(const e of c){const t=t=>b(t,s,e);E.addEventListener(e,t),_[`${e}Callback`]=t}d.add(s)}return document.body.appendChild(E),{script:E,loadCallback:_.loadCallback,errorCallback:_.errorCallback}}function v(e){const{dangerouslySetInnerHTML:t,children:n=""}=e||{},{__html:r=""}=t||{};return r||n}function y(e){const t={};for(const[n,r]of Object.entries(e))p.has(n)||(t[n]=r);return t}function w(e){if(e)return`/__third-party-proxy?url=${encodeURIComponent(e)}`}function b(e,t,n){const r=h.get(t)||{};for(const a of(null==r||null==(o=r[n])?void 0:o.callbacks)||[]){var o;a(e)}h.set(t,{[n]:{event:e}})}}},function(e){e.O(0,[774,532],(function(){return t=5824,e(e.s=t);var t}));e.O()}]); +//# sourceMappingURL=app-fe620b60292e32d725ed.js.map \ No newline at end of file diff --git a/app-fe620b60292e32d725ed.js.LICENSE.txt b/app-fe620b60292e32d725ed.js.LICENSE.txt new file mode 100644 index 0000000..467a64a --- /dev/null +++ b/app-fe620b60292e32d725ed.js.LICENSE.txt @@ -0,0 +1,9 @@ +/** + * @license React + * react-server-dom-webpack.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/app-fe620b60292e32d725ed.js.map b/app-fe620b60292e32d725ed.js.map new file mode 100644 index 0000000..ad03009 --- /dev/null +++ b/app-fe620b60292e32d725ed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"app-fe620b60292e32d725ed.js","mappings":"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","sources":["webpack://skohub-blog/./node_modules/gatsby-page-utils/dist/apply-trailing-slash-option.js","webpack://skohub-blog/./node_modules/gatsby-react-router-scroll/index.js","webpack://skohub-blog/./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack://skohub-blog/./node_modules/gatsby-react-router-scroll/session-storage.js","webpack://skohub-blog/./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack://skohub-blog/./node_modules/gatsby/dist/internal-plugins/partytown/gatsby-browser.js","webpack://skohub-blog/./node_modules/gatsby/dist/internal-plugins/partytown/utils/get-forwards.js","webpack://skohub-blog/./node_modules/gatsby/dist/internal-plugins/partytown/utils/inject-partytown-snippet.js","webpack://skohub-blog/./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack://skohub-blog/./.cache/api-runner-browser-plugins.js","webpack://skohub-blog/./.cache/api-runner-browser.js","webpack://skohub-blog/./.cache/create-content-digest-browser-shim.js","webpack://skohub-blog/./.cache/emitter.js","webpack://skohub-blog/./node_modules/mitt/dist/mitt.es.js","webpack://skohub-blog/./.cache/normalize-page-path.js","webpack://skohub-blog/./.cache/find-path.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/construct.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","webpack://skohub-blog/./.cache/slice/server-slice-renderer.js","webpack://skohub-blog/./.cache/slice/server-slice.js","webpack://skohub-blog/./.cache/slice/inline-slice.js","webpack://skohub-blog/./.cache/slice.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://skohub-blog/./.cache/gatsby-browser-entry.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://skohub-blog/./.cache/prefetch.js","webpack://skohub-blog/./.cache/loader.js","webpack://skohub-blog/./.cache/head/components/fire-callback-in-effect.js","webpack://skohub-blog/./.cache/head/constants.js","webpack://skohub-blog/./.cache/head/utils.js","webpack://skohub-blog/./.cache/head/head-export-handler-for-browser.js","webpack://skohub-blog/./.cache/page-renderer.js","webpack://skohub-blog/./.cache/route-announcer-props.js","webpack://skohub-blog/./.cache/navigation.js","webpack://skohub-blog/./node_modules/shallow-compare/es/index.js","webpack://skohub-blog/./.cache/ensure-resources.js","webpack://skohub-blog/./.cache/production-app.js","webpack://skohub-blog/./.cache/public-page-renderer-prod.js","webpack://skohub-blog/./.cache/public-page-renderer.js","webpack://skohub-blog/./.cache/react-dom-utils.js","webpack://skohub-blog/./.cache/redirect-utils.js","webpack://skohub-blog/./.cache/register-service-worker.js","webpack://skohub-blog/./.cache/slice/context.js","webpack://skohub-blog/./.cache/static-query.js","webpack://skohub-blog/./.cache/context-utils.js","webpack://skohub-blog/./.cache/strip-prefix.js","webpack://skohub-blog/./node_modules/gatsby-plugin-canonical-urls/gatsby-browser.js","webpack://skohub-blog/./node_modules/gatsby-plugin-manifest/gatsby-browser.js","webpack://skohub-blog/./node_modules/gatsby-plugin-manifest/get-manifest-pathname.js","webpack://skohub-blog/./node_modules/gatsby-remark-images/constants.js","webpack://skohub-blog/./node_modules/gatsby-remark-images/gatsby-browser.js","webpack://skohub-blog/./node_modules/invariant/browser.js","webpack://skohub-blog/./node_modules/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js","webpack://skohub-blog/./node_modules/react-server-dom-webpack/index.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack://skohub-blog/./node_modules/@builder.io/partytown/integration/index.cjs","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://skohub-blog/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://skohub-blog/./node_modules/@gatsbyjs/reach-router/dist/index.modern.mjs","webpack://skohub-blog/./node_modules/gatsby-link/dist/index.modern.mjs","webpack://skohub-blog/./node_modules/gatsby-script/dist/index.modern.mjs"],"sourcesContent":["\"use strict\";\n\nexports.__esModule = true;\nexports.applyTrailingSlashOption = void 0;\nconst applyTrailingSlashOption = (input, option = `always`) => {\n const hasHtmlSuffix = input.endsWith(`.html`);\n const hasXmlSuffix = input.endsWith(`.xml`);\n const hasPdfSuffix = input.endsWith(`.pdf`);\n if (input === `/`) return input;\n if (hasHtmlSuffix || hasXmlSuffix || hasPdfSuffix) {\n option = `never`;\n }\n if (option === `always`) {\n return input.endsWith(`/`) ? input : `${input}/`;\n }\n if (option === `never`) {\n return input.endsWith(`/`) ? input.slice(0, -1) : input;\n }\n return input;\n};\nexports.applyTrailingSlashOption = applyTrailingSlashOption;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContext = void 0;\nvar _scrollHandler = require(\"./scroll-handler\");\nexports.ScrollContext = _scrollHandler.ScrollHandler;\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\nvar React = _interopRequireWildcard(require(\"react\"));\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _sessionStorage = require(\"./session-storage\");\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n function ScrollHandler() {\n var _this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n if (!shouldUpdateScroll) {\n return true;\n }\n\n // Hack to allow accessing this._stateStorage.\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n return _this;\n }\n var _proto = ScrollHandler.prototype;\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n this._isTicking = false;\n };\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener(\"scroll\", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n /** If a hash is present in the browser url as the component mounts (i.e. the user is navigating\n * from an external website) then scroll to the hash instead of any previously stored scroll\n * position. */\n if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n } else if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n }\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.scrollListener);\n };\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n return ScrollHandler;\n}(React.Component);\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n var _proto = SessionStorage.prototype;\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n }\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n return 0;\n }\n };\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n }\n }\n };\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n };\n return SessionStorage;\n}();\nexports.SessionStorage = SessionStorage;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\nvar _scrollHandler = require(\"./scroll-handler\");\nvar _react = require(\"react\");\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}","\"use strict\";\n\nexports.__esModule = true;\nexports.onInitialClientRender = void 0;\nvar _gatsbyScript = require(\"gatsby-script\");\nvar _injectPartytownSnippet = require(\"./utils/inject-partytown-snippet\");\n// Makes sure off-main-thread scripts are loaded in `gatsby develop`\nconst onInitialClientRender = () => {\n if (process.env.NODE_ENV !== `development`) {\n return;\n }\n (0, _injectPartytownSnippet.injectPartytownSnippet)(_gatsbyScript.collectedScriptsByPage.get(window.location.pathname));\n\n // Clear scripts after we've used them to avoid leaky behavior\n _gatsbyScript.collectedScriptsByPage.delete(window.location.pathname);\n};\n\n// Client-side navigation (CSR, e.g. Gatsby Link navigations) are broken upstream in Partytown.\n// We need an official API from Partytown for handling re-configuration and on-demand script loading.\n// Until then, `off-main-thread` scripts load only on server-side navigation (SSR).\n// See https://github.com/BuilderIO/partytown/issues/74 for more details.\nexports.onInitialClientRender = onInitialClientRender;\n//# sourceMappingURL=gatsby-browser.js.map","\"use strict\";\n\nexports.__esModule = true;\nexports.getForwards = getForwards;\nfunction getForwards(collectedScripts) {\n return collectedScripts === null || collectedScripts === void 0 ? void 0 : collectedScripts.flatMap(script => (script === null || script === void 0 ? void 0 : script.forward) || []);\n}\n//# sourceMappingURL=get-forwards.js.map","\"use strict\";\n\nexports.__esModule = true;\nexports.injectPartytownSnippet = injectPartytownSnippet;\nvar _integration = require(\"@builder.io/partytown/integration\");\nvar _getForwards = require(\"./get-forwards\");\n// Adapted from https://github.com/BuilderIO/partytown/blob/main/src/react/snippet.tsx to only include CSR logic\nfunction injectPartytownSnippet(collectedScripts) {\n if (!collectedScripts.length) {\n return;\n }\n const existingSnippet = document.querySelector(`script[data-partytown]`);\n const existingSandbox = document.querySelector(`iframe[src*=\"~partytown/partytown-sandbox-sw\"]`);\n if (existingSnippet) {\n existingSnippet.remove();\n }\n if (existingSandbox) {\n existingSandbox.remove();\n }\n const forwards = (0, _getForwards.getForwards)(collectedScripts);\n const snippet = document.createElement(`script`);\n snippet.dataset.partytown = ``;\n snippet.innerHTML = (0, _integration.partytownSnippet)({\n forward: forwards\n });\n document.head.appendChild(snippet);\n}\n//# sourceMappingURL=inject-partytown-snippet.js.map","exports.components = {\n \"component---src-pages-404-js\": () => import(\"./../../../src/pages/404.js\" /* webpackChunkName: \"component---src-pages-404-js\" */),\n \"component---src-pages-about-js\": () => import(\"./../../../src/pages/about.js\" /* webpackChunkName: \"component---src-pages-about-js\" */),\n \"component---src-pages-contact-js\": () => import(\"./../../../src/pages/contact.js\" /* webpackChunkName: \"component---src-pages-contact-js\" */),\n \"component---src-pages-index-js\": () => import(\"./../../../src/pages/index.js\" /* webpackChunkName: \"component---src-pages-index-js\" */),\n \"component---src-pages-using-typescript-tsx\": () => import(\"./../../../src/pages/using-typescript.tsx\" /* webpackChunkName: \"component---src-pages-using-typescript-tsx\" */),\n \"component---src-templates-blog-post-js\": () => import(\"./../../../src/templates/blog-post.js\" /* webpackChunkName: \"component---src-templates-blog-post-js\" */)\n}\n\n","module.exports = [{\n plugin: require('../node_modules/gatsby-plugin-canonical-urls/gatsby-browser.js'),\n options: {\"plugins\":[],\"siteUrl\":\"https://blog.skohub.io\"},\n },{\n plugin: require('../node_modules/gatsby-remark-images/gatsby-browser.js'),\n options: {\"plugins\":[],\"maxWidth\":630,\"showCaptions\":true,\"linkImagesToOriginal\":true,\"markdownCaptions\":false,\"backgroundColor\":\"white\",\"quality\":50,\"withWebp\":false,\"withAvif\":false,\"loading\":\"lazy\",\"decoding\":\"async\",\"disableBgImageOnAlpha\":false,\"disableBgImage\":false},\n },{\n plugin: require('../node_modules/gatsby-plugin-manifest/gatsby-browser.js'),\n options: {\"plugins\":[],\"name\":\"Skohub Blog\",\"short_name\":\"Skohub Blog\",\"start_url\":\"/\",\"background_color\":\"#ffffff\",\"theme_color\":\"#26c884\",\"display\":\"minimal-ui\",\"icon\":\"src/images/skohub.png\",\"legacy\":true,\"theme_color_in_head\":true,\"cache_busting_mode\":\"query\",\"crossOrigin\":\"anonymous\",\"include_favicon\":true,\"cacheDigest\":\"3b68e7175ff10cac1dc50da0827ce2e1\"},\n },{\n plugin: require('../gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/gatsby/dist/internal-plugins/partytown/gatsby-browser.js'),\n options: {\"plugins\":[]},\n }]\n","const plugins = require(`./api-runner-browser-plugins`)\nconst { getResourceURLsForPathname, loadPage, loadPageSync } =\n require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n // Hooks for gatsby-cypress's API handler\n if (process.env.CYPRESS_SUPPORT) {\n if (window.___apiHandler) {\n window.___apiHandler(api)\n } else if (window.___resolvedAPIs) {\n window.___resolvedAPIs.push(api)\n } else {\n window.___resolvedAPIs = [api]\n }\n }\n\n let results = plugins.map(plugin => {\n if (!plugin.plugin[api]) {\n return undefined\n }\n\n args.getResourceURLsForPathname = getResourceURLsForPathname\n args.loadPage = loadPage\n args.loadPageSync = loadPageSync\n\n const result = plugin.plugin[api](args, plugin.options)\n if (result && argTransform) {\n args = argTransform({ args, result, plugin })\n }\n return result\n })\n\n // Filter out undefined results.\n results = results.filter(result => typeof result !== `undefined`)\n\n if (results.length > 0) {\n return results\n } else if (defaultReturn) {\n return [defaultReturn]\n } else {\n return []\n }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n plugins.reduce(\n (previous, next) =>\n next.plugin[api]\n ? previous.then(() => next.plugin[api](args, next.options))\n : previous,\n Promise.resolve()\n )\n","exports.createContentDigest = () => ``\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","export default pathAndSearch => {\n if (pathAndSearch === undefined) {\n return pathAndSearch\n }\n let [path, search = ``] = pathAndSearch.split(`?`)\n if (search) {\n search = `?` + search\n }\n\n if (path === `/`) {\n return `/` + search\n }\n if (path.charAt(path.length - 1) === `/`) {\n return path.slice(0, -1) + search\n }\n return path + search\n}\n","import { pick } from \"@gatsbyjs/reach-router\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n let newRawPathname = rawPathname\n const queryIndex = rawPathname.indexOf(`?`)\n\n if (queryIndex !== -1) {\n const [path, qs] = rawPathname.split(`?`)\n newRawPathname = `${path}?${encodeURIComponent(qs)}`\n }\n\n const pathname = decodeURIComponent(newRawPathname)\n\n // Remove the pathPrefix from the pathname.\n const trimmedPathname = stripPrefix(\n pathname,\n decodeURIComponent(__BASE_PATH__)\n )\n // Remove any hashfragment\n .split(`#`)[0]\n\n return trimmedPathname\n}\n\nfunction absolutify(path) {\n // If it's already absolute, return as-is\n if (\n path.startsWith(`/`) ||\n path.startsWith(`https://`) ||\n path.startsWith(`http://`)\n ) {\n return path\n }\n // Calculate path relative to current location, adding a trailing slash to\n // match behavior of @reach/router\n return new URL(\n path,\n window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return normalizePagePath(path.route.originalPath)\n }\n\n return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return path.params\n }\n\n return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n if (pathCache.has(trimmedPathname)) {\n return pathCache.get(trimmedPathname)\n }\n\n const redirect = maybeGetBrowserRedirect(rawPathname)\n if (redirect) {\n return findPath(redirect.toPath)\n }\n\n let foundPath = findMatchPath(trimmedPathname)\n\n if (!foundPath) {\n foundPath = cleanPath(rawPathname)\n }\n\n pathCache.set(trimmedPathname, foundPath)\n\n return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n let foundPath = trimmedPathname\n if (foundPath === `/index.html`) {\n foundPath = `/`\n }\n\n foundPath = normalizePagePath(foundPath)\n\n return foundPath\n}\n","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","import React from \"react\"\n\nexport const ServerSliceRenderer = ({ sliceId, children }) => {\n const contents = [\n React.createElement(`slice-start`, {\n id: `${sliceId}-1`,\n }),\n React.createElement(`slice-end`, {\n id: `${sliceId}-1`,\n }),\n ]\n\n if (children) {\n // if children exist, we split the slice into a before and after piece\n // see renderSlices in render-html\n contents.push(children)\n contents.push(\n React.createElement(`slice-start`, {\n id: `${sliceId}-2`,\n }),\n React.createElement(`slice-end`, {\n id: `${sliceId}-2`,\n })\n )\n }\n\n return contents\n}\n","import React, { useContext } from \"react\"\nimport { createContentDigest } from \"gatsby-core-utils/create-content-digest\"\nimport { SlicesMapContext, SlicesPropsContext } from \"./context\"\nimport { ServerSliceRenderer } from \"./server-slice-renderer\"\n\nconst getSliceId = (sliceName, sliceProps) => {\n if (!Object.keys(sliceProps).length) {\n return sliceName\n }\n\n const propsString = createContentDigest(sliceProps)\n return `${sliceName}-${propsString}`\n}\n\nexport const ServerSlice = ({\n sliceName,\n allowEmpty,\n children,\n ...sliceProps\n}) => {\n const slicesMap = useContext(SlicesMapContext)\n const slicesProps = useContext(SlicesPropsContext)\n const concreteSliceName = slicesMap[sliceName]\n\n if (!concreteSliceName) {\n if (allowEmpty) {\n return null\n } else {\n throw new Error(\n `Slice \"${concreteSliceName}\" for \"${sliceName}\" slot not found`\n )\n }\n }\n\n const sliceId = getSliceId(concreteSliceName, sliceProps)\n\n // set props on context object for static-entry to return\n let sliceUsage = slicesProps[sliceId]\n if (!sliceUsage) {\n slicesProps[sliceId] = sliceUsage = {\n props: sliceProps,\n sliceName: concreteSliceName,\n hasChildren: !!children,\n }\n } else {\n if (children) {\n sliceUsage.hasChildren = true\n }\n }\n\n return {children}\n}\n","import React, { useContext } from \"react\"\nimport { SlicesMapContext, SlicesResultsContext } from \"./context\"\n\nexport const InlineSlice = ({\n sliceName,\n allowEmpty,\n children,\n ...sliceProps\n}) => {\n const slicesMap = useContext(SlicesMapContext)\n const slicesResultsMap = useContext(SlicesResultsContext)\n const concreteSliceName = slicesMap[sliceName]\n const slice = slicesResultsMap.get(concreteSliceName)\n\n if (!slice) {\n if (allowEmpty) {\n return null\n } else {\n throw new Error(\n `Slice \"${concreteSliceName}\" for \"${sliceName}\" slot not found`\n )\n }\n }\n\n return (\n \n {children}\n \n )\n}\n","\"use client\"\n\nimport React, { useContext } from \"react\"\nimport { ServerSlice } from \"./slice/server-slice\"\nimport { InlineSlice } from \"./slice/inline-slice\"\nimport { SlicesContext } from \"./slice/context\"\n\nexport function Slice(props) {\n if (process.env.GATSBY_SLICES) {\n // we use sliceName internally, so remap alias to sliceName\n const internalProps = {\n ...props,\n sliceName: props.alias,\n }\n delete internalProps.alias\n delete internalProps.__renderedByLocation\n\n const slicesContext = useContext(SlicesContext)\n\n // validate props\n const propErrors = validateSliceProps(props)\n if (Object.keys(propErrors).length) {\n throw new SlicePropsError(\n slicesContext.renderEnvironment === `browser`,\n internalProps.sliceName,\n propErrors,\n props.__renderedByLocation\n )\n }\n\n if (slicesContext.renderEnvironment === `server`) {\n return \n } else if (slicesContext.renderEnvironment === `browser`) {\n // in the browser, we'll just render the component as is\n return \n } else if (slicesContext.renderEnvironment === `engines`) {\n // if we're in SSR, we'll just render the component as is\n return \n } else if (slicesContext.renderEnvironment === `slices`) {\n // we are not yet supporting nested slices\n\n let additionalContextMessage = ``\n\n // just in case generating additional contextual information fails, we still want the base message to show\n // and not show another cryptic error message\n try {\n additionalContextMessage = `\\n\\nSlice component \"${slicesContext.sliceRoot.name}\" (${slicesContext.sliceRoot.componentPath}) tried to render `\n } catch {\n // don't need to handle it, we will just skip the additional context message if we fail to generate it\n }\n\n throw new Error(\n `Nested slices are not supported.${additionalContextMessage}\\n\\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices`\n )\n } else {\n throw new Error(\n `Slice context \"${slicesContext.renderEnvironment}\" is not supported.`\n )\n }\n } else {\n throw new Error(`Slices are disabled.`)\n }\n}\n\nclass SlicePropsError extends Error {\n constructor(inBrowser, sliceName, propErrors, renderedByLocation) {\n const errors = Object.entries(propErrors)\n .map(\n ([key, value]) =>\n `not serializable \"${value}\" type passed to \"${key}\" prop`\n )\n .join(`, `)\n\n const name = `SlicePropsError`\n let stack = ``\n let message = ``\n\n if (inBrowser) {\n // They're just (kinda) kidding, I promise... You can still work here <3\n // https://www.gatsbyjs.com/careers/\n const fullStack =\n React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack()\n\n // remove the first line of the stack trace\n const stackLines = fullStack.trim().split(`\\n`).slice(1)\n stackLines[0] = stackLines[0].trim()\n stack = `\\n` + stackLines.join(`\\n`)\n\n message = `Slice \"${sliceName}\" was passed props that are not serializable (${errors}).`\n } else {\n // we can't really grab any extra info outside of the browser, so just print what we can\n message = `${name}: Slice \"${sliceName}\" was passed props that are not serializable (${errors}).`\n const stackLines = new Error().stack.trim().split(`\\n`).slice(2)\n stack = `${message}\\n${stackLines.join(`\\n`)}`\n }\n\n super(message)\n this.name = name\n if (stack) {\n this.stack = stack\n } else {\n Error.captureStackTrace(this, SlicePropsError)\n }\n\n if (renderedByLocation) {\n this.forcedLocation = { ...renderedByLocation, functionName: `Slice` }\n }\n }\n}\n\nconst validateSliceProps = (\n props,\n errors = {},\n seenObjects = [],\n path = null\n) => {\n // recursively validate all props\n for (const [name, value] of Object.entries(props)) {\n if (\n value === undefined ||\n value === null ||\n (!path && name === `children`)\n ) {\n continue\n }\n\n const propPath = path ? `${path}.${name}` : name\n\n if (typeof value === `function`) {\n errors[propPath] = typeof value\n } else if (typeof value === `object` && seenObjects.indexOf(value) <= 0) {\n seenObjects.push(value)\n validateSliceProps(value, errors, seenObjects, propPath)\n }\n }\n\n return errors\n}\n","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport { default as PageRenderer } from \"./public-page-renderer\"\nexport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nexport {\n Link,\n withPrefix,\n withAssetPrefix,\n navigate,\n parsePath,\n} from \"gatsby-link\"\n\nexport { graphql, prefetchPathname }\nexport { StaticQuery, StaticQueryContext, useStaticQuery } from \"./static-query\"\nexport { Slice } from \"./slice\"\nexport * from \"gatsby-script\"\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const support = function (feature) {\n if (typeof document === `undefined`) {\n return false\n }\n const fakeLink = document.createElement(`link`)\n try {\n if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n return fakeLink.relList.supports(feature)\n }\n } catch (err) {\n return false\n }\n return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n return new Promise((resolve, reject) => {\n if (typeof document === `undefined`) {\n reject()\n return\n }\n\n const link = document.createElement(`link`)\n link.setAttribute(`rel`, `prefetch`)\n link.setAttribute(`href`, url)\n\n Object.keys(options).forEach(key => {\n link.setAttribute(key, options[key])\n })\n\n link.onload = resolve\n link.onerror = reject\n\n const parentElement =\n document.getElementsByTagName(`head`)[0] ||\n document.getElementsByName(`script`)[0].parentNode\n parentElement.appendChild(link)\n })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(`GET`, url, true)\n\n req.onload = () => {\n if (req.status === 200) {\n resolve()\n } else {\n reject()\n }\n }\n\n req.send(null)\n })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n ? linkPrefetchStrategy\n : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n return new Promise(resolve => {\n if (preFetched[url]) {\n resolve()\n return\n }\n\n supportedPrefetchStrategy(url, options)\n .then(() => {\n resolve()\n preFetched[url] = true\n })\n .catch(() => {}) // 404s are logged to the console anyway\n })\n}\n\nexport default prefetch\n","import { createFromReadableStream } from \"react-server-dom-webpack\"\nimport prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n /**\n * At least one of critical resources failed to load\n */\n Error: `error`,\n /**\n * Resources loaded successfully\n */\n Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n s = s[0] === `/` ? s.slice(1) : s\n s = s.endsWith(`/`) ? s.slice(0, -1) : s\n return s\n}\n\nconst createPageDataUrl = rawPath => {\n const [path, maybeSearch] = rawPath.split(`?`)\n const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json${\n maybeSearch ? `?${maybeSearch}` : ``\n }`\n}\n\n/**\n * Utility to check the path that goes into doFetch for e.g. potential malicious intentions.\n * It checks for \"//\" because with this you could do a fetch request to a different domain.\n */\nconst shouldAbortFetch = rawPath => rawPath.startsWith(`//`)\n\nfunction doFetch(url, method = `GET`) {\n return new Promise(resolve => {\n const req = new XMLHttpRequest()\n req.open(method, url, true)\n req.onreadystatechange = () => {\n if (req.readyState == 4) {\n resolve(req)\n }\n }\n req.send(null)\n })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n if (\n `connection` in navigator &&\n typeof navigator.connection !== `undefined`\n ) {\n if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n return false\n }\n if (navigator.connection.saveData) {\n return false\n }\n }\n return true\n}\n\n// Regex that matches common search crawlers\nconst BOT_REGEX = /bot|crawler|spider|crawling/i\n\nconst toPageResources = (pageData, component = null, head) => {\n const page = {\n componentChunkName: pageData.componentChunkName,\n path: pageData.path,\n webpackCompilationHash: pageData.webpackCompilationHash,\n matchPath: pageData.matchPath,\n staticQueryHashes: pageData.staticQueryHashes,\n getServerDataError: pageData.getServerDataError,\n slicesMap: pageData.slicesMap ?? {},\n }\n\n return {\n component,\n head,\n json: pageData.result,\n page,\n }\n}\n\nfunction waitForResponse(response) {\n return new Promise(resolve => {\n try {\n const result = response.readRoot()\n resolve(result)\n } catch (err) {\n if (\n Object.hasOwnProperty.call(err, `_response`) &&\n Object.hasOwnProperty.call(err, `_status`)\n ) {\n setTimeout(() => {\n waitForResponse(response).then(resolve)\n }, 200)\n } else {\n throw err\n }\n }\n })\n}\n\nexport class BaseLoader {\n constructor(loadComponent, matchPaths) {\n // Map of pagePath -> Page. Where Page is an object with: {\n // status: PageResourceStatus.Success || PageResourceStatus.Error,\n // payload: PageResources, // undefined if PageResourceStatus.Error\n // }\n // PageResources is {\n // component,\n // json: pageData.result,\n // page: {\n // componentChunkName,\n // path,\n // webpackCompilationHash,\n // staticQueryHashes\n // },\n // staticQueryResults\n // }\n this.pageDb = new Map()\n this.inFlightDb = new Map()\n this.staticQueryDb = {}\n this.pageDataDb = new Map()\n this.partialHydrationDb = new Map()\n this.slicesDataDb = new Map()\n this.sliceInflightDb = new Map()\n this.slicesDb = new Map()\n this.isPrefetchQueueRunning = false\n this.prefetchQueued = []\n this.prefetchTriggered = new Set()\n this.prefetchCompleted = new Set()\n this.loadComponent = loadComponent\n setMatchPaths(matchPaths)\n }\n\n inFlightNetworkRequests = new Map()\n\n memoizedGet(url) {\n let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n if (!inFlightPromise) {\n inFlightPromise = doFetch(url, `GET`)\n this.inFlightNetworkRequests.set(url, inFlightPromise)\n }\n\n // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n return inFlightPromise\n .then(response => {\n this.inFlightNetworkRequests.delete(url)\n return response\n })\n .catch(err => {\n this.inFlightNetworkRequests.delete(url)\n throw err\n })\n }\n\n setApiRunner(apiRunner) {\n this.apiRunner = apiRunner\n this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n }\n\n fetchPageDataJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.path === undefined) {\n throw new Error(`not a valid pageData response`)\n }\n\n const maybeSearch = pagePath.split(`?`)[1]\n if (maybeSearch && !jsonPayload.path.includes(maybeSearch)) {\n jsonPayload.path += `?${maybeSearch}`\n }\n\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: jsonPayload,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404/500 page and it doesn't exist, we're done\n if (pagePath === `/404.html` || pagePath === `/500.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPageDataJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, {\n pagePath: `/500.html`,\n internalServerError: true,\n })\n )\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n fetchPartialHydrationJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath).replace(`.json`, `-rsc.json`)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: responseText,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404/500 page and it doesn't exist, we're done\n if (pagePath === `/404.html` || pagePath === `/500.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, {\n pagePath: `/500.html`,\n internalServerError: true,\n })\n )\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n loadPageDataJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDataDb.has(pagePath)) {\n const pageData = this.pageDataDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPageDataJson({ pagePath }).then(pageData => {\n this.pageDataDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n loadPartialHydrationJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.partialHydrationDb.has(pagePath)) {\n const pageData = this.partialHydrationDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPartialHydrationJson({ pagePath }).then(pageData => {\n this.partialHydrationDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n loadSliceDataJson(sliceName) {\n if (this.slicesDataDb.has(sliceName)) {\n const jsonPayload = this.slicesDataDb.get(sliceName)\n return Promise.resolve({ sliceName, jsonPayload })\n }\n\n const url = `${__PATH_PREFIX__}/slice-data/${sliceName}.json`\n return doFetch(url, `GET`).then(res => {\n const jsonPayload = JSON.parse(res.responseText)\n\n this.slicesDataDb.set(sliceName, jsonPayload)\n return { sliceName, jsonPayload }\n })\n }\n\n findMatchPath(rawPath) {\n return findMatchPath(rawPath)\n }\n\n // TODO check all uses of this and whether they use undefined for page resources not exist\n loadPage(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const page = this.pageDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n if (page.error) {\n return Promise.resolve({\n error: page.error,\n status: page.status,\n })\n }\n\n return Promise.resolve(page.payload)\n }\n }\n\n if (this.inFlightDb.has(pagePath)) {\n return this.inFlightDb.get(pagePath)\n }\n\n const loadDataPromises = [\n this.loadAppData(),\n this.loadPageDataJson(pagePath),\n ]\n\n if (global.hasPartialHydration) {\n loadDataPromises.push(this.loadPartialHydrationJson(pagePath))\n }\n\n const inFlightPromise = Promise.all(loadDataPromises).then(allData => {\n const [appDataResponse, pageDataResponse, rscDataResponse] = allData\n\n if (\n pageDataResponse.status === PageResourceStatus.Error ||\n rscDataResponse?.status === PageResourceStatus.Error\n ) {\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n let pageData = pageDataResponse.payload\n\n const {\n componentChunkName,\n staticQueryHashes: pageStaticQueryHashes = [],\n slicesMap = {},\n } = pageData\n\n const finalResult = {}\n\n const dedupedSliceNames = Array.from(new Set(Object.values(slicesMap)))\n\n const loadSlice = slice => {\n if (this.slicesDb.has(slice.name)) {\n return this.slicesDb.get(slice.name)\n } else if (this.sliceInflightDb.has(slice.name)) {\n return this.sliceInflightDb.get(slice.name)\n }\n\n const inFlight = this.loadComponent(slice.componentChunkName).then(\n component => {\n return {\n component: preferDefault(component),\n sliceContext: slice.result.sliceContext,\n data: slice.result.data,\n }\n }\n )\n\n this.sliceInflightDb.set(slice.name, inFlight)\n inFlight.then(results => {\n this.slicesDb.set(slice.name, results)\n this.sliceInflightDb.delete(slice.name)\n })\n\n return inFlight\n }\n\n return Promise.all(\n dedupedSliceNames.map(sliceName => this.loadSliceDataJson(sliceName))\n ).then(slicesData => {\n const slices = []\n const dedupedStaticQueryHashes = [...pageStaticQueryHashes]\n\n for (const { jsonPayload, sliceName } of Object.values(slicesData)) {\n slices.push({ name: sliceName, ...jsonPayload })\n for (const staticQueryHash of jsonPayload.staticQueryHashes) {\n if (!dedupedStaticQueryHashes.includes(staticQueryHash)) {\n dedupedStaticQueryHashes.push(staticQueryHash)\n }\n }\n }\n\n const loadChunkPromises = [\n Promise.all(slices.map(loadSlice)),\n this.loadComponent(componentChunkName, `head`),\n ]\n\n if (!global.hasPartialHydration) {\n loadChunkPromises.push(this.loadComponent(componentChunkName))\n }\n\n // In develop we have separate chunks for template and Head components\n // to enable HMR (fast refresh requires single exports).\n // In production we have shared chunk with both exports. Double loadComponent here\n // will be deduped by webpack runtime resulting in single request and single module\n // being loaded for both `component` and `head`.\n // get list of components to get\n const componentChunkPromises = Promise.all(loadChunkPromises).then(\n components => {\n const [sliceComponents, headComponent, pageComponent] = components\n\n finalResult.createdAt = new Date()\n\n for (const sliceComponent of sliceComponents) {\n if (!sliceComponent || sliceComponent instanceof Error) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = sliceComponent\n }\n }\n\n if (\n !global.hasPartialHydration &&\n (!pageComponent || pageComponent instanceof Error)\n ) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = pageComponent\n }\n\n let pageResources\n\n if (finalResult.status !== PageResourceStatus.Error) {\n finalResult.status = PageResourceStatus.Success\n if (\n pageDataResponse.notFound === true ||\n rscDataResponse?.notFound === true\n ) {\n finalResult.notFound = true\n }\n pageData = Object.assign(pageData, {\n webpackCompilationHash: appDataResponse\n ? appDataResponse.webpackCompilationHash\n : ``,\n })\n\n if (typeof rscDataResponse?.payload === `string`) {\n pageResources = toPageResources(pageData, null, headComponent)\n\n pageResources.partialHydration = rscDataResponse.payload\n\n const readableStream = new ReadableStream({\n start(controller) {\n const te = new TextEncoder()\n controller.enqueue(te.encode(rscDataResponse.payload))\n },\n pull(controller) {\n // close on next read when queue is empty\n controller.close()\n },\n cancel() {},\n })\n\n return waitForResponse(\n createFromReadableStream(readableStream)\n ).then(result => {\n pageResources.partialHydration = result\n\n return pageResources\n })\n } else {\n pageResources = toPageResources(\n pageData,\n pageComponent,\n headComponent\n )\n }\n }\n\n // undefined if final result is an error\n return pageResources\n }\n )\n\n // get list of static queries to get\n const staticQueryBatchPromise = Promise.all(\n dedupedStaticQueryHashes.map(staticQueryHash => {\n // Check for cache in case this static query result has already been loaded\n if (this.staticQueryDb[staticQueryHash]) {\n const jsonPayload = this.staticQueryDb[staticQueryHash]\n return { staticQueryHash, jsonPayload }\n }\n\n return this.memoizedGet(\n `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n )\n .then(req => {\n const jsonPayload = JSON.parse(req.responseText)\n return { staticQueryHash, jsonPayload }\n })\n .catch(() => {\n throw new Error(\n `We couldn't load \"${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json\"`\n )\n })\n })\n ).then(staticQueryResults => {\n const staticQueryResultsMap = {}\n\n staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n staticQueryResultsMap[staticQueryHash] = jsonPayload\n this.staticQueryDb[staticQueryHash] = jsonPayload\n })\n\n return staticQueryResultsMap\n })\n\n return (\n Promise.all([componentChunkPromises, staticQueryBatchPromise])\n .then(([pageResources, staticQueryResults]) => {\n let payload\n if (pageResources) {\n payload = { ...pageResources, staticQueryResults }\n finalResult.payload = payload\n emitter.emit(`onPostLoadPageResources`, {\n page: payload,\n pageResources: payload,\n })\n }\n\n this.pageDb.set(pagePath, finalResult)\n\n if (finalResult.error) {\n return {\n error: finalResult.error,\n status: finalResult.status,\n }\n }\n\n return payload\n })\n // when static-query fail to load we throw a better error\n .catch(err => {\n return {\n error: err,\n status: PageResourceStatus.Error,\n }\n })\n )\n })\n })\n\n inFlightPromise\n .then(() => {\n this.inFlightDb.delete(pagePath)\n })\n .catch(error => {\n this.inFlightDb.delete(pagePath)\n throw error\n })\n\n this.inFlightDb.set(pagePath, inFlightPromise)\n\n return inFlightPromise\n }\n\n // returns undefined if the page does not exists in cache\n loadPageSync(rawPath, options = {}) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const pageData = this.pageDb.get(pagePath)\n\n if (pageData.payload) {\n return pageData.payload\n }\n\n if (options?.withErrorDetails) {\n return {\n error: pageData.error,\n status: pageData.status,\n }\n }\n }\n return undefined\n }\n\n shouldPrefetch(pagePath) {\n // Skip prefetching if we know user is on slow or constrained connection\n if (!doesConnectionSupportPrefetch()) {\n return false\n }\n\n // Don't prefetch if this is a crawler bot\n if (navigator.userAgent && BOT_REGEX.test(navigator.userAgent)) {\n return false\n }\n\n // Check if the page exists.\n if (this.pageDb.has(pagePath)) {\n return false\n }\n\n return true\n }\n\n prefetch(pagePath) {\n if (!this.shouldPrefetch(pagePath)) {\n return {\n then: resolve => resolve(false),\n abort: () => {},\n }\n }\n if (this.prefetchTriggered.has(pagePath)) {\n return {\n then: resolve => resolve(true),\n abort: () => {},\n }\n }\n\n const defer = {\n resolve: null,\n reject: null,\n promise: null,\n }\n defer.promise = new Promise((resolve, reject) => {\n defer.resolve = resolve\n defer.reject = reject\n })\n this.prefetchQueued.push([pagePath, defer])\n const abortC = new AbortController()\n abortC.signal.addEventListener(`abort`, () => {\n const index = this.prefetchQueued.findIndex(([p]) => p === pagePath)\n // remove from the queue\n if (index !== -1) {\n this.prefetchQueued.splice(index, 1)\n }\n })\n\n if (!this.isPrefetchQueueRunning) {\n this.isPrefetchQueueRunning = true\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n }\n\n return {\n then: (resolve, reject) => defer.promise.then(resolve, reject),\n abort: abortC.abort.bind(abortC),\n }\n }\n\n _processNextPrefetchBatch() {\n const idleCallback = window.requestIdleCallback || (cb => setTimeout(cb, 0))\n\n idleCallback(() => {\n const toPrefetch = this.prefetchQueued.splice(0, 4)\n const prefetches = Promise.all(\n toPrefetch.map(([pagePath, dPromise]) => {\n // Tell plugins with custom prefetching logic that they should start\n // prefetching this path.\n if (!this.prefetchTriggered.has(pagePath)) {\n this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n this.prefetchTriggered.add(pagePath)\n }\n\n // If a plugin has disabled core prefetching, stop now.\n if (this.prefetchDisabled) {\n return dPromise.resolve(false)\n }\n\n return this.doPrefetch(findPath(pagePath)).then(() => {\n if (!this.prefetchCompleted.has(pagePath)) {\n this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n this.prefetchCompleted.add(pagePath)\n }\n\n dPromise.resolve(true)\n })\n })\n )\n\n if (this.prefetchQueued.length) {\n prefetches.then(() => {\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n })\n } else {\n this.isPrefetchQueueRunning = false\n }\n })\n }\n\n doPrefetch(pagePath) {\n const pageDataUrl = createPageDataUrl(pagePath)\n\n if (global.hasPartialHydration) {\n return Promise.all([\n prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n ),\n prefetchHelper(pageDataUrl.replace(`.json`, `-rsc.json`), {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPartialHydrationJson(pagePath)\n ),\n ])\n } else {\n return prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n )\n }\n }\n\n hovering(rawPath) {\n this.loadPage(rawPath)\n }\n\n getResourceURLsForPathname(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDataDb.get(pagePath)\n if (page) {\n const pageResources = toPageResources(page.payload)\n\n return [\n ...createComponentUrls(pageResources.page.componentChunkName),\n createPageDataUrl(pagePath),\n ]\n } else {\n return null\n }\n }\n\n isPageNotFound(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDb.get(pagePath)\n return !page || page.notFound\n }\n\n loadAppData(retries = 0) {\n return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n req => {\n const { status, responseText } = req\n\n let appData\n\n if (status !== 200 && retries < 3) {\n // Retry 3 times incase of non-200 responses\n return this.loadAppData(retries + 1)\n }\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.webpackCompilationHash === undefined) {\n throw new Error(`not a valid app-data response`)\n }\n\n appData = jsonPayload\n } catch (err) {\n // continue regardless of error\n }\n }\n\n return appData\n }\n )\n }\n}\n\nconst createComponentUrls = componentChunkName =>\n (window.___chunkMapping[componentChunkName] || []).map(\n chunk => __PATH_PREFIX__ + chunk\n )\n\nexport class ProdLoader extends BaseLoader {\n constructor(asyncRequires, matchPaths, pageData) {\n const loadComponent = (chunkName, exportType = `components`) => {\n if (!global.hasPartialHydration) {\n exportType = `components`\n }\n\n if (!asyncRequires[exportType][chunkName]) {\n throw new Error(\n `We couldn't find the correct component chunk with the name \"${chunkName}\"`\n )\n }\n\n return (\n asyncRequires[exportType][chunkName]()\n // loader will handle the case when component is error\n .catch(err => err)\n )\n }\n\n super(loadComponent, matchPaths)\n\n if (pageData) {\n this.pageDataDb.set(findPath(pageData.path), {\n pagePath: pageData.path,\n payload: pageData,\n status: `success`,\n })\n }\n }\n\n doPrefetch(pagePath) {\n return super.doPrefetch(pagePath).then(result => {\n if (result.status !== PageResourceStatus.Success) {\n return Promise.resolve()\n }\n const pageData = result.payload\n const chunkName = pageData.componentChunkName\n const componentUrls = createComponentUrls(chunkName)\n return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n })\n }\n\n loadPageDataJson(rawPath) {\n return super.loadPageDataJson(rawPath).then(data => {\n if (data.notFound) {\n if (shouldAbortFetch(rawPath)) {\n return data\n }\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n\n loadPartialHydrationJson(rawPath) {\n return super.loadPartialHydrationJson(rawPath).then(data => {\n if (data.notFound) {\n if (shouldAbortFetch(rawPath)) {\n return data\n }\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n instance = _loader\n}\n\nexport const publicLoader = {\n enqueue: rawPath => instance.prefetch(rawPath),\n\n // Real methods\n getResourceURLsForPathname: rawPath =>\n instance.getResourceURLsForPathname(rawPath),\n loadPage: rawPath => instance.loadPage(rawPath),\n // TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\n loadPageSync: (rawPath, options = {}) =>\n instance.loadPageSync(rawPath, options),\n prefetch: rawPath => instance.prefetch(rawPath),\n isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n hovering: rawPath => instance.hovering(rawPath),\n loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n if (instance) {\n return instance.staticQueryDb\n } else {\n return {}\n }\n}\n\nexport function getSliceResults() {\n if (instance) {\n return instance.slicesDb\n } else {\n return {}\n }\n}\n","import { useEffect } from \"react\"\n\n/*\n * Calls callback in an effect and renders children\n */\nexport function FireCallbackInEffect({ children, callback }) {\n useEffect(() => {\n callback()\n })\n\n return children\n}\n","export const VALID_NODE_NAMES = [\n `link`,\n `meta`,\n `style`,\n `title`,\n `base`,\n `noscript`,\n `script`,\n `html`,\n `body`,\n]\n","import { VALID_NODE_NAMES } from \"./constants\"\n\n/**\n * Filter the props coming from a page down to just the ones that are relevant for head.\n * This e.g. filters out properties that are undefined during SSR.\n */\nexport function filterHeadProps(input) {\n return {\n location: {\n pathname: input.location.pathname,\n },\n params: input.params,\n data: input.data || {},\n serverData: input.serverData,\n pageContext: input.pageContext,\n }\n}\n\n/**\n * Throw error if Head export is not a valid\n */\nexport function headExportValidator(head) {\n if (typeof head !== `function`)\n throw new Error(\n `Expected \"Head\" export to be a function got \"${typeof head}\".`\n )\n}\n\n/**\n * Warn once for same messsage\n */\nlet warnOnce = _ => {}\nif (process.env.NODE_ENV !== `production`) {\n const warnings = new Set()\n warnOnce = msg => {\n if (!warnings.has(msg)) {\n console.warn(msg)\n }\n warnings.add(msg)\n }\n}\n\n/**\n * Warn for invalid tags in head.\n * @param {string} tagName\n */\nexport function warnForInvalidTags(tagName) {\n if (process.env.NODE_ENV !== `production`) {\n const warning = `<${tagName}> is not a valid head element. Please use one of the following: ${VALID_NODE_NAMES.join(\n `, `\n )}`\n\n warnOnce(warning)\n }\n}\n\n/**\n * When a `nonce` is present on an element, browsers such as Chrome and Firefox strip it out of the\n * actual HTML attributes for security reasons *when the element is added to the document*. Thus,\n * given two equivalent elements that have nonces, `Element,isEqualNode()` will return false if one\n * of those elements gets added to the document. Although the `element.nonce` property will be the\n * same for both elements, the one that was added to the document will return an empty string for\n * its nonce HTML attribute value.\n *\n * This custom `isEqualNode()` function therefore removes the nonce value from the `newTag` before\n * comparing it to `oldTag`, restoring it afterwards.\n *\n * For more information, see:\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1211471#c12\n */\nexport function isEqualNode(oldTag, newTag) {\n if (oldTag instanceof HTMLElement && newTag instanceof HTMLElement) {\n const nonce = newTag.getAttribute(`nonce`)\n // Only strip the nonce if `oldTag` has had it stripped. An element's nonce attribute will not\n // be stripped if there is no content security policy response header that includes a nonce.\n if (nonce && !oldTag.getAttribute(`nonce`)) {\n const cloneTag = newTag.cloneNode(true)\n cloneTag.setAttribute(`nonce`, ``)\n cloneTag.nonce = nonce\n return nonce === oldTag.nonce && oldTag.isEqualNode(cloneTag)\n }\n }\n\n return oldTag.isEqualNode(newTag)\n}\n\nexport function diffNodes({ oldNodes, newNodes, onStale, onNew }) {\n for (const existingHeadElement of oldNodes) {\n const indexInNewNodes = newNodes.findIndex(e =>\n isEqualNode(e, existingHeadElement)\n )\n\n if (indexInNewNodes === -1) {\n onStale(existingHeadElement)\n } else {\n // this node is re-created as-is, so we keep old node, and remove it from list of new nodes (as we handled it already here)\n newNodes.splice(indexInNewNodes, 1)\n }\n }\n\n // remaing new nodes didn't have matching old node, so need to be added\n for (const newNode of newNodes) {\n onNew(newNode)\n }\n}\n","import React from \"react\"\nimport { useEffect } from \"react\"\nimport { StaticQueryContext } from \"gatsby\"\nimport { LocationProvider } from \"@gatsbyjs/reach-router\"\nimport { reactDOMUtils } from \"../react-dom-utils\"\nimport { FireCallbackInEffect } from \"./components/fire-callback-in-effect\"\nimport { VALID_NODE_NAMES } from \"./constants\"\nimport {\n headExportValidator,\n filterHeadProps,\n warnForInvalidTags,\n diffNodes,\n} from \"./utils\"\n\nconst hiddenRoot = document.createElement(`div`)\nconst htmlAttributesList = new Set()\nconst bodyAttributesList = new Set()\n\nconst removePrevHtmlAttributes = () => {\n htmlAttributesList.forEach(attributeName => {\n const elementTag = document.getElementsByTagName(`html`)[0]\n elementTag.removeAttribute(attributeName)\n })\n}\n\nconst removePrevBodyAttributes = () => {\n bodyAttributesList.forEach(attributeName => {\n const elementTag = document.getElementsByTagName(`body`)[0]\n elementTag.removeAttribute(attributeName)\n })\n}\n\nconst updateAttribute = (\n tagName,\n attributeName,\n attributeValue,\n attributesList\n) => {\n const elementTag = document.getElementsByTagName(tagName)[0]\n\n if (!elementTag) {\n return\n }\n\n elementTag.setAttribute(attributeName, attributeValue)\n attributesList.add(attributeName)\n}\n\nconst removePrevHeadElements = () => {\n const prevHeadNodes = document.querySelectorAll(`[data-gatsby-head]`)\n\n for (const node of prevHeadNodes) {\n node.parentNode.removeChild(node)\n }\n}\n\nconst onHeadRendered = () => {\n const validHeadNodes = []\n const seenIds = new Map()\n\n for (const node of hiddenRoot.childNodes) {\n const nodeName = node.nodeName.toLowerCase()\n const id = node.attributes?.id?.value\n\n if (!VALID_NODE_NAMES.includes(nodeName)) {\n warnForInvalidTags(nodeName)\n continue\n }\n\n if (nodeName === `html`) {\n for (const attribute of node.attributes) {\n updateAttribute(\n `html`,\n attribute.name,\n attribute.value,\n htmlAttributesList\n )\n }\n continue\n }\n\n if (nodeName === `body`) {\n for (const attribute of node.attributes) {\n updateAttribute(\n `body`,\n attribute.name,\n attribute.value,\n bodyAttributesList\n )\n }\n continue\n }\n\n let clonedNode = node.cloneNode(true)\n clonedNode.setAttribute(`data-gatsby-head`, true)\n\n // Create an element for scripts to make script work\n if (clonedNode.nodeName.toLowerCase() === `script`) {\n const script = document.createElement(`script`)\n for (const attr of clonedNode.attributes) {\n script.setAttribute(attr.name, attr.value)\n }\n script.innerHTML = clonedNode.innerHTML\n clonedNode = script\n }\n\n if (id) {\n if (!seenIds.has(id)) {\n validHeadNodes.push(clonedNode)\n seenIds.set(id, validHeadNodes.length - 1)\n } else {\n const indexOfPreviouslyInsertedNode = seenIds.get(id)\n validHeadNodes[indexOfPreviouslyInsertedNode].parentNode?.removeChild(\n validHeadNodes[indexOfPreviouslyInsertedNode]\n )\n validHeadNodes[indexOfPreviouslyInsertedNode] = clonedNode\n\n continue\n }\n } else {\n validHeadNodes.push(clonedNode)\n }\n }\n\n const existingHeadElements = document.querySelectorAll(`[data-gatsby-head]`)\n\n if (existingHeadElements.length === 0) {\n document.head.append(...validHeadNodes)\n return\n }\n\n const newHeadNodes = []\n diffNodes({\n oldNodes: existingHeadElements,\n newNodes: validHeadNodes,\n onStale: node => node.parentNode.removeChild(node),\n onNew: node => newHeadNodes.push(node),\n })\n\n document.head.append(...newHeadNodes)\n}\n\nif (process.env.BUILD_STAGE === `develop`) {\n // sigh ... and elements are not valid descedents of
(our hidden element)\n // react-dom in dev mode will warn about this. There doesn't seem to be a way to render arbitrary\n // user Head without hitting this issue (our hidden element could be just \"new Document()\", but\n // this can only have 1 child, and we don't control what is being rendered so that's not an option)\n // instead we continue to render to
, and just silence warnings for and elements\n // https://github.com/facebook/react/blob/e2424f33b3ad727321fc12e75c5e94838e84c2b5/packages/react-dom-bindings/src/client/validateDOMNesting.js#L498-L520\n const originalConsoleError = console.error.bind(console)\n console.error = (...args) => {\n if (\n Array.isArray(args) &&\n args.length >= 2 &&\n args[0]?.includes(`validateDOMNesting(...): %s cannot appear as`) &&\n (args[1] === `` || args[1] === ``)\n ) {\n return undefined\n }\n return originalConsoleError(...args)\n }\n\n // We set up observer to be able to regenerate after react-refresh\n // updates our hidden element.\n const observer = new MutationObserver(onHeadRendered)\n observer.observe(hiddenRoot, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n })\n}\n\nexport function headHandlerForBrowser({\n pageComponent,\n staticQueryResults,\n pageComponentProps,\n}) {\n useEffect(() => {\n if (pageComponent?.Head) {\n headExportValidator(pageComponent.Head)\n\n const { render } = reactDOMUtils()\n\n const Head = pageComponent.Head\n\n render(\n // just a hack to call the callback after react has done first render\n // Note: In dev, we call onHeadRendered twice( in FireCallbackInEffect and after mutualution observer dectects initail render into hiddenRoot) this is for hot reloading\n // In Prod we only call onHeadRendered in FireCallbackInEffect to render to head\n \n \n \n \n \n \n ,\n hiddenRoot\n )\n }\n\n return () => {\n removePrevHeadElements()\n removePrevHtmlAttributes()\n removePrevBodyAttributes()\n }\n })\n}\n","import React, { Suspense, createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\nimport { headHandlerForBrowser } from \"./head/head-export-handler-for-browser\"\n\n// Renders page\nfunction PageRenderer(props) {\n const pageComponentProps = {\n ...props,\n params: {\n ...grabMatchParams(props.location.pathname),\n ...props.pageResources.json.pageContext.__params,\n },\n }\n\n const preferDefault = m => (m && m.default) || m\n\n let pageElement\n if (props.pageResources.partialHydration) {\n pageElement = props.pageResources.partialHydration\n } else {\n pageElement = createElement(preferDefault(props.pageResources.component), {\n ...pageComponentProps,\n key: props.path || props.pageResources.page.path,\n })\n }\n\n const pageComponent = props.pageResources.head\n\n headHandlerForBrowser({\n pageComponent,\n staticQueryResults: props.pageResources.staticQueryResults,\n pageComponentProps,\n })\n\n const wrappedPage = apiRunner(\n `wrapPageElement`,\n {\n element: pageElement,\n props: pageComponentProps,\n },\n pageElement,\n ({ result }) => {\n return { element: result, props: pageComponentProps }\n }\n ).pop()\n\n return wrappedPage\n}\n\nPageRenderer.propTypes = {\n location: PropTypes.object.isRequired,\n pageResources: PropTypes.object.isRequired,\n data: PropTypes.object,\n pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n id: `gatsby-announcer`,\n style: {\n position: `absolute`,\n top: 0,\n width: 1,\n height: 1,\n padding: 0,\n overflow: `hidden`,\n clip: `rect(0, 0, 0, 0)`,\n whiteSpace: `nowrap`,\n border: 0,\n },\n \"aria-live\": `assertive`,\n \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport {\n navigate as reachNavigate,\n globalHistory,\n} from \"@gatsbyjs/reach-router\"\nimport { parsePath } from \"gatsby-link\"\n\nfunction maybeRedirect(pathname) {\n const redirect = maybeGetBrowserRedirect(pathname)\n const { hash, search } = window.location\n\n if (redirect != null) {\n window.___replace(redirect.toPath + search + hash)\n return true\n } else {\n return false\n }\n}\n\n// Catch unhandled chunk loading errors and force a restart of the app.\nlet nextRoute = ``\n\nwindow.addEventListener(`unhandledrejection`, event => {\n if (/loading chunk \\d* failed./i.test(event.reason)) {\n if (nextRoute) {\n window.location.pathname = nextRoute\n }\n }\n})\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n nextRoute = location.pathname\n apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onRouteUpdate`, { location, prevLocation })\n if (\n process.env.GATSBY_QUERY_ON_DEMAND &&\n process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n ) {\n emitter.emit(`onRouteUpdate`, { location, prevLocation })\n }\n }\n}\n\nconst navigate = (to, options = {}) => {\n // Support forward/backward navigation with numbers\n // navigate(-2) (jumps back 2 history steps)\n // navigate(2) (jumps forward 2 history steps)\n if (typeof to === `number`) {\n globalHistory.navigate(to)\n return\n }\n\n const { pathname, search, hash } = parsePath(to)\n const redirect = maybeGetBrowserRedirect(pathname)\n\n // If we're redirecting, just replace the passed in pathname\n // to the one we want to redirect to.\n if (redirect) {\n to = redirect.toPath + search + hash\n }\n\n // If we had a service worker update, no matter the path, reload window and\n // reset the pathname whitelist\n if (window.___swUpdated) {\n window.location = pathname + search + hash\n return\n }\n\n // Start a timer to wait for a second before transitioning and showing a\n // loader in case resources aren't around yet.\n const timeoutId = setTimeout(() => {\n emitter.emit(`onDelayedLoadPageResources`, { pathname })\n apiRunner(`onRouteUpdateDelayed`, {\n location: window.location,\n })\n }, 1000)\n\n loader.loadPage(pathname + search).then(pageResources => {\n // If no page resources, then refresh the page\n // Do this, rather than simply `window.location.reload()`, so that\n // pressing the back/forward buttons work - otherwise when pressing\n // back, the browser will just change the URL and expect JS to handle\n // the change, which won't always work since it might not be a Gatsby\n // page.\n if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n window.history.replaceState({}, ``, location.href)\n window.location = pathname\n clearTimeout(timeoutId)\n return\n }\n\n // If the loaded page has a different compilation hash to the\n // window, then a rebuild has occurred on the server. Reload.\n if (process.env.NODE_ENV === `production` && pageResources) {\n if (\n pageResources.page.webpackCompilationHash !==\n window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n window.location = pathname + search + hash\n }\n }\n reachNavigate(to, options)\n clearTimeout(timeoutId)\n })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n const { pathname, hash } = location\n const results = apiRunner(`shouldUpdateScroll`, {\n prevRouterProps,\n // `pathname` for backwards compatibility\n pathname,\n routerProps: { location },\n getSavedScrollPosition: args => [\n 0,\n // FIXME this is actually a big code smell, we should fix this\n // eslint-disable-next-line @babel/no-invalid-this\n this._stateStorage.read(args, args.key),\n ],\n })\n if (results.length > 0) {\n // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n // @see https://github.com/gatsbyjs/gatsby/issues/12038\n return results[results.length - 1]\n }\n\n if (prevRouterProps) {\n const {\n location: { pathname: oldPathname },\n } = prevRouterProps\n if (oldPathname === pathname) {\n // Scroll to element if it exists, if it doesn't, or no hash is provided,\n // scroll to top.\n return hash ? decodeURI(hash.slice(1)) : [0, 0]\n }\n }\n return true\n}\n\nfunction init() {\n // The \"scroll-behavior\" package expects the \"action\" to be on the location\n // object so let's copy it over.\n globalHistory.listen(args => {\n args.location.action = args.action\n })\n\n window.___push = to => navigate(to, { replace: false })\n window.___replace = to => navigate(to, { replace: true })\n window.___navigate = (to, options) => navigate(to, options)\n}\n\nclass RouteAnnouncer extends React.Component {\n constructor(props) {\n super(props)\n this.announcementRef = React.createRef()\n }\n\n componentDidUpdate(prevProps, nextProps) {\n requestAnimationFrame(() => {\n let pageName = `new page at ${this.props.location.pathname}`\n if (document.title) {\n pageName = document.title\n }\n const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n if (pageHeadings && pageHeadings.length) {\n pageName = pageHeadings[0].textContent\n }\n const newAnnouncement = `Navigated to ${pageName}`\n if (this.announcementRef.current) {\n const oldAnnouncement = this.announcementRef.current.innerText\n if (oldAnnouncement !== newAnnouncement) {\n this.announcementRef.current.innerText = newAnnouncement\n }\n }\n })\n }\n\n render() {\n return
\n }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n if (prevLocation.href !== nextLocation.href) {\n return true\n }\n\n if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n return true\n }\n\n return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n constructor(props) {\n super(props)\n onPreRouteUpdate(props.location, null)\n }\n\n componentDidMount() {\n onRouteUpdate(this.props.location, null)\n }\n\n shouldComponentUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onPreRouteUpdate(this.props.location, prevProps.location)\n return true\n }\n return false\n }\n\n componentDidUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onRouteUpdate(this.props.location, prevProps.location)\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n \n )\n }\n}\n\nRouteUpdates.propTypes = {\n location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates, maybeGetBrowserRedirect }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n constructor(props) {\n super()\n const { location, pageResources } = props\n this.state = {\n location: { ...location },\n pageResources:\n pageResources ||\n loader.loadPageSync(location.pathname + location.search, {\n withErrorDetails: true,\n }),\n }\n }\n\n static getDerivedStateFromProps({ location }, prevState) {\n if (prevState.location.href !== location.href) {\n const pageResources = loader.loadPageSync(\n location.pathname + location.search,\n {\n withErrorDetails: true,\n }\n )\n\n return {\n pageResources,\n location: { ...location },\n }\n }\n\n return {\n location: { ...location },\n }\n }\n\n loadResources(rawPath) {\n loader.loadPage(rawPath).then(pageResources => {\n if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n this.setState({\n location: { ...window.location },\n pageResources,\n })\n } else {\n window.history.replaceState({}, ``, location.href)\n window.location = rawPath\n }\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n // Always return false if we're missing resources.\n if (!nextState.pageResources) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n if (\n process.env.BUILD_STAGE === `develop` &&\n nextState.pageResources.stale\n ) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n // Check if the component or json have changed.\n if (this.state.pageResources !== nextState.pageResources) {\n return true\n }\n if (\n this.state.pageResources.component !== nextState.pageResources.component\n ) {\n return true\n }\n\n if (this.state.pageResources.json !== nextState.pageResources.json) {\n return true\n }\n // Check if location has changed on a page using internal routing\n // via matchPath configuration.\n if (\n this.state.location.key !== nextState.location.key &&\n nextState.pageResources.page &&\n (nextState.pageResources.page.matchPath ||\n nextState.pageResources.page.path)\n ) {\n return true\n }\n return shallowCompare(this, nextProps, nextState)\n }\n\n render() {\n if (\n process.env.NODE_ENV !== `production` &&\n (!this.state.pageResources ||\n this.state.pageResources.status === PageResourceStatus.Error)\n ) {\n const message = `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n if (this.state.pageResources?.error) {\n console.error(message)\n throw this.state.pageResources.error\n }\n\n throw new Error(message)\n }\n\n return this.props.children(this.state)\n }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport { Router, navigate, Location, BaseContext } from \"@gatsbyjs/reach-router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport { StaticQueryContext } from \"./static-query\"\nimport {\n SlicesMapContext,\n SlicesContext,\n SlicesResultsContext,\n} from \"./slice/context\"\nimport {\n shouldUpdateScroll,\n init as navigationInit,\n RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n setLoader,\n ProdLoader,\n publicLoader,\n PageResourceStatus,\n getStaticQueryResults,\n getSliceResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\nimport { reactDOMUtils } from \"./react-dom-utils\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths, window.pageData)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nconst { render, hydrate } = reactDOMUtils()\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\nconst reloadStorageKey = `gatsby-reload-compilation-hash-match`\n\napiRunnerAsync(`onClientEntry`).then(() => {\n // Let plugins register a service worker. The plugin just needs\n // to return true.\n if (apiRunner(`registerServiceWorker`).filter(Boolean).length > 0) {\n require(`./register-service-worker`)\n }\n\n // In gatsby v2 if Router is used in page using matchPaths\n // paths need to contain full path.\n // For example:\n // - page have `/app/*` matchPath\n // - inside template user needs to use `/app/xyz` as path\n // Resetting `basepath`/`baseuri` keeps current behaviour\n // to not introduce breaking change.\n // Remove this in v3\n const RouteHandler = props => (\n \n \n \n )\n\n const DataContext = React.createContext({})\n\n const slicesContext = {\n renderEnvironment: `browser`,\n }\n\n class GatsbyRoot extends React.Component {\n render() {\n const { children } = this.props\n return (\n \n {({ location }) => (\n \n {({ pageResources, location }) => {\n const staticQueryResults = getStaticQueryResults()\n const sliceResults = getSliceResults()\n\n return (\n \n \n \n \n \n {children}\n \n \n \n \n \n )\n }}\n \n )}\n \n )\n }\n }\n\n class LocationHandler extends React.Component {\n render() {\n return (\n \n {({ pageResources, location }) => (\n \n \n \n \n \n \n \n )}\n \n )\n }\n }\n\n const { pagePath, location: browserLoc } = window\n\n // Explicitly call navigate if the canonical path (window.pagePath)\n // is different to the browser path (window.location.pathname). SSR\n // page paths might include search params, while SSG and DSG won't.\n // If page path include search params we also compare query params.\n // But only if NONE of the following conditions hold:\n //\n // - The url matches a client side route (page.matchPath)\n // - it's a 404 page\n // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n if (\n pagePath &&\n __BASE_PATH__ + pagePath !==\n browserLoc.pathname + (pagePath.includes(`?`) ? browserLoc.search : ``) &&\n !(\n loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n pagePath.match(/^\\/(404|500)(\\/?|.html)$/) ||\n pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n )\n ) {\n navigate(\n __BASE_PATH__ +\n pagePath +\n (!pagePath.includes(`?`) ? browserLoc.search : ``) +\n browserLoc.hash,\n {\n replace: true,\n }\n )\n }\n\n // It's possible that sessionStorage can throw an exception if access is not granted, see https://github.com/gatsbyjs/gatsby/issues/34512\n const getSessionStorage = () => {\n try {\n return sessionStorage\n } catch {\n return null\n }\n }\n\n publicLoader.loadPage(browserLoc.pathname + browserLoc.search).then(page => {\n const sessionStorage = getSessionStorage()\n\n if (\n page?.page?.webpackCompilationHash &&\n page.page.webpackCompilationHash !== window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n // We have not matching html + js (inlined `window.___webpackCompilationHash`)\n // with our data (coming from `app-data.json` file). This can cause issues such as\n // errors trying to load static queries (as list of static queries is inside `page-data`\n // which might not match to currently loaded `.js` scripts).\n // We are making attempt to reload if hashes don't match, but we also have to handle case\n // when reload doesn't fix it (possibly broken deploy) so we don't end up in infinite reload loop\n if (sessionStorage) {\n const isReloaded = sessionStorage.getItem(reloadStorageKey) === `1`\n\n if (!isReloaded) {\n sessionStorage.setItem(reloadStorageKey, `1`)\n window.location.reload(true)\n return\n }\n }\n }\n\n if (sessionStorage) {\n sessionStorage.removeItem(reloadStorageKey)\n }\n\n if (!page || page.status === PageResourceStatus.Error) {\n const message = `page resources for ${browserLoc.pathname} not found. Not rendering React`\n\n // if the chunk throws an error we want to capture the real error\n // This should help with https://github.com/gatsbyjs/gatsby/issues/19618\n if (page && page.error) {\n console.error(message)\n throw page.error\n }\n\n throw new Error(message)\n }\n\n const SiteRoot = apiRunner(\n `wrapRootElement`,\n { element: },\n ,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n const App = function App() {\n const onClientEntryRanRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!onClientEntryRanRef.current) {\n onClientEntryRanRef.current = true\n if (performance.mark) {\n performance.mark(`onInitialClientRender`)\n }\n\n apiRunner(`onInitialClientRender`)\n }\n }, [])\n\n return {SiteRoot}\n }\n\n const focusEl = document.getElementById(`gatsby-focus-wrapper`)\n\n // Client only pages have any empty body so we just do a normal\n // render to avoid React complaining about hydration mis-matches.\n let defaultRenderer = render\n if (focusEl && focusEl.children.length) {\n defaultRenderer = hydrate\n }\n\n const renderer = apiRunner(\n `replaceHydrateFunction`,\n undefined,\n defaultRenderer\n )[0]\n\n function runRender() {\n const rootElement =\n typeof window !== `undefined`\n ? document.getElementById(`___gatsby`)\n : null\n\n renderer(, rootElement)\n }\n\n // https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n // TODO remove IE 10 support\n const doc = document\n if (\n doc.readyState === `complete` ||\n (doc.readyState !== `loading` && !doc.documentElement.doScroll)\n ) {\n setTimeout(function () {\n runRender()\n }, 0)\n } else {\n const handler = function () {\n doc.removeEventListener(`DOMContentLoaded`, handler, false)\n window.removeEventListener(`load`, handler, false)\n\n runRender()\n }\n\n doc.addEventListener(`DOMContentLoaded`, handler, false)\n window.addEventListener(`load`, handler, false)\n }\n\n return\n })\n})\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n const pageResources = loader.loadPageSync(location.pathname)\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","const map = new WeakMap()\n\nexport function reactDOMUtils() {\n const reactDomClient = require(`react-dom/client`)\n\n const render = (Component, el) => {\n let root = map.get(el)\n if (!root) {\n map.set(el, (root = reactDomClient.createRoot(el)))\n }\n root.render(Component)\n }\n\n const hydrate = (Component, el) => reactDomClient.hydrateRoot(el, Component)\n\n return { render, hydrate }\n}\n","import redirects from \"./redirects.json\"\n\n// Convert to a map for faster lookup in maybeRedirect()\n\nconst redirectMap = new Map()\nconst redirectIgnoreCaseMap = new Map()\n\nredirects.forEach(redirect => {\n if (redirect.ignoreCase) {\n redirectIgnoreCaseMap.set(redirect.fromPath, redirect)\n } else {\n redirectMap.set(redirect.fromPath, redirect)\n }\n})\n\nexport function maybeGetBrowserRedirect(pathname) {\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n return redirect\n}\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n window.location.protocol !== `https:` &&\n window.location.hostname !== `localhost`\n) {\n console.error(\n `Service workers can only be used over HTTPS, or on localhost for development`\n )\n} else if (`serviceWorker` in navigator) {\n navigator.serviceWorker\n .register(`${__BASE_PATH__}/sw.js`)\n .then(function (reg) {\n reg.addEventListener(`updatefound`, () => {\n apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n // The updatefound event implies that reg.installing is set; see\n // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n const installingWorker = reg.installing\n console.log(`installingWorker`, installingWorker)\n installingWorker.addEventListener(`statechange`, () => {\n switch (installingWorker.state) {\n case `installed`:\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and the fresh content will\n // have been added to the cache.\n\n // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n window.___swUpdated = true\n // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n // If resources failed for the current page, reload.\n if (window.___failedResources) {\n console.log(`resources failed, SW updated - reloading`)\n window.location.reload()\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a \"Content is cached for offline use.\" message.\n console.log(`Content is now available offline!`)\n\n // Post to service worker that install is complete.\n // Delay to allow time for the event listener to be added --\n // otherwise fetch is called too soon and resources aren't cached.\n apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n }\n break\n\n case `redundant`:\n console.error(`The installing service worker became redundant.`)\n apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n break\n\n case `activated`:\n apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n break\n }\n })\n })\n })\n .catch(function (e) {\n console.error(`Error during service worker registration:`, e)\n })\n}\n","import React from \"react\"\n\nconst SlicesResultsContext = React.createContext({})\nconst SlicesContext = React.createContext({})\nconst SlicesMapContext = React.createContext({})\nconst SlicesPropsContext = React.createContext({})\n\nexport {\n SlicesResultsContext,\n SlicesContext,\n SlicesMapContext,\n SlicesPropsContext,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport { createServerOrClientContext } from \"./context-utils\"\n\nconst StaticQueryContext = createServerOrClientContext(`StaticQuery`, {})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nlet warnedAboutStaticQuery = false\n\n// TODO(v6): Remove completely\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n if (process.env.NODE_ENV === `development` && !warnedAboutStaticQuery) {\n console.warn(\n `The component is deprecated and will be removed in Gatsby v6. Use useStaticQuery instead. Refer to the migration guide for more information: https://gatsby.dev/migrating-4-to-5/#staticquery--is-deprecated`\n )\n warnedAboutStaticQuery = true\n }\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n // TODO(v5): Remove since we require React >= 18\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n\n const context = React.useContext(StaticQueryContext)\n\n // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n // catch the misuse of the API and give proper direction\n if (isNaN(Number(query))) {\n throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n }\n\n if (context[query]?.data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nexport { StaticQuery, StaticQueryContext, useStaticQuery }\n","import React from \"react\"\n\n// Ensure serverContext is not created more than once as React will throw when creating it more than once\n// https://github.com/facebook/react/blob/dd2d6522754f52c70d02c51db25eb7cbd5d1c8eb/packages/react/src/ReactServerContext.js#L101\nconst createServerContext = (name, defaultValue = null) => {\n /* eslint-disable no-undef */\n if (!globalThis.__SERVER_CONTEXT) {\n globalThis.__SERVER_CONTEXT = {}\n }\n\n if (!globalThis.__SERVER_CONTEXT[name]) {\n globalThis.__SERVER_CONTEXT[name] = React.createServerContext(\n name,\n defaultValue\n )\n }\n\n return globalThis.__SERVER_CONTEXT[name]\n}\n\nfunction createServerOrClientContext(name, defaultValue) {\n if (React.createServerContext) {\n return createServerContext(name, defaultValue)\n }\n\n return React.createContext(defaultValue)\n}\n\nexport { createServerOrClientContext }\n","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n if (!prefix) {\n return str\n }\n\n if (str === prefix) {\n return `/`\n }\n\n if (str.startsWith(`${prefix}/`)) {\n return str.slice(prefix.length)\n }\n\n return str\n}\n","export const onRouteUpdate = ({\n location\n}, pluginOptions = {\n stripQueryString: false\n}) => {\n const domElem = document.querySelector(`link[rel='canonical']`);\n const existingValue = domElem.getAttribute(`href`);\n const baseProtocol = domElem.getAttribute(`data-baseProtocol`);\n const baseHost = domElem.getAttribute(`data-baseHost`);\n\n if (existingValue && baseProtocol && baseHost) {\n let value = `${baseProtocol}//${baseHost}${location.pathname}`;\n const {\n stripQueryString\n } = pluginOptions;\n\n if (!stripQueryString) {\n value += location.search;\n }\n\n value += location.hash;\n domElem.setAttribute(`href`, `${value}`);\n }\n};","/* global __MANIFEST_PLUGIN_HAS_LOCALISATION__ */\nimport { withPrefix } from \"gatsby\";\nimport getManifestForPathname from \"./get-manifest-pathname\"; // when we don't have localisation in our manifest, we tree shake everything away\n\nexport const onRouteUpdate = function onRouteUpdate({\n location\n}, pluginOptions) {\n if (__MANIFEST_PLUGIN_HAS_LOCALISATION__) {\n const {\n localize\n } = pluginOptions;\n const manifestFilename = getManifestForPathname(location.pathname, localize, true);\n const manifestEl = document.head.querySelector(`link[rel=\"manifest\"]`);\n\n if (manifestEl) {\n manifestEl.setAttribute(`href`, withPrefix(manifestFilename));\n }\n }\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _gatsby = require(\"gatsby\");\n\n/**\n * Get a manifest filename depending on localized pathname\n *\n * @param {string} pathname\n * @param {Array<{start_url: string, lang: string}>} localizedManifests\n * @param {boolean} shouldPrependPathPrefix\n * @return string\n */\nvar _default = (pathname, localizedManifests, shouldPrependPathPrefix = false) => {\n const defaultFilename = `manifest.webmanifest`;\n\n if (!Array.isArray(localizedManifests)) {\n return defaultFilename;\n }\n\n const localizedManifest = localizedManifests.find(app => {\n let startUrl = app.start_url;\n\n if (shouldPrependPathPrefix) {\n startUrl = (0, _gatsby.withPrefix)(startUrl);\n }\n\n return pathname.startsWith(startUrl);\n });\n\n if (!localizedManifest) {\n return defaultFilename;\n }\n\n return `manifest_${localizedManifest.lang}.webmanifest`;\n};\n\nexports.default = _default;","\"use strict\";\n\nexports.DEFAULT_OPTIONS = {\n maxWidth: 650,\n wrapperStyle: \"\",\n backgroundColor: \"white\",\n linkImagesToOriginal: true,\n showCaptions: false,\n markdownCaptions: false,\n withWebp: false,\n withAvif: false,\n tracedSVG: false,\n loading: \"lazy\",\n decoding: \"async\",\n disableBgImageOnAlpha: false,\n disableBgImage: false\n};\nexports.EMPTY_ALT = \"GATSBY_EMPTY_ALT\";\nexports.imageClass = \"gatsby-resp-image-image\";\nexports.imageWrapperClass = \"gatsby-resp-image-wrapper\";\nexports.imageBackgroundClass = \"gatsby-resp-image-background-image\";","\"use strict\";\n\nvar _require = require(\"./constants\"),\n DEFAULT_OPTIONS = _require.DEFAULT_OPTIONS,\n imageClass = _require.imageClass,\n imageBackgroundClass = _require.imageBackgroundClass,\n imageWrapperClass = _require.imageWrapperClass;\n\nexports.onRouteUpdate = function (apiCallbackContext, pluginOptions) {\n var options = Object.assign({}, DEFAULT_OPTIONS, pluginOptions);\n var imageWrappers = document.querySelectorAll(\".\" + imageWrapperClass); // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\n // for cross-browser looping through NodeList without polyfills\n\n var _loop = function _loop(i) {\n var imageWrapper = imageWrappers[i];\n var backgroundElement = imageWrapper.querySelector(\".\" + imageBackgroundClass);\n var imageElement = imageWrapper.querySelector(\".\" + imageClass);\n\n var onImageLoad = function onImageLoad() {\n backgroundElement.style.transition = \"opacity 0.5s 0.5s\";\n imageElement.style.transition = \"opacity 0.5s\";\n onImageComplete();\n };\n\n var onImageComplete = function onImageComplete() {\n backgroundElement.style.opacity = 0;\n imageElement.style.opacity = 1;\n imageElement.style.color = \"inherit\";\n imageElement.style.boxShadow = \"inset 0px 0px 0px 400px \" + options.backgroundColor;\n imageElement.removeEventListener(\"load\", onImageLoad);\n imageElement.removeEventListener(\"error\", onImageComplete);\n };\n\n imageElement.style.opacity = 0;\n imageElement.addEventListener(\"load\", onImageLoad);\n imageElement.addEventListener(\"error\", onImageComplete);\n\n if (imageElement.complete) {\n onImageComplete();\n }\n };\n\n for (var i = 0; i < imageWrappers.length; i++) {\n _loop(i);\n }\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * @license React\n * react-server-dom-webpack.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var k=require(\"react\"),l={stream:!0},n=new Map,p=Symbol.for(\"react.element\"),q=Symbol.for(\"react.lazy\"),r=Symbol.for(\"react.default_value\"),t=k.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ContextRegistry;function u(a){t[a]||(t[a]=k.createServerContext(a,r));return t[a]}function v(a,b,c){this._status=a;this._value=b;this._response=c}v.prototype.then=function(a){0===this._status?(null===this._value&&(this._value=[]),this._value.push(a)):a()};\nfunction w(a){switch(a._status){case 3:return a._value;case 1:var b=JSON.parse(a._value,a._response._fromJSON);a._status=3;return a._value=b;case 2:b=a._value;for(var c=b.chunks,d=0;d {\n const { forward = [], ...filteredConfig } = config || {};\n const configStr = JSON.stringify(filteredConfig, (k, v) => {\n if (typeof v === 'function') {\n v = String(v);\n if (v.startsWith(k + '(')) {\n v = 'function ' + v;\n }\n }\n return v;\n });\n return [\n `!(function(w,p,f,c){`,\n Object.keys(filteredConfig).length > 0\n ? `c=w[p]=Object.assign(w[p]||{},${configStr});`\n : `c=w[p]=w[p]||{};`,\n `c[f]=(c[f]||[])`,\n forward.length > 0 ? `.concat(${JSON.stringify(forward)})` : ``,\n `})(window,'partytown','forward');`,\n snippetCode,\n ].join('');\n};\n\n/**\n * The `type` attribute for Partytown scripts, which does two things:\n *\n * 1. Prevents the `Contact | Skohub Blog

Contact

Contact via e-mail and feel free to open issues in the different repositories of Skohub Editor, Skohub Vocabs, Skohub Pubsub and Skohub Extension, not only for bugs or enhancements, but also questions about Skohub usage, or to share your experiences.

+ + \ No newline at end of file diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000..bef5e0c Binary files /dev/null and b/favicon-32x32.png differ diff --git a/framework-f5cf36c7d70977c4e569.js b/framework-f5cf36c7d70977c4e569.js new file mode 100644 index 0000000..c2b6541 --- /dev/null +++ b/framework-f5cf36c7d70977c4e569.js @@ -0,0 +1,3 @@ +/*! For license information please see framework-f5cf36c7d70977c4e569.js.LICENSE.txt */ +(self.webpackChunkskohub_blog=self.webpackChunkskohub_blog||[]).push([[774],{2703:function(e,n,t){"use strict";var r=t(414);function l(){}function a(){}a.resetWarningCache=l,e.exports=function(){function e(e,n,t,l,a,o){if(o!==r){var u=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw u.name="Invariant Violation",u}}function n(){return e}e.isRequired=e;var t={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:n,element:e,elementType:e,instanceOf:n,node:e,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:a,resetWarningCache:l};return t.PropTypes=t,t}},5697:function(e,n,t){e.exports=t(2703)()},414:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:function(e,n,t){"use strict";var r=t(7294),l=t(3840);function a(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;t
\n

Note that currently the index will only return URIs associated with the search term, not the corresponding labels. This will change in a future update.

","frontmatter":{"title":"Presenting the SkoHub Vocabs Prototype","date":"September 27, 2019","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}],"description":"An introducatory post to SkoHub Vocabs."}},"previous":{"fields":{"slug":"/2019-05-17-skohub/"},"frontmatter":{"title":"SkoHub: Enabling KOS-based content subscription"}},"next":{"fields":{"slug":"/2020-01-29-skohub-talk-at-swib19/"},"frontmatter":{"title":"SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub"}}},"pageContext":{"id":"06d8681b-f2a7-504d-abe6-bda80b826cc8","previousPostId":"489f8de8-6e66-5dbf-af18-bf10abc74e20","nextPostId":"c06e00ef-a3aa-51cf-b522-3c4e20079efd"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2020-01-29-skohub-talk-at-swib19/page-data.json b/page-data/2020-01-29-skohub-talk-at-swib19/page-data.json new file mode 100644 index 0000000..491d44f --- /dev/null +++ b/page-data/2020-01-29-skohub-talk-at-swib19/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020-01-29-skohub-talk-at-swib19/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"c06e00ef-a3aa-51cf-b522-3c4e20079efd","excerpt":"On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in Hamburg (SWIB19).","html":"

On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in Hamburg (SWIB19).

\n
","frontmatter":{"title":"SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub","date":"January 29, 2020","authors":[{"lastname":"Pohl","firstname":"Adrian"}],"description":null}},"previous":{"fields":{"slug":"/2019-09-27-skohub-vocabs/"},"frontmatter":{"title":"Presenting the SkoHub Vocabs Prototype"}},"next":{"fields":{"slug":"/2020-03-31-skohub-editor/"},"frontmatter":{"title":"Presenting the SkoHub Editor"}}},"pageContext":{"id":"c06e00ef-a3aa-51cf-b522-3c4e20079efd","previousPostId":"06d8681b-f2a7-504d-abe6-bda80b826cc8","nextPostId":"3f590c02-dbe3-5472-b3e9-0a71e9ac4b31"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2020-03-31-skohub-editor/page-data.json b/page-data/2020-03-31-skohub-editor/page-data.json new file mode 100644 index 0000000..da17f4c --- /dev/null +++ b/page-data/2020-03-31-skohub-editor/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020-03-31-skohub-editor/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"3f590c02-dbe3-5472-b3e9-0a71e9ac4b31","excerpt":"ⓘ Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub Editor demo for an indefinite time. However, the code is…","html":"
\n

Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub Editor demo for an indefinite time. However, the code is still there for anybody to set up their own instance.

\n
\n

In a previous blog post we presented a first SkoHub module: SkoHub Vocabs. Before talking about another module, first a short summary of the features SkoHub Vocabs offers. Basically, it provides an editorial workflow to publish a SKOS vocabulary on the web which can then be consumed by humans and applications. It builds on git-based online software development platforms (currently GitHub and GitLab are supported) where you maintain a SKOS vocabulary as a Turtle file. This allows you to use all the associated features such as branches and pull requests for a full-fledged review process. With every new commit in a branch, triggered by a webhook, SkoHub Vocabs will build a static site for the vocab – with HTML for human consumption and JSON-LD for consumption by applications.

\n

In this post, we present SkoHub Editor (demo, code) that is accompanied by a browser extension. In a nutshell, SkoHub Editor enables the automatic generation of a web form based on a JSON schema, along with the possibility to look up terms in a controlled vocabulary that is published with SkoHub Vocabs. Additionally, metadata generated by the editor can be published using SkoHub PubSub, which we will describe in an upcoming post. Let’s take a look at the specifics by configuring an editor that lets you create JSON-LD describing an open educational resource (OER) on the web.

\n

Describing a resource with the browser extension

\n

Let’s start with actually using SkoHub Editor. You will have the most comfortable experience when using the SkoHub browser extension that wraps the SkoHub Editor and pre-populates some field in the web form. The browser extension is available both for Firefox and Chrome. Just add the extension to your browser and a little icon will be shown on the right-hand side of your navigation bar:

\n

\n \n \n \n \n \n \n
SkoHub extension in the sidebar of the browser with fields 'URL', 'Title' and 'Description' being pre-populated
\n

\n

We can now add additional metadata by selecting a type (VideoObject in this case), add a creator, creation date, language etc. As we mentioned, you can look up a subject from a controlled vocabulary for some fields in the web form. You will experience this when inputting content into the fields “Subject”, “License”, “Learning Resource Type”, and “Intended Audience”. For those fields you will get a drop down with suggestions from a controlled vocabulary, e.g. for “Subject” from a German classification of subjects in Higher education that is published with SkoHub Vocabs.

\n

\n \n \n \n <Input property=\"title\" />\n <Textarea property=\"description\" />\n <button type=\"submit\">Publish</button>\n</Form>
\n

Obviously it would be tedious to manually code all the inputs for a given schema. This is where the Builder comes into play. It reads a schema and creates all necessary input components:

\n
<Form\n  data={{title: ''}}\n  onSubmit={console.log}\n>\n  <Builder schema={{\n    \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n    \"title\": \"My JSON schema\",\n    \"type\": \"object\",\n    \"properties\": {\n      \"title\": {\n        \"type\": \"string\",\n        \"title\": \"Title\"\n      },\n      \"description\": {\n        \"type\": \"string\",\n        \"title\": \"Description\",\n        \"_widget\": \"Textarea\"\n      }\n    }\n  }} />\n  <button type=\"submit\">Publish</button>\n</Form>
\n

The browser extension is essentially a simple wrapper for the editor running at https://skohub.io/editor/, which the extension injects as an iframe into the current page. Additionally, before the iframe is injected, some metadata is scraped from that page. This data is used to pre-populate the editor. This process obviously depends both on the data found in the web page and on the schema the editor is configured to use. YouTube for example uses meta name=\"description\" for data about YouTube itself rather than the actual video, which is described in meta property=\"og:description\". Even if the correct metadata is extracted, there is no guarantee that the schema used to configure the editor even has a description field. In the future, it would be nice to find a possibility to somehow map page metadata to properties in the schema itself.

\n

Outlook

\n

SkoHub Editor already works very well and can be extremely useful. However, some things are still work in progress and will need some future effort to be improved:

\n
    \n
  • Using schema.org markup for pre-population: This might sound obvious but we have not implemented it yet, see #17.
  • \n
  • Further issues: See also the issues at https://github.com/hbz/skohub-editor/issues for further ideas for improvement.
  • \n
\n

Furthermore, some work will have to be put into the current default schema and the controlled vocabularies it uses:

\n
    \n
  • Develop JSON Schema: The JSON Schema definitely is not finished yet. For example, it makes sense to include http://schema.org/keywords in the future for adding arbitrary tags to describe a resource. We plan to develop the schema within the common OER metadata group of DINI AG KIM & Jointly with a focus on describing OER in the German-speaking world.
  • \n
  • Improve Vocabularies: For “Learning Resource Type” and “Intended Audience” we are using controlled vocabularies that are not nearly finished but in development at the LRMI Task Group of the Dublin Core Metadata Initiative (DCMI). Trying out the browser extension, you will for instance see that the educational resources types are missing some options. However, we assume that the combination of SkoHub Editor & SkoHub Vocabs makes a pretty nice environment for the development of these vocabularies in an open and transparent process on GitHub or GitLab.
  • \n
\n

Get involved

\n

Please try it out and let us know what doesn’t work or which feature you are missing and also what you like about SkoHub. We are happy about every bug report, suggestion and feature requests for the production version. Get in contact with us via a hypothes.is annotation, GitHub, Email, Mastodon or IRC.

","frontmatter":{"title":"Presenting the SkoHub Editor","date":"March 31, 2020","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}],"description":"An introducatory post to SkoHub Editor."}},"previous":{"fields":{"slug":"/2020-01-29-skohub-talk-at-swib19/"},"frontmatter":{"title":"SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub"}},"next":{"fields":{"slug":"/2020-06-25-skohub-pubsub/"},"frontmatter":{"title":"Presenting SkoHub PubSub"}}},"pageContext":{"id":"3f590c02-dbe3-5472-b3e9-0a71e9ac4b31","previousPostId":"c06e00ef-a3aa-51cf-b522-3c4e20079efd","nextPostId":"8222f844-ed14-527d-aaad-85f396f7f114"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2020-06-25-skohub-pubsub/page-data.json b/page-data/2020-06-25-skohub-pubsub/page-data.json new file mode 100644 index 0000000..4256670 --- /dev/null +++ b/page-data/2020-06-25-skohub-pubsub/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020-06-25-skohub-pubsub/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"8222f844-ed14-527d-aaad-85f396f7f114","excerpt":"ⓘ Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub PubSub demo server at skohub.io for an indefinite time…","html":"
\n

Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub PubSub demo server at skohub.io for an indefinite time. However, the code is still there for anybody to set up their own instance.

\n
\n

In the previous blog posts we have presented SkoHub Vocabs and SkoHub Editor. In the final post of this SkoHub introduction series we will take a deeper look at SkoHub PubSub, the part of SkoHub that brings the novel approach of KOS-based content subscription into the game.

\n

Let’s refresh what SkoHub is about by quoting the gist from the project homepage:

\n
\n

SkoHub supports a novel approach for finding content on the web. The general idea is to extend the scope of Knowledge Organization Systems (KOS) to also act as communication hubs for publishers and information seekers. In effect, SkoHub allows to follow specific subjects in order to be notified when new content about that subject is published.

\n
\n

Before diving into the technical implementation and protocols used, we provide an example on how this subscription, publication and notification process can be carried out in practice. Although SkoHub PubSub constitutes the core of the SkoHub infrastructure being the module that brings all SkoHub components together, it is not visible to end users by itself but only through applications which send out notifications or subscribe to a specific topic. (This is the great thing about open standards as it also invites everybody to develop new clients for specific use cases!)

\n

So, let’s take a look at an example workflow involving SkoHub Editor and the federated microblogging service Mastodon to demonstrate the functionalities.

\n

Subscribing to a subject

\n

In one of the already mentioned blog posts we exemplarily published the Educational Subjects Classification with SkoHub Vocabs. Now, let’s take a look at a single subject from this classification, e.g. Library, information and archival studies:

\n

\n \n \n \n \n \n \n
Screenshot of the HTML version of a SKOS concept published with SkoHub.
\n

\n

On the left-hand side, you can see the location of the topic in the classification hierarchy. On the right-hand side, there is some basic information on the subject: It has a URI (https://w3id.org/class/esc/n0322), a notation (0322), a preferred label (Library, information and archival studies) and an inbox. This is how the underlying JSON data (e.g. by adding the format suffix .json to the URI) looks like:

\n
{\n  \"id\":\"https://w3id.org/class/esc/n0322\",\n  \"type\":\"Concept\",\n  \"followers\":\"https://skohub.io/followers?subject=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322\",\n  \"inbox\":\"https://skohub.io/inbox?actor=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322\",\n  \"prefLabel\":{\n    \"en\":\"Library, information and archival studies\"\n  },\n  \"notation\":[\n    \"0322\"\n  ],\n  \"broader\":{\n    \"id\":\"https://w3id.org/class/esc/n032\",\n    \"prefLabel\":{\n      \"en\":\"Journalism and information\"\n    }\n  },\n  \"inScheme\":{\n    \"id\":\"https://w3id.org/class/esc/scheme\",\n    \"title\":{\n      \"en\":\"Educational Subjects Classification\"\n    }\n  }\n}
\n

Besides the usual SKOS properties, the followers key gives a hint that I can somehow follow this subject. Clicking on the associated URL, I will see a JSON file containing the list of followers of this subject. I am also interested in this topic and want to follow it to receive notifications about new online resources that are published and tagged with this subject. How do I achieve this?

\n

As already noted, what I need is an application that speaks ActivityPub. In this case we will use one of the most popular services in the Fediverse: Mastodon. So, I open up my Mastodon client and put the topic URI into the search box:

\n

\n \n \n \n \n \n \n
Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox
\n

\n

Then, I fire up the extension when visiting the web page I like to share and add data to the input form:

\n

\n \n \n \n \n \n \n
Describing a resource with the SkoHub Editor browser extension
\n

\n

I select the topic “Library, information and archival studies” from the suggestions in the “subject” field, add information on licensing etc. and click “Publish”. A pop up lets me know that the resource is published to “Library, information and archival studies”. In the background, the description of the resource is sent to the respective topic (it could be more than one) which distributes the information to all its subscribers. Thus, in the end I as a subscriber of the topic will receive a notification of the resource in my Mastodon timeline:

\n

\n \n \n \n \n \n
First slide of SkoHub presentation at LIS Workshop 2021
\n

\n

Last Friday afternoon, the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) took place organized by the Working Group within the GfKL – Data Science Society. Adrian and Steffen had the chance to present SkoHub in the workshop’s first presentation. The slides can be viewed at https://pad.gwdg.de/p/lis-workshop21-skohub.

\n

Here is an overview over the full programme that comprised six talks:

\n
    \n
  • Adrian Pohl (hbz, Cologne, Germany) & Steffen Rörtgen (GWDG, Göttingen, Germany): SkoHub: Publishing and using knowledge organization systems on the web
  • \n
  • Colin Higgins (University of Cambridge, Cambridge, United Kingdom): Justice, governance, and the thesaurus – the Cambridge experience with ‘illegal aliens’
  • \n
  • Gislene Rodrigues da Silva & Célia da Consolação Dias (Universidade Federal de Minas Gerais, Belo Horizonte Brasil): Subjective aspects of indexing photographs from visual communication using a reading model based on the complex method and the primary functions of the image
  • \n
  • Heidrun Wiesenmüller (Stuttgart Media University, Stuttgart, Germany): Orientation and exploration – the presentation of subject headings in German catalog
  • \n
  • Karin Schmidgall (Deutsches Literaturarchiv Marbach, Marbach, Germany) & Matthias Finck (Effective Webwork, Hamburg, Germany): Glückliche Funde - ein Katalog der Forschende auf neue Ideen und Pfade bringt
  • \n
  • Julijana Nadj-Guttandin (Deutsche Nationalbibliothek, Frankfurt, Germany) & Sarah Pielmeier (University and State Library, Münster, Germany): Ein neues und modulares Regelwerk für die verbale Inhaltserschließung / A new and modular standard for subject indexing
  • \n
\n

The workshop happened as part of the virtual conference “Data Science, Statistics & Visualisation and European Conference on Data Analysis 2021” (DSSV-ECDA 2021). The promotion for the workshop could probably have been better, e.g. the presentations weren’t even listed in the regular DSSV-ECDA programme. In the end, the speakers and moderators were among themselves with little additional audience. However, the talks discussed interesting topics and discussion was lively.

","frontmatter":{"title":"SkoHub Presentation at LIS Workshop 2021","date":"July 12, 2021","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}],"description":"Short report about the SkoHub presentation at the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) organized by the Working Group within the GfKL – Data Science Society."}},"previous":{"fields":{"slug":"/2020-11-25-swib20-workshop/"},"frontmatter":{"title":"SkoHub workshop at SWIB20"}},"next":{"fields":{"slug":"/2021-12-10-skohub-vocabs-workshops/"},"frontmatter":{"title":"SKOS Introduction workshops with SkoHub Vocabs"}}},"pageContext":{"id":"39c26922-f4be-583b-8b7f-13c3d81f5ae2","previousPostId":"deea6c17-69ed-5006-958f-40a429cfd5b3","nextPostId":"0bf040bb-65b5-5017-ba79-c0ae92357322"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2022-05-eww-project-kickoff/page-data.json b/page-data/2022-05-eww-project-kickoff/page-data.json new file mode 100644 index 0000000..06c4b2a --- /dev/null +++ b/page-data/2022-05-eww-project-kickoff/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022-05-eww-project-kickoff/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"f786e1a6-675a-5f6f-b095-2bd4d1840b4f","excerpt":"In a kickoff workshop, the SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some pending issues…","html":"

In a kickoff workshop, the SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some pending issues regarding both functionality and design of SkoHub Vocabs. The issues and progress of the project can be followed in a Kanban board.

\n

\n \n \n \n \n
The Backlog, Ready and Working columns of the project's Kanban board as of 2022-05-19
\n

\n

A big part of the project will concern a new functionality to support the grouping of concepts by creating SKOS collection pages (Issue #159). Another central goal of the cooperation is a redesign of the static sites that are generated by SkoHub Vocabs. Finally, a logo is to be developed for the SkoHub softwar suite that will hopefully capture the spirit of the software and the community behind it. We are looking forward to presenting the results within the next months.

\n

The team from effective WEBWORK consists of software developers, a librarian and a designer whose skills overlap with those of the SkoHub community in many ways and especially regarding their enthusiasm for open source solutions. We are looking forward to this collaboration!

","frontmatter":{"title":"Collaborating on improving SkoHub Vocabs","date":"May 19, 2022","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Christensen","firstname":"Anne"}],"description":"The SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some pending issues regarding both functionality and design of SkoHub Vocabs."}},"previous":{"fields":{"slug":"/2021-12-10-skohub-vocabs-workshops/"},"frontmatter":{"title":"SKOS Introduction workshops with SkoHub Vocabs"}},"next":{"fields":{"slug":"/2022-11-skohub-workshop/"},"frontmatter":{"title":"Things are moving at SkoHub"}}},"pageContext":{"id":"f786e1a6-675a-5f6f-b095-2bd4d1840b4f","previousPostId":"0bf040bb-65b5-5017-ba79-c0ae92357322","nextPostId":"1cb80f09-aece-5c58-a7d5-e9621e40df98"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2022-11-skohub-workshop/page-data.json b/page-data/2022-11-skohub-workshop/page-data.json new file mode 100644 index 0000000..5b444c6 --- /dev/null +++ b/page-data/2022-11-skohub-workshop/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022-11-skohub-workshop/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"1cb80f09-aece-5c58-a7d5-e9621e40df98","excerpt":"In this blog post we want to introduce to you a new member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub…","html":"

In this blog post we want to introduce to you a new member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub as well as invite you to a workshop to present and discuss our future plans for the SkoHub project.

\n

After some time with not much happening (or even with shutting down some SkoHub services), we are happy to inform about a lot of movement in the space. We already announced the current project with the effective WEBWORK team to develop a new logo, improve the design and fix some minor issues in SkoHub. We are happy about the improvements made. Watch this space for more details in an upcoming post.

\n

Welcome, Steffen!

\n

We are very happy to welcome Steffen Rörtgen in the open infrastructure team at the Hochschulbibliothekszentrum NRW who has joined the team this November. In his former projects he already made heavy use of SkoHub Vocabs and contributed to the project. He will now focus on further SkoHub development in context of the Metadaten.nrw project which is funded by the Ministry of Culture and Science of North Rhine-Westphalia (MKW).

\n

With the grant for this project, we have resources for further development and would like to discuss with you our plans, especially regarding the use of SkoHub for reconciliation and the ActivityPub-based publish/subscribe approach (SkoHub PubSub). Having already defined some work packages within the Metadaten.nrw project we would like to align these with use cases and ideas the SkoHub community has.

\n

Upcoming workshop

\n

Therefore we are happy to invite you to a small workshop on Thursday, the 17th of November. We will start at 10:00h CET and split the workshop into two parts with each one lasting about two hours:

\n

In the first part we will give an overview of the past and current developments of SkoHub as well as an introduction to the Metadaten.nrw project and its plans for SkoHub. At the end of the first part we want to discuss use cases for the publish/subscripe approach of SkoHub as well as for reconciliation. Our community member Andreas Wagner already developed a prototype for reconciliation with SkoHub, which he will present.

\n

In the second part of the workshop we will then deep dive into the reconciliation topic. We will discuss Andreas’ approach and develop a roadmap for SkoHub to implement the desired reconciliation functionalities.

\n

For more details, see the pad with the preliminary agenda.

\n

If you are interested in the workshop, please send an email to skohub@hbz-nrw.de\nand give us a note if you are joining the whole workshop or just the first part.

\n

Please be aware that we won’t give a general introduction to SkoHub and expect you to be familiar with SKOS and the approach of SkoHub.

","frontmatter":{"title":"Things are moving at SkoHub","date":"November 04, 2022","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}],"description":"We welcome a new team member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub and invite people to a SkoHub planning workshop."}},"previous":{"fields":{"slug":"/2022-05-eww-project-kickoff/"},"frontmatter":{"title":"Collaborating on improving SkoHub Vocabs"}},"next":{"fields":{"slug":"/2022-12-02-new-look/"},"frontmatter":{"title":"Have U Seen The New Look?"}}},"pageContext":{"id":"1cb80f09-aece-5c58-a7d5-e9621e40df98","previousPostId":"f786e1a6-675a-5f6f-b095-2bd4d1840b4f","nextPostId":"828b5508-2825-568c-8588-621b7f3cb941"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2022-12-02-new-look/page-data.json b/page-data/2022-12-02-new-look/page-data.json new file mode 100644 index 0000000..4851a9e --- /dev/null +++ b/page-data/2022-12-02-new-look/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022-12-02-new-look/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"828b5508-2825-568c-8588-621b7f3cb941","excerpt":"We are happy to announce the new SkoHub logo and design we have deployed right in time for our SWIB22 workshop on Wednesday! In the last months, Kai Mertens and…","html":"

We are happy to announce the new SkoHub logo and design we have deployed right in time for our SWIB22 workshop on Wednesday! In the last months, Kai Mertens and effective WEBWORK helped to work out this new look in the context of the project we have announced earlier. We have now updated the SkoHub website, this blog and the default SkoHub Vocabs setup to incorporate the new logo and design.

\n

Here is an example of how a vocabulary built with SkoHub Vocabs will look now with this default design:

\n

\n \n \n \n \n
The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects
\n

\n

I looks much clearer and more modern than before. We also love the new logo. Kai did a great job creating the new logo and design while not totally breaking with the previous look. We created an extra repo at https://github.com/skohub-io/skohub-logo for the logo and related files. In the next days, we will add some more documentation, especially on how to configure a customized version for your own SkoHub Vocabs instance.

","frontmatter":{"title":"Have U Seen The New Look?","date":"December 02, 2022","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}],"description":"We are happy to launch the new SkoHub logo and design developed with help by Kai Mertens and effective WEBWORK"}},"previous":{"fields":{"slug":"/2022-11-skohub-workshop/"},"frontmatter":{"title":"Things are moving at SkoHub"}},"next":{"fields":{"slug":"/2022-12-19-workshop-summary/"},"frontmatter":{"title":"Notes from the November workshop"}}},"pageContext":{"id":"828b5508-2825-568c-8588-621b7f3cb941","previousPostId":"1cb80f09-aece-5c58-a7d5-e9621e40df98","nextPostId":"c45557b7-0901-5b47-8e00-548ea748b6f9"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2022-12-19-workshop-summary/page-data.json b/page-data/2022-12-19-workshop-summary/page-data.json new file mode 100644 index 0000000..0c0e436 --- /dev/null +++ b/page-data/2022-12-19-workshop-summary/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022-12-19-workshop-summary/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"c45557b7-0901-5b47-8e00-548ea748b6f9","excerpt":"Due to new funding for SkoHub development we conducted – as previously announced – a workshop on the 17th of November. About 15 participants from three…","html":"

Due to new funding for SkoHub development we conducted – as previously announced – a workshop on the 17th of November. About 15 participants from three different countries joined updates and discussion around the following topics:

\n
    \n
  1. Current state of SkoHub
  2. \n
  3. Introduction of Metadaten.nrw project
  4. \n
  5. Collection of requirements from the community regarding PubSub and reconciliation
  6. \n
  7. Presentation of SkoHub Reconcile prototype by Andreas Wagner
  8. \n
\n

We split the workshop in two parts. First, we gave a general overview about the current state of SkoHub and the renewed funding through the Metadaten.nrw project. Then we had a general discussion about SkoHub PubSub – the module to connect a SKOS vocab with the Fediverse – as well as Andreas Wagner’s Reconciliation prototype. See also the slides for the first part of the workshop.

\n

In the second half Andreas gave us a technical deep dive into his reconciliation prototype, walked us through the code and we discussed the architecture as well as future development and integration into the SkoHub ecosystem.

\n

In the following, we will go deeper into what happened in the different parts.

\n

Current state of SkoHub

\n

Currently, SkoHub Vocabs is by far the most used SkoHub module. It is used by the hbz, the metadata standardization groups around KIM, WirLernenOnline, The Institute for Educational Quality Improvement (IQB), in research projects in the area of digital humanities and by other people and institutes to publish their controlled vocabularies.

\n

The browser plugin SkoHub Editor as well as the PubSub module haven’t been used in production yet and have been shut down temporarily in March 2022 due to missing resources.

\n

In 2022 the work on SkoHub started again when we partnered with effective WEBWORK (eWW) to redesign the web pages, create a new logo, improve UI configuration and address other issues as for example the support of skos:Collection. (See the project kanban for an overview.)

\n

Decouple software and services

\n

The general idea is to further decouple the software “SkoHub” from its running instances. Therefore we also wanted eWW to work on UI configuration possibilities, so other institutes or projects can easily brand their SkoHub instance.

\n

In the future, we will move the hosted instance, currently running at skohub.io to metadaten.nrw, the project which grants the further development of SkoHub.

\n

Metadaten.nrw

\n

In the end of 2021 hbz secured some funding by the Ministry of Culture and Science of North Rhine-Westphalia (MKW) for a project called Metadaten.nrw. It consists of two sub-projects, with one called “Infrastructure Initiative Metadata Services” being located in the Open Infrastructure team (OI) at hbz, where SkoHub development will take place.

\n

We got four positions funded from which two are already filled, amongst them Steffen for SkoHub development. The goal of the project is to expand the community of users for the existing metadata infrastructure provided by hbz/OI, with focus on libraries and scholars in North Rhine-Westphalia (NRW), and to establish hbz as a competence center for metadata in NRW.

\n

Accordingly, we plan to develop SkoHub further regarding the following topics:

\n
    \n
  • Fediverse integration: Further development of SkoHub PubSub in the context of a concrete use case
  • \n
  • Reconciliation: Bringing the SkoHub reconciliation module into production
  • \n
  • Possibly support Annif integration in a later project phase
  • \n
  • Offer SkoHub tutorials and workshops
  • \n
\n

Community, PubSub & Reconciliation

\n

To further encourage contributions like the one from Andreas with the reconciliation prototype, we will set up contributing guidelines to have a clear and transparent definition of the development and deployment processes.

\n

SkoHub PubSub

\n

Afterwards we made a small (re)introduction to SkoHub PubSub and discussed possible use cases. We developed ideas about SkoHub PubSub serving as a communication hub between researchers for their research fields. Raphaëlle Lapotre came up with a conrete use case. They currently have some pains in the context of Timel Thesaurus, an indexing Thesaurus for huge amounts of digitized pictures of medieval iconography. Currently, there are problems with the task of storing the large amounts of images centrally in a repository. Researchers could hold the files locally in their NextCloud and publish the image metadata to inboxes of SKOS concepts. A central service could then listen to the data provided by each concept’s inbox and then display the metadata with a link pointing to the image in its storage location. There are actually two possible use cases : one with the digitized illuminations pictures of the Ahloma lab (EHESS, sample), the second one with painted ceilings pictures from all the mediterranean area, collected by an association of scholars and retired volunteers. Possibly, the support for ActivityPub in Nextcloud could help with such a project.

\n

Another topic was the idea of community building around concepts. The Open Educational Resource Search Index (OERSI) as well as the WirLernenOnline project already use elaborated vocabularies to index their resources. Interested humans could easily follow these concepts and engage in discussions around them.

\n

This is also applicable to researchers that will be able to build up a topic-specific data base and open discussions about their research in the fediverse. This also rose practical questions about what happens on the notification side with broader and narrower concepts. If I’m following a concept do I also want to get notifications about its narrower or broader concepts? These are questions that can be discussed further in our community.

\n

SkoHub Reconciliation

\n

Following the PubSub discussion Andreas presented his reconciliation prototype. The reconciliation prototype is based on the Reconciliation API spec developed by the W3C Entity Reconciliation Community Group, so it is interoperable and can be used in any kind of application that acts as a reconciliation client. Andreas implementation already worked in OpenRefine as well as in TEI Publisher’s annotation tool. After showing the implementation with some examples we went into a technical deep dive.

\n

Andreas walked us through the code and we discussed the current implementation as well as the future architecture of the SkoHub modules. His current approach is based on the SkoHub Vocabs webhook part and lending code from SkoHub PubSub regarding the elasticsearch indexing.

\n

The discussion resulted in the proposal to separate SkoHub Vocabs from the webhook module and by this further separate concerns of the respective modules. He integrated a doreconc query parameter to the webhook, which triggers a script that will populate the vocabulary to the reconcile prototype.

\n

After the workshop we transferred the skohub-reconcile repository from Andreas to the SkoHub organization and are happy to start further developing it in 2023.

\n

Final thoughts

\n

The workshop was a great event to discuss with SkoHub users and those who want to be. We collected valuable feedback and ideas for development in the upcoming two years.\nEspecially the sudden rise in awareness for the Fediverse opens up interesting use cases for SkoHub PubSub, which we are happy to engage in. The highlight of the workshop was the presentation of Andreas’ reconciliation prototype and its transfer in the SkoHub organization. This is a good example for the benefits of open source and use case driven development.

\n

We are looking forward to future community events, more use cases and even more modules to be developed in the SkoHub ecosystem.

\n

More links:

\n","frontmatter":{"title":"Notes from the November workshop","date":"December 19, 2022","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}],"description":null}},"previous":{"fields":{"slug":"/2022-12-02-new-look/"},"frontmatter":{"title":"Have U Seen The New Look?"}},"next":{"fields":{"slug":"/2023-02-09-tests-updated/"},"frontmatter":{"title":"Moving to test-driven development and updating existing tests"}}},"pageContext":{"id":"c45557b7-0901-5b47-8e00-548ea748b6f9","previousPostId":"828b5508-2825-568c-8588-621b7f3cb941","nextPostId":"a9ca1438-2e05-5355-8e06-72fe48377acc"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2023-02-09-tests-updated/page-data.json b/page-data/2023-02-09-tests-updated/page-data.json new file mode 100644 index 0000000..5e489fc --- /dev/null +++ b/page-data/2023-02-09-tests-updated/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023-02-09-tests-updated/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"a9ca1438-2e05-5355-8e06-72fe48377acc","excerpt":"For quite some time we have been adding new features to SkoHub Vocabs like switching languages, display of all relevant properties on the concept page and…","html":"

For quite some time we have been adding new features to SkoHub Vocabs like switching languages, display of all relevant properties on the concept page and support for skos:Collection. Unfortunately there were no tests added to actually test these new functionalities. This led to some surprises now and then, for example when we noticed that at one point language tags did not show up when visiting a Collection page directly.

\n

Originally SkoHub Vocabs already contained some tests, so being the maintainer of SkoHub Vocabs I decided to follow up on that and got myself a little bit more familiar on the topic. Quickly I stumbled over the topic of Test Driven Development (TDD) and though I heard of it before, I decided to dive a little deeper and check, if that pattern might be appropriate for SkoHub Vocabs and the other SkoHub modules (and maybe my coding approaches in general).

\n

The general idea of TDD is as follows (borrowed heavily from the Wikipedia article):

\n
    \n
  • Requirements of a new feature are first translated into test cases
  • \n
  • Tests are written
  • \n
  • Code is written
  • \n
\n

\n \n \n \n \n \n \n
Test-Driven-Development Cycle
\n

\n

This leads to the following development cycle:

\n
    \n
  1. \n

    Write tests: This ensures that the developer actually understands the user requirements. Usually this is done with the help of use cases and user stories.

    \n
  2. \n
  3. \n

    Run tests: The tests should now fail. If not, it might be the case that the actual feature is already present in the code and no further code needs to be written. Maybe documentation has to be updated accordingly.

    \n
  4. \n
  5. \n

    Write the simplest code that passes the new tests: The code can (and should) later be refactored, so it can be ugly at this point.

    \n
  6. \n
  7. \n

    All tests should now pass: If the code is still failing it should be revised till all tests pass.

    \n
  8. \n
  9. \n

    Refactor as needed: Your tests now verify that the new feature is working as expected. If any tests during refactoring fail, you now can and will immediately correct your code.

    \n
  10. \n
\n

Consequences on SkoHub development

\n

This approach has some consequences for the development of SkoHub modules.\nThese changes will also be reflected in the yet to be published CONTRIBUTING.md.\nIssues for new features should contain use cases and user stories as well as some notes that indicate when the feature is actually correctly implemented.\nJust when all of this is present, the issue can be marked as ready.\nThe use cases and notes can then be used to write the tests and follow the above mentioned development cycle.

\n

Regarding code review, this approach also has some consequences. Code review should only be approved if tests were added for the new feature or the tests were adjusted in case of bug fixing.

\n

Testing Strategies and Technologies in SkoHub Vocabs

\n

At the end of this blog post I want to give you a short overview of currently used testing strategies and technologies used in SkoHub Vocabs development. We use unit tests, integration tests and end-to-end tests whereby we try to write more unit tests than integration tests than end-to-end tests. The reason for this is that end-to-end tests take long and are quite expensive regarding computing power and time. Unit and integration tests on the other hand are cheap and can also auto-run in the background on every save, thus giving you immediate feedback when something is broken.

\n

For unit and integration tests we use Jest and the React-Testing-Library since Gatsby – with which SkoHub Vocabs is built – uses React.\nSome of the older tests used Enzyme, but after upgrading to React 18 I noticed that Enzyme was no longer working, because the project is dead.\nAfter some research I found the React-Testing-Library as the most recommended testing framework and migrated the old Enzyme tests.\nAfter some initial training, writing tests became actually quite handy and fun.

\n

Adding tests is by no way finished at this point, but a lot of the lately added features now have some proper testing. This already required a few changes to the code base from now and then when I noticed things weren’t working as expected.

\n

\n \n \n \n \n \n \n
Current test coverage in SkoHub Vocabs
\n

\n

For end-to-end tests I decided to go with cypress since it has an excellent documentation, is fully open source and runs tests in a real browser.

\n

\n \n \n \n \n \n \n
Example of Tests running in Cypress. On the left you see the test and can also jump forth and back between states, on the right you see the rendered HTML page
\n

\n

All of the tests are actually integrated in the SkoHub Vocabs CI pipeline and run before a new docker image gets build.

","frontmatter":{"title":"Moving to test-driven development and updating existing tests","date":"February 09, 2023","authors":[{"lastname":"Rörtgen","firstname":"Steffen"}],"description":null}},"previous":{"fields":{"slug":"/2022-12-19-workshop-summary/"},"frontmatter":{"title":"Notes from the November workshop"}},"next":{"fields":{"slug":"/2023-11-22-shacl-shape/"},"frontmatter":{"title":"Development of SKOS SHACL shape"}}},"pageContext":{"id":"a9ca1438-2e05-5355-8e06-72fe48377acc","previousPostId":"c45557b7-0901-5b47-8e00-548ea748b6f9","nextPostId":"e19fa987-ceb2-54a5-b888-63169daac7e7"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2023-11-22-shacl-shape/page-data.json b/page-data/2023-11-22-shacl-shape/page-data.json new file mode 100644 index 0000000..0ea459c --- /dev/null +++ b/page-data/2023-11-22-shacl-shape/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023-11-22-shacl-shape/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"e19fa987-ceb2-54a5-b888-63169daac7e7","excerpt":"To improve the error messages thrown by SkoHub Vocabs for invalid RDF Turtle files, we decided to implement a validation step, before the static site of a…","html":"

To improve the error messages thrown by SkoHub Vocabs for invalid RDF Turtle files, we decided to implement a validation step, before the static site of a vocabulary gets built with the Gatsby framework.\nThis validation step should provide more meaningful error messages than the currently cryptic ones thrown by Gatsby.\nWhile we could have gone with one of the existing SKOS validator tools like SKOS Play!, SKOSify or Poolparty (it’s pretty epensive) we decided to go with a more generic approach and define the shape rules not in code, but in data.

\n
\n \n \n \n \"SHACL\n \n \n
SHACL logo
\n
\n

If you want to validate the shape of an RDF graph, you currently have two options to do that. You can either use Shape Expressions (ShEx) or the Shapes Constraint Language (SHACL).\nWe decided to go with SHACL for the following reasons:

\n\n

Unfortunately the SKOS-XL shape did not work with our tooling (Apache Jena SHACL) out of the box.\nTherefore we decided to build a SKOS shape from the ground up based on the SKOS Reference.

\n

SKOS Reference Shape

\n

The goal was to implement every consistency example from the SKOS Reference as a test case for the shape.\nTo accomplish this it was on the one hand needed to formalize the class and property definitions from the spec as well as the integrity conditions.\nOn the other hand we needed a triple store with reasoning capabilities to apply these rules to the very basic examples in the reference.\nWe used the Apache Jena tooling for this and built a jena-docker containers based on the docker containers of this repo.\nThe SKOS class and property definitions are defined in this file.\nThe workflow for validating the SKOS shape is as follows:

\n
    \n
  1. The fuseki container is started with the inference configuration.
  2. \n
  3. The class and property definitions are appended to skos.shacl.ttl file which is mounted in the container.
  4. \n
  5. The respective example is mounted in the container as a ttl file (e.g. example05 )
  6. \n
  7. The validation result (which is itself a RDF graph) is temporarily stored
  8. \n
  9. The validation result is queried with SPARQL for errors
  10. \n
  11. Based on the query result an error message is put out
  12. \n
\n

This way we accomplished to validate all valid examples from the SKOS reference up to example 68 as valid and all the invalid examples as invalid (entailment vs non-entailment examples were left out).

\n

SkoHub Shape

\n

In SkoHub Vocabs we are a bit stricter regarding some aspects of the SKOS reference.\nFor example we want every skos:Concept to have at least one skos:prefLabel.\nTherefore we developed a SkoHub specific shape with skohub.shacl.ttl.\nIn contrast to the generic SKOS shape this shape does not contain any SPARQL based SHACL constraints.\nThough it is possible and especially for more elaborated queries useful to use SPARQL to check constraints, the available tools (at least for javascript rdf-validate-shacl) do not support such queries.

\n

As a result, validation errors and warnings help SkoHub users to improve the quality of their vocabularies. See for example the validation warning for no provided license:

\n
-----------Warning--------------\nMessage:  [\n  Literal {\n    value: 'A provided license increases reusability of a vocabulary. Should be an URI.',\n    language: '',\n    datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' }\n  }\n]\nPath:  http://purl.org/dc/terms/license\nNode, where the error occured:  http://w3id.org/example-cs/\nSeverity of error:  http://www.w3.org/ns/shacl#Warning
\n

Or the validation error if the object of skos:hasTopConcept is not a skos:Concept:

\n
-----------Violation--------------\nMessage:  [\n  Literal {\n    value: 'The target class for hasTopConcept should be skos:Concept',\n    language: '',\n    datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' }\n  }\n]\nPath:  http://www.w3.org/2004/02/skos/core#hasTopConcept\nNode, where the error occured:  http://w3id.org/example-cs/\nSeverity of error:  http://www.w3.org/ns/shacl#Violation
\n

Community

\n

Thanks to a lightning talk at SWIB23 (slides, recording) we got some attention to the shape.\nSuggestions made by Jakob Voß, Osma Suominen and Antoine Isaac already greatly improved the shape.\nFurther suggestions and improvements as well as your use cases are highly welcome.

\n

Outlook

\n

We were quite a bit surprised that we did not find any usable existing SKOS SHACL shape.\nHopefully our work may help others validating their SKOS files and improve the overall quality of vocabularies.\nThere is currently still an open ticket for implementing the qSKOS best practice rules.\nAny feedback and collaboration on the shapes is welcome!

","frontmatter":{"title":"Development of SKOS SHACL shape","date":"November 22, 2023","authors":[{"lastname":"Rörtgen","firstname":"Steffen"}],"description":null}},"previous":{"fields":{"slug":"/2023-02-09-tests-updated/"},"frontmatter":{"title":"Moving to test-driven development and updating existing tests"}},"next":{"fields":{"slug":"/2024-01-18-reconcile/"},"frontmatter":{"title":"Supporting the Reconciliation Service API for SKOS vocabularies"}}},"pageContext":{"id":"e19fa987-ceb2-54a5-b888-63169daac7e7","previousPostId":"a9ca1438-2e05-5355-8e06-72fe48377acc","nextPostId":"bcdcbba9-12cb-50f4-9aa2-de3fc49667db"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2024-01-18-reconcile/page-data.json b/page-data/2024-01-18-reconcile/page-data.json new file mode 100644 index 0000000..a7297b0 --- /dev/null +++ b/page-data/2024-01-18-reconcile/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024-01-18-reconcile/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"bcdcbba9-12cb-50f4-9aa2-de3fc49667db","excerpt":"Reconciliation is the process of integrating data from sources which do not share common unique identifiers by identifying records which refer to the same…","html":"

Reconciliation is the process of integrating data from sources which do not share common unique identifiers by identifying records which refer to the same entities.\nThis happens mostly by comparing the attributes of the entities.\nFor instance, two entries in a catalogue about persons that share the same date of birth, place of birth, name and death date, will probably be about the same person.\nLinking these two entries by adding the identifier from another data source is the process of reconciliation. This allows for extension of your data by taking over information from a linked record.

\n

To facilitate this process multiple tools exist with OpenRefine being the most prominent tool.\nTo align and standardize the way of providing data for these tools the Reconciliation Service API is drafted by the Entity Reconciliation Community Group within the World Wide Web Consortium (W3C).\nThe specification defines endpoints that data services can expose so that applications like OpenRefine can handle that data.\nA number of other services have already implemented the specification, like TEI Publisher or Cocoda, or the Alma Refine plugin for the commercial Library Management System Alma.

\n

Reconciliation and SKOS

\n

Simple Knowledge Organization System (SKOS) is an established standard for modeling controlled vocabularies as Linked Data. Thus, SKOS vocabularies are often targets of reconciliation efforts as you can improve your local data by enrichting strings with identifiers of a controlled vocabulary. So SKOS and the Reconciliation Service API often go hand in hand. However, there has not existed an easy way to set up a reconcilation endpoint for an existing SKOS vocabulary. We decied to change that by developing the new SkoHub component SkoHub-Reconcile.

\n

Andreas Wagner had already built a reconciliation prototype for SKOS vocabularies (see also our Workshop Blog Post.\nWe picked this prototype up, refactored it and moved it into a container based infrastructure.\nWe also added support for v0.2 of the reconciliation spec.

\n

SkoHub Reconcile Publish

\n

To make it easy to upload vocabularies to the reconciliation service a front-end was develped which you can try out at https://reconcile-publish.skohub.io/.

\n

\n \n \n \n \n \n \n
The reconcile-publish upload UI
\n

\n

Every vocabulary that passes the SkoHub SHACL Shape (see our blog post) should work for uploading to the reconcile service.\nThe only additional requirement is to provide a vann:preferredNamespaceUri.\nAs you can see in the screenshot you also have to provide an account and a language.\nAs for the account you can currently choose whatever you want, just make sure it is unique enough, so your dataset (i.e. your vocabulary) does not get overwritten by someone else.\nSince a lang parameter has only been available since the current draft version of the reconciliation specification and not yet implemented in SkoHub Reconcile, the current version of the SkoHub Reconcile service requires you to specify a language you want to use for reconciliation. We will improve this in the future along with the development of the specification.

\n

Example: Usage in OpenRefine

\n

Let’s see how we can use the service with OpenRefine.

\n

First, we upload the vocabulary.\nWe will use a classification of subject groups.

\n

\n \n \n \n \n \n \n
The URL of the Service Manifest being returned by the upload UI
\n

\n

If we follow the URL https://reconcile.skohub.io/reconcile?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme we see some data that services will use for reconciliation against our vocabulary:

\n
{\n    \"versions\": [\n        \"0.2\",\n        \"0.3.0-alpha\"\n    ],\n    \"name\": \"SkoHub reconciliation service for account 'test', dataset 'https://w3id.org/kim/hochschulfaechersystematik/scheme'\",\n    \"identifierSpace\": \"https://w3id.org/kim/hochschulfaechersystematik/\",\n    \"schemaSpace\": \"http://www.w3.org/2004/02/skos/core#\",\n    \"defaultTypes\": [\n        {\n            \"id\": \"ConceptScheme\",\n            \"name\": \"ConceptScheme\"\n        },\n        {\n            \"id\": \"Concept\",\n            \"name\": \"Concept\"\n        }\n    ],\n    \"view\": {\n        \"url\": \"{{id}}\"\n    },\n    \"preview\": {\n        \"url\": \"https://reconcile.skohub.io/preview?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id={{id}}\",\n        \"width\": 100,\n        \"height\": 320\n    },\n    \"suggest\": {\n        \"entity\": {\n            \"service_url\": \"https://reconcile.skohub.io\",\n            \"service_path\": \"/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=entity\",\n            \"flyout_service_path\": \"/suggest/flyout?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}\"\n        },\n        \"property\": {\n            \"service_url\": \"https://reconcile.skohub.io\",\n            \"service_path\": \"/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=property\",\n            \"flyout_service_path\": \"/suggest/flyout?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}\"\n        },\n        \"type\": {\n            \"service_url\": \"https://reconcile.skohub.io\",\n            \"service_path\": \"/suggest?language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&service=property\",\n            \"flyout_service_path\": \"/suggest/flyout&language=de&account=test&dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&id=${id}\"\n        }\n    }\n}
\n

Now that the reconciliation service is set up with our data, let’s see how we can use it in OpenRefine.

\n

For demo purposes we use a small vocabulary of a few discipline names:

\n

\n \n \n \n \n \n \n
An OpenRefine tabe with the values "mathe", "bibliothek", "forst"
\n

\n

By clicking on the dropdown button of the column we want to reconcile, we choose “Reconcile” -> “Start reconciling…“.

\n

\n \n \n \n \n \n \n
OpenRefine dropdown menu to start a reconciliation process
\n

\n

After clicking “Add standard service”, we can enter the url we were provided with by the upload service:

\n

\n \n \n \n \n \n \n
Adding the Service Manifest URL in OpenRefine
\n

\n

Then we just have to start the reconciliation by clicking “Start reconciling…” and our reconciliation service will be queried with the terms in our OpenRefine project.\nWe are then presented with the results:

\n

\n \n \n \n \n \n \n
Interative OpenRefine pop-up to define a match
\n

\n

If we want we can also search through our vocabulary by clicking “Search for match”:

\n

\n \n \n \n \n \n \n
Searching for a vocabulary term in OpenRefine
\n

\n

After selecting the appropritate matches we have successfully reconciled our data:

\n

\n \n \n \n \n \n \n
Matched values in OpenRefine column
\n

\n

Further reads

\n

Christel Annemieke Romein, Andreas Wagner and Joris J. van Zundert published a tutorial about building and deploying a classification schema using open standards and technology.\nIn this tutorial they make use of SKOS, SkoHub Vocabs and SkoHub Reconcile.\nWe recommend having a look to see the use of SkoHub services in action.

\n

Next steps

\n

The services are currently in an alpha phase and ready for testing.\nYou can test the service under https://reconcile-publish.skohub.io/.

\n

Feedback is very much appreciated: via email (skohub@hbz-nrw.de), as an issue or – primarily for the German-speaking users – in the newly set up discourse forum metadaten.community.

\n

Our next step will be integrating the above mentioned lang parameter to be able to serve all languages of a vocabulary without the need to specify it beforehand.

\n

Repositories

\n","frontmatter":{"title":"Supporting the Reconciliation Service API for SKOS vocabularies","date":"January 22, 2024","authors":[{"lastname":"Rörtgen","firstname":"Steffen"}],"description":null}},"previous":{"fields":{"slug":"/2023-11-22-shacl-shape/"},"frontmatter":{"title":"Development of SKOS SHACL shape"}},"next":{"fields":{"slug":"/2024-01-24-uris-without-language-tags/"},"frontmatter":{"title":"Re-working SkoHub Vocabs internationalization features"}}},"pageContext":{"id":"bcdcbba9-12cb-50f4-9aa2-de3fc49667db","previousPostId":"e19fa987-ceb2-54a5-b888-63169daac7e7","nextPostId":"5b5b6759-4145-563a-a1f9-359045844318"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2024-01-24-uris-without-language-tags/page-data.json b/page-data/2024-01-24-uris-without-language-tags/page-data.json new file mode 100644 index 0000000..c5e51a2 --- /dev/null +++ b/page-data/2024-01-24-uris-without-language-tags/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024-01-24-uris-without-language-tags/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"5b5b6759-4145-563a-a1f9-359045844318","excerpt":"In the past: Internationalization with drawbacks If you have worked with SkoHub Vocabs before, you might have noticed that the URLs in the address bar had a…","html":"

In the past: Internationalization with drawbacks

\n

If you have worked with SkoHub Vocabs before, you might have noticed that the URLs in the address bar had a little special feature that you don’t encounter very often, a language tag before the .html:

\n

https://skohub.io/dini-ag-kim/hochschulfaechersystematik/heads/master/w3id.org/kim/hochschulfaechersystematik/scheme.de.html

\n

Why did we need this?

\n

We wanted Internationalization features to be able to navigate multiple languages.\nNormally this is done via a subdomain or adding a language tag behind the domain name like https://w3id.org/kim/hochschulfaechersystematik/en/.\nBut this does not work for SkoHub Vocabs since the we use the URIs from the turtle files as IDs for the concept.\nChanging the URI by adding a language tag somewhere would break the whole concept of SkoHub Vocabs.

\n

So it was decided to add the language at the end of the URL by using Apache Multiviews features.\nBut this lead to some drawbacks:

\n
    \n
  • SkoHub Vocabs needed to be served by an Apache Webserver
  • \n
  • The webserver needed special configuration
  • \n
  • SkoHub Docker Vocabs, which is served via GitHub Pages, always needed a specific link to an index.{language}.html file, since GitHub Pages only looks for an index.html
  • \n
  • The build directory grew quite a bit, since there were dedicated html pages built for every language
  • \n
\n

Switching to one page for all languages

\n

In order to overcome these issues we decided to change this behaviour and just build one html page with a functionality to switch languages. The shown language is now chosen the following way:

\n
    \n
  • by using your browser language
  • \n
  • if you switched languages in the application the chosen language is taken
  • \n
  • if a language is not present, a default language present in the vocabulary is used
  • \n
\n

To point users to a specific language, you can use a query parameter lang= like:

\n

https://w3id.org/kim/hcrt/scheme?lang=uk

\n

Since SkoHub Vocabs also used the language tag of the URL internally to determine which language to serve a lot of changes had to be done in the codebase.\nBut overall this resulted in a much reduced size of the built vocabularies and more flexibility on serving the vocabularies.

\n

Benefits of the new approach

\n

This new internationalization approach brings lots of improvements:

\n
    \n
  • SkoHub Vocabs is now independent from the underlying webserver
  • \n
  • The size of the vocabularies is drastically reduced, especially for vocabularies with lots of languages
  • \n
  • SkoHub Docker Vocabs is now simpler to setup since we only have “normal” index.html files that it knows how to handle
  • \n
\n

What to do if I’m running my own webhook server?

\n

If you are running your own webhook server, you should upgrade the following way:

\n
    \n
  • Follow the steps outlined in the webhook repository to rebuild vocabularies. This will rebuild all still existing branches you are currently serving.
  • \n
  • Set up a redirect in your apache config, so that links that still have ...de.html will be redirected to ...html?lang=de:
  • \n
\n
# Redirect from ...filename.LANGCODE.html to ...filename.html?lang=LANGCODE\n        RewriteRule ^(.+)\\.([a-z]{2})\\.html$ $1.html?lang=$2 [L,R=301]
\n
    \n
  • After that you should be good!
  • \n
\n

Anything else?

\n

During developing the script to rebuild all existing vocabularies, I noticed that we are serving a lot of branches that do not exist anymore.\nSkoHub Webhook currently builds a vocabulary for every branch, you are setting up and pushing to.\nBut the webhook service does not get notified, when a branch is deleted.\nThis way we end up having lots of files for branches that no one needs anymore.\nIn order to clean this up a bit, we will soon add a script to clean the dist directory up and remove those no longer needed files.

","frontmatter":{"title":"Re-working SkoHub Vocabs internationalization features","date":"January 31, 2024","authors":[{"lastname":"Rörtgen","firstname":"Steffen"}],"description":null}},"previous":{"fields":{"slug":"/2024-01-18-reconcile/"},"frontmatter":{"title":"Supporting the Reconciliation Service API for SKOS vocabularies"}},"next":{"fields":{"slug":"/2024-03-21-skohub-pages/"},"frontmatter":{"title":"Publishing SKOS the easy way"}}},"pageContext":{"id":"5b5b6759-4145-563a-a1f9-359045844318","previousPostId":"bcdcbba9-12cb-50f4-9aa2-de3fc49667db","nextPostId":"3686d7d6-2bd1-5708-93b9-f9dbe02db287"}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/2024-03-21-skohub-pages/page-data.json b/page-data/2024-03-21-skohub-pages/page-data.json new file mode 100644 index 0000000..103dc0c --- /dev/null +++ b/page-data/2024-03-21-skohub-pages/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024-03-21-skohub-pages/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"markdownRemark":{"id":"3686d7d6-2bd1-5708-93b9-f9dbe02db287","excerpt":"A simple workflow for publishing your vocabs With SkoHub Pages we now provide a very simple way for publishing your SKOS vocabulary from a GitHub repository. It…","html":"

A simple workflow for publishing your vocabs

\n

With SkoHub Pages we now provide a very simple way for publishing your SKOS vocabulary from a GitHub repository. It only involves 5-6 steps:

\n

1. Fork the skohub-pages repo

\n

Click the “Fork” button in the top-right corner of the SkoHub Pages repo. You can change the name of your fork to whatever you like, e.g. my-shiny-vocab. See also the GitHub fork documentation.

\n

\n \n \n \n \n \n \n
Create fork, uncheck box ⚠️ to also fork the gh-pages branch
\n

\n

2. Activate GitHub Actions

\n

\n \n \n \n \n \n \n
Go to "Actions" tab and if not already activated, activate GitHub Actions.
\n

\n

3. Configure GitHub Pages branch

\n

Go to “Settings”, navigate to the “Pages” setting and select gh-pages as the branch your site is being built from.

\n

\n \n \n \n \n \n \n
Set gh-pages branch
\n

\n

4. Update pages URL

\n

Go back to the main page of your repo and click the little gear icon in the top right of the “About” section. Check the box at “Use your GitHub Pages website”.

\n

\n \n \n \n \n \n \n
Edit "About" section of the repository
\n
\n
\n \n \n \n \n \n \n
Set URL of repository
\n

\n

5. Start committing

\n

Now you can add a commit to the main branch adjusting the example vocabularies or adding a new turtle file. The changes will automatically be published to your GitHub pages website that is now linked at the top-right of your GitHub repo (sometimes it takes a little to see the changes, remember to do some hard refreshing).

\n

6. Set your GitHub Pages URL as namespace (optional)

\n

See section “Resolving custom domains” below ⬇️

\n

Utilizing GitHub Actions & Pages

\n

Not all projects or individuals involved in the creation of controlled vocabularies are able or have the resources to run their own infrastructure. Thus, we have been pursuing this approach – formerly under the name of “skohub-docker-vocabs” – to utilize Docker and GitHub infrastructure for publishing SKOS vocabularies with SkoHub Vocabs. Specifically, the workflow relies on ”GitHub Pages” and ”GitHub Actions”. With GitHub Pages it is possible to host websites on the GitHub infrastructure, GitHub Actions are used for automated tests and deployments.

\n

We have written a GitHub Action that ensures that a process is started after each push to the repository which builds the vocabularies with SkoHub Vocabs.\nThe built vocabulary is then pushed to a separate git branch gh-pages.\nAs seen above, GitHub Pages is configured to deliver HTML pages from this gh-pages branch.

\n

We have been using this approach in various introduction to SKOS and SkoHub workshops.\nHowever, in the past the workflow required some adjustments in the GitHub action so that errors could quickly creep in. We are happy to having improved this considerably and made the process much less error-prone! 🎉

\n

The relevant information is now set directly as environment variables and all other customizations can be changed via the GitHub GUI, so the workflow is now much more user-friendly. But that’s not all!

\n

Resolving custom domains

\n

Although with the presented approach the custom vocabulary could be provided without own infrastructure, the domains did not resolve to the GitHub pages.\nThis means that a concept scheme that uses URIs based on the GitHub Pages domain (e.g. https://myhandle.github.io/skohub-pages/) could not be resolved so far. In the past, in order to mitigate this we recommended setting up a redirect via w3id or purl.org.\nOf course, it still makes sense to set up a redirect (in case the vocabulary moves somewhere else). However, it is now also possible to use the domain that is assigned via GitHub Pages and have quickly set up a fully working SKOS vocabulary with resolving concept URIs which can come handy for prototyping.

\n

To do this, a config.yaml must be created in the repo.\nThe respective domain must then be entered under the custom_domain.\nExample: Your GitHub Pages domain is https://myhandle.github.io/skohub-pages/. Then provide https://myhandle.github.io/skohub-pages/ as custom_domain in your config.yaml.

\n

The base of your concept scheme could then be something like: https://myhandle.github.io/skohub-pages/myvocab/

\n
#config.yaml\n---\n# [...]\ncustom_domain: \"https://myhandle.github.io/skohub-pages/\"\n#[...]
\n
# colors.ttl\n@prefix colour: <https://myhandle.github.io/skohub-pages/myColourVocab/> .\n@prefix dct: <http://purl.org/dc/terms/> .\n@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\ncolour: a skos:ConceptScheme ;\n    dct:title \"Colour Vocabulary\"@en, \"Farbvokabular\"@de ;\n    dct:creator \"Hans Dampf\"@de ;\n    dct:created \"2021-11-02\"^^xsd:date ;\n    dct:license <https://creativecommons.org/publicdomain/zero/1.0/> ;\n    skos:hasTopConcept colour:violet, colour:blue .\n\ncolour:violet a skos:Concept ;\n    skos:prefLabel \"Violett\"@de, \"violet\"@en;\n    skos:altLabel \"Lila\"@de, \"purple\"@en ;\n    skos:topConceptOf colour: .\n\ncolour:blue a skos:Concept ;\n    skos:prefLabel \"Blau\"@de, \"blue\"@en ;\n    skos:topConceptOf colour: .
\n

Feel free to try out our simplified approach and let us know if something does not work: https://github.com/skohub-io/skohub-pages/issues/new

\n

Outlook: Beyond GitHub

\n

There are lots of reasons why people might not want to use the GitHub infrastructure owned by Microsoft for their SKOS publication workflows. That’s why we will be looking into replacing as much as possible of this workflow by generic git-based tooling for triggering the build. The goal is to support such an easy SKOS publishing workflow on other forges like GitLab or Forgejo. The work on this happens around this issue: https://github.com/skohub-io/skohub-pages/issues/19

\n

Let us know if you have some good implementation ideas or more wishes for future development!

","frontmatter":{"title":"Publishing SKOS the easy way","date":"March 21, 2024","authors":[{"lastname":"Rörtgen","firstname":"Steffen"},{"lastname":"Pohl","firstname":"Adrian"}],"description":null}},"previous":{"fields":{"slug":"/2024-01-24-uris-without-language-tags/"},"frontmatter":{"title":"Re-working SkoHub Vocabs internationalization features"}},"next":null},"pageContext":{"id":"3686d7d6-2bd1-5708-93b9-f9dbe02db287","previousPostId":"5b5b6759-4145-563a-a1f9-359045844318","nextPostId":null}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/404.html/page-data.json b/page-data/404.html/page-data.json new file mode 100644 index 0000000..d58956a --- /dev/null +++ b/page-data/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404.html","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}}},"pageContext":{}},"staticQueryHashes":["1878297489","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/404/page-data.json b/page-data/404/page-data.json new file mode 100644 index 0000000..638d79a --- /dev/null +++ b/page-data/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}}},"pageContext":{}},"staticQueryHashes":["1878297489","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/about/page-data.json b/page-data/about/page-data.json new file mode 100644 index 0000000..b2c7f27 --- /dev/null +++ b/page-data/about/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-about-js","path":"/about/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}}},"pageContext":{}},"staticQueryHashes":["1878297489","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json new file mode 100644 index 0000000..ad4c06b --- /dev/null +++ b/page-data/app-data.json @@ -0,0 +1 @@ +{"webpackCompilationHash":"a671f36031795c0731bf"} diff --git a/page-data/contact/page-data.json b/page-data/contact/page-data.json new file mode 100644 index 0000000..6436dd6 --- /dev/null +++ b/page-data/contact/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-contact-js","path":"/contact/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog","email":"skohub@hbz-nrw.de","social":{"github":"skohub-io"}}}},"pageContext":{}},"staticQueryHashes":["1878297489","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json new file mode 100644 index 0000000..6057231 --- /dev/null +++ b/page-data/index/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-js","path":"/","result":{"data":{"site":{"siteMetadata":{"title":"Skohub Blog"}},"allMarkdownRemark":{"nodes":[{"excerpt":"A simple workflow for publishing your vocabs With SkoHub Pages we now provide a very simple way for publishing your SKOS vocabulary from a…","fields":{"slug":"/2024-03-21-skohub-pages/"},"frontmatter":{"date":"March 21, 2024","title":"Publishing SKOS the easy way","description":null,"authors":[{"lastname":"Rörtgen","firstname":"Steffen"},{"lastname":"Pohl","firstname":"Adrian"}]}},{"excerpt":"In the past: Internationalization with drawbacks If you have worked with SkoHub Vocabs before, you might have noticed that the URLs in the…","fields":{"slug":"/2024-01-24-uris-without-language-tags/"},"frontmatter":{"date":"January 31, 2024","title":"Re-working SkoHub Vocabs internationalization features","description":null,"authors":[{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"Reconciliation is the process of integrating data from sources which do not share common unique identifiers by identifying records which…","fields":{"slug":"/2024-01-18-reconcile/"},"frontmatter":{"date":"January 22, 2024","title":"Supporting the Reconciliation Service API for SKOS vocabularies","description":null,"authors":[{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"To improve the error messages thrown by SkoHub Vocabs for invalid RDF Turtle files, we decided to implement a validation step, before the…","fields":{"slug":"/2023-11-22-shacl-shape/"},"frontmatter":{"date":"November 22, 2023","title":"Development of SKOS SHACL shape","description":null,"authors":[{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"For quite some time we have been adding new features to SkoHub Vocabs like switching languages, display of all relevant properties on the…","fields":{"slug":"/2023-02-09-tests-updated/"},"frontmatter":{"date":"February 09, 2023","title":"Moving to test-driven development and updating existing tests","description":null,"authors":[{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"Due to new funding for SkoHub development we conducted – as previously announced – a workshop on the 17th of November. About 15 participants…","fields":{"slug":"/2022-12-19-workshop-summary/"},"frontmatter":{"date":"December 19, 2022","title":"Notes from the November workshop","description":null,"authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"We are happy to announce the new SkoHub logo and design we have deployed right in time for our SWIB22 workshop on Wednesday! In the last…","fields":{"slug":"/2022-12-02-new-look/"},"frontmatter":{"date":"December 02, 2022","title":"Have U Seen The New Look?","description":"We are happy to launch the new SkoHub logo and design developed with help by Kai Mertens and effective WEBWORK","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"In this blog post we want to introduce to you a new member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will…","fields":{"slug":"/2022-11-skohub-workshop/"},"frontmatter":{"date":"November 04, 2022","title":"Things are moving at SkoHub","description":"We welcome a new team member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub and invite people to a SkoHub planning workshop.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"In a kickoff workshop, the SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some…","fields":{"slug":"/2022-05-eww-project-kickoff/"},"frontmatter":{"date":"May 19, 2022","title":"Collaborating on improving SkoHub Vocabs","description":"The SkoHub team at hbz has launched a cooperation with the Hamburg-based company effective WEBWORK to work on some pending issues regarding both functionality and design of SkoHub Vocabs.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Christensen","firstname":"Anne"}]}},{"excerpt":"We facilitated two workshops in November with the goal to introduce participants into Simple Knowledge Organization System (SKOS) by hands…","fields":{"slug":"/2021-12-10-skohub-vocabs-workshops/"},"frontmatter":{"date":"December 10, 2021","title":"SKOS Introduction workshops with SkoHub Vocabs","description":"We facilitated two workshops in November with the goal to introduce participants into Simple Knowledge Organization System (SKOS) by hands-on learning how to publish a small vocabulary with SkoHub Vocabs.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"Last Friday afternoon, the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) took place…","fields":{"slug":"/2021-lis-workshop/"},"frontmatter":{"date":"July 12, 2021","title":"SkoHub Presentation at LIS Workshop 2021","description":"Short report about the SkoHub presentation at the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) organized by the Working Group within the GfKL – Data Science Society.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"From 23-27 November the 12th Semantic Web in Libraries Conference took place online. The programme with links to recordings and slides forum…","fields":{"slug":"/2020-11-25-swib20-workshop/"},"frontmatter":{"date":"November 25, 2020","title":"SkoHub workshop at SWIB20","description":null,"authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Rörtgen","firstname":"Steffen"}]}},{"excerpt":"From 2-5 October the ActivityPub conference happened online where people using the ActivityPub protocol came together to discuss topics all…","fields":{"slug":"/2020-10-09-skohub-apconf/"},"frontmatter":{"date":"October 09, 2020","title":"ActivityPub Conference 2020","description":null,"authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}]}},{"excerpt":"ⓘ Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub PubSub demo server at skohub.io for an…","fields":{"slug":"/2020-06-25-skohub-pubsub/"},"frontmatter":{"date":"June 25, 2020","title":"Presenting SkoHub PubSub","description":null,"authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}]}},{"excerpt":"ⓘ Update, 2022-03-01: Due to lacking resources for maintenance, we decided to shut down the SkoHub Editor demo for an indefinite time…","fields":{"slug":"/2020-03-31-skohub-editor/"},"frontmatter":{"date":"March 31, 2020","title":"Presenting the SkoHub Editor","description":"An introducatory post to SkoHub Editor.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}]}},{"excerpt":"On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in…","fields":{"slug":"/2020-01-29-skohub-talk-at-swib19/"},"frontmatter":{"date":"January 29, 2020","title":"SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub","description":null,"authors":[{"lastname":"Pohl","firstname":"Adrian"}]}},{"excerpt":"We are happy to announce that the SkoHub prototype outlined in our post “SkoHub: Enabling KOS-based content subscription” is now finished…","fields":{"slug":"/2019-09-27-skohub-vocabs/"},"frontmatter":{"date":"September 27, 2019","title":"Presenting the SkoHub Vocabs Prototype","description":"An introducatory post to SkoHub Vocabs.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}]}},{"excerpt":"For a long time, openness movements and initiatives with labels like “Open Access”, “Open Educational Resources” (OER) or “Linked Science…","fields":{"slug":"/2019-05-17-skohub/"},"frontmatter":{"date":"May 17, 2019","title":"SkoHub: Enabling KOS-based content subscription","description":"An introduction to the publish/subscribe approach to content discovery to be implemented with SkoHub.","authors":[{"lastname":"Pohl","firstname":"Adrian"},{"lastname":"Ostrowski","firstname":"Felix"}]}}]}},"pageContext":{}},"staticQueryHashes":["1878297489","2734362168","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/sq/d/1878297489.json b/page-data/sq/d/1878297489.json new file mode 100644 index 0000000..bdd8500 --- /dev/null +++ b/page-data/sq/d/1878297489.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"social":{"github":"skohub-io","mastodon":"skohub","discourse":"https://metadaten.community/c/software-und-tools/metafacture/8"}}}}} \ No newline at end of file diff --git a/page-data/sq/d/2734362168.json b/page-data/sq/d/2734362168.json new file mode 100644 index 0000000..94e94aa --- /dev/null +++ b/page-data/sq/d/2734362168.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"author":{"name":"the SkoHub Community"},"social":{"mastodon":"skohub","github":"skohub-io"},"description":"A blog for SkoHub."}}}} \ No newline at end of file diff --git a/page-data/sq/d/3000541721.json b/page-data/sq/d/3000541721.json new file mode 100644 index 0000000..41a12c4 --- /dev/null +++ b/page-data/sq/d/3000541721.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"title":"Skohub Blog","description":"A blog for SkoHub."}}}} \ No newline at end of file diff --git a/page-data/using-typescript/page-data.json b/page-data/using-typescript/page-data.json new file mode 100644 index 0000000..a5fadfe --- /dev/null +++ b/page-data/using-typescript/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-using-typescript-tsx","path":"/using-typescript/","result":{"data":{"site":{"buildTime":"2024-03-27 07:26 am UTC"}},"pageContext":{}},"staticQueryHashes":["1878297489","3000541721"],"slicesMap":{}} \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/rss.xml b/rss.xml new file mode 100644 index 0000000..1ae0a17 --- /dev/null +++ b/rss.xml @@ -0,0 +1,2208 @@ +<![CDATA[SkoHub Blog's RSS Feed]]>https://blog.skohub.ioGatsbyJSWed, 27 Mar 2024 07:27:14 GMT<![CDATA[Publishing SKOS the easy way]]>https://blog.skohub.io/2024-03-21-skohub-pages/https://blog.skohub.io/2024-03-21-skohub-pages/Thu, 21 Mar 2024 00:00:00 GMT<h2>A simple workflow for publishing your vocabs</h2> +<p>With <a href="https://github.com/skohub-io/skohub-pages">SkoHub Pages</a> we now provide a very simple way for publishing your SKOS vocabulary from a GitHub repository. It only involves 5-6 steps:</p> +<p><strong>1. Fork the skohub-pages repo</strong></p> +<p>Click the “Fork” button in the top-right corner of the <a href="https://github.com/skohub-io/skohub-pages">SkoHub Pages repo</a>. You can change the name of your fork to whatever you like, e.g. <code class="language-text">my-shiny-vocab</code>. See also the <a href="https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo#forking-a-repository">GitHub fork documentation</a>.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/b5beefdabbe43f74578e4af6474e861c/eb390/create_fork.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 74.68354430379746%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACEElEQVQ4y5WT627iMBCF87cQyNWOYzsJiXPjUkgLq+5SVdq32X3/FzgrDwQoolL3xyePb6Px8Rknr3oMh3d06xestgdsX39iOBzBZYHpPMIs4JgFybdxRGbQrl9QNmuYfotmuYPpB4i8RyRrMN0gTgsiSnLEogCzc5EjEvllz65TwpBrsHSBRFW0kagSoSjhyx5xtkYgW8zDFPNQEPbSOI7x7Z7D5AJ60ULoClwukOY1ctMjL1vkVYuQSbg+g+sncP3T88dxjEcoYbsc8Hb8Da4qqjLgGqbdolu9olkOSLWB6/FPVX2FTeoUiw77/TvK7hllsyFdkqZEtu6hlx38TMFTElOPYTKPabyPLZcKrW6yaCDzGvaDZG6gTAtZ1pBVDW1aZHVHUlhpEl2RPLKo6U6aGZpfKtRFi9XuB1VomjV9jBelCGIJ3xJJBLGCzyQCpuBFp3Ub++OZWF4Tcl2RXd6KGkoU8Jj6L9/d/jY9OfA5NlMffBZh4l81ubfEleSMeIjDYoldv0XRD2D5FlX3jHY1kB/tAS+WJMEJgVmkCPfOMiOO3YhVCaENorSkRPZzGHVGRoQ8Q3iOvcQQs1sb2eoice0U21LWf7ad7MXgvDa2l+0ku0ZS+GdG73kck6cYk6cI7ozDoWddnvQ1j4xtk3laQn300B89gkrDeaTDd7AJpy5D0GZY/fmFzd8j2L7CP8NtfrndaYedAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Create fork, uncheck box ⚠️ to also fork the gh-pages branch" + title="Create fork, uncheck box ⚠️ to also fork the gh-pages branch" + src="/static/b5beefdabbe43f74578e4af6474e861c/f058b/create_fork.png" + srcset="/static/b5beefdabbe43f74578e4af6474e861c/c26ae/create_fork.png 158w, +/static/b5beefdabbe43f74578e4af6474e861c/6bdcf/create_fork.png 315w, +/static/b5beefdabbe43f74578e4af6474e861c/f058b/create_fork.png 630w, +/static/b5beefdabbe43f74578e4af6474e861c/eb390/create_fork.png 935w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Create fork, uncheck box ⚠️ to also fork the gh-pages branch</figcaption> + </figure></p> +<p><strong>2. Activate GitHub Actions</strong></p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/4bae802167f80dcb59a36f4d3ec553ed/ecf19/activate_action.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 48.734177215189874%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABa0lEQVQoz3WRW08bQQyF06q0m/XO/WLP7E7Y7JKSAElJgFxUUYVKiAcU+v//TbUEoUCp9MkPto+lc9zLQAE3faalDQxkaygYyoVj0uVMAzcgLAiTFUpo7BdK2XCUsU9f+p+P8h5TyBRy6b9puud6p51xkUn/3N/XF7imriospN/TOxwLhUwivHY0MWEPF97xRlwoBOGeryJwzYcrOVwC1yA9CLcffSwGbrkJPtaWBgaTxcqlCY1uLJY2DAwlFwbC0OGJTlxIr1zpY52a8fX612yxPru8mV5tZovlZDo/ny9nV+vpYrNY3bbjmS+HylX7OHqvYbhy6GPNfNLUxHBC1MTye6ATwjaEEWFjXHKxxqoVJvzjWbivCieFvv1xTPcXaXua7ibV9rS6Gw9+n5XbMUMC3jn/wDNXmCuMyp3/HNW7ebNbtX82HU/r5nF+/HAhYmDi/2lz1f0pyy1kFoqqgyVgKe+7PDNMvn/VX0sXNj+cantmAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Go to &quot;Actions&quot; tab and if not already activated, activate GitHub Actions." + title="Go to &quot;Actions&quot; tab and if not already activated, activate GitHub Actions." + src="/static/4bae802167f80dcb59a36f4d3ec553ed/f058b/activate_action.png" + srcset="/static/4bae802167f80dcb59a36f4d3ec553ed/c26ae/activate_action.png 158w, +/static/4bae802167f80dcb59a36f4d3ec553ed/6bdcf/activate_action.png 315w, +/static/4bae802167f80dcb59a36f4d3ec553ed/f058b/activate_action.png 630w, +/static/4bae802167f80dcb59a36f4d3ec553ed/40601/activate_action.png 945w, +/static/4bae802167f80dcb59a36f4d3ec553ed/ecf19/activate_action.png 948w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Go to &quot;Actions&quot; tab and if not already activated, activate GitHub Actions.</figcaption> + </figure></p> +<p><strong>3. Configure GitHub Pages branch</strong></p> +<p>Go to “Settings”, navigate to the “Pages” setting and select <code class="language-text">gh-pages</code> as the branch your site is being built from.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/302a4/set_gh_pages.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVklEQVQ4y1WTSW/bMBCF3QVxYluiFopaqN2yZDuOl6QL2qI9NdcC7Q/oX+ill/76ryC9JDk8PGIwHA7nvRlNnICJE3J14+J4ETMh7dnyRDB1Q66nnj0bNjCxq2uHKz9mZHJkikoKXr29YeR4Ci9McYMEx49xfMVURPZsOFA5YVxY9iNtY66neCMiProhv6aC7zJGx5qJGzIyF9OyQ2U1M09ZHAsfUc5XLFY75sMddbe2MdePGQcpe1fyZyb4ICST0z1bUKYV4tSlkJnlc+GprLkJGzxVEmcVSVaS6JpU1wS6Zp1XRLoiyRt01R8Llu2KxXpP02+o5is8mV46VLqlHg7Ml1vy7oBf3SOrPUG5Jyx2eOWOoDrgxS0iOHeYVMjEdFC/6M6wJzPCfInKF5bdpCdMW4SqcGWBkAVuVOIEGUYPWzCrFuR1z0RmL4oZjtIKlZYkeUtWtKR5jWvc4EXWFU94NkPzd5WULJ3gODfz3VPCfNjax4xoSdkhdcPYOMKLmT0T79jEqWDRLm3iv/GEr0IeE4PEqll1a4bNA01/Rz1s+StCHqeC10ZtEV2cccbI9RVpM7CvOh59xepkgdkpuV3cUjQ9flzwTWX88EIe/YjrSBPIzM74DDfMGHmyoFgf+Fm2PMQ5Y5OojjBqG2X1+hO/i44v1ZpZf0/YDOhibv0b6+YCP5kzMgqttu+pN/ckzWAHH8S5Vd28qpsVt4fPvOt3lP2B5fYT7WKDNnPVDRNX2u0xML8amVWzaxWm+DK7KHyGUdmY1kk7RDogks56M9b1s3V9wn+nzU0yNd9pDQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Set gh-pages branch" + title="Set gh-pages branch" + src="/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/f058b/set_gh_pages.png" + srcset="/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/c26ae/set_gh_pages.png 158w, +/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/6bdcf/set_gh_pages.png 315w, +/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/f058b/set_gh_pages.png 630w, +/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/40601/set_gh_pages.png 945w, +/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/302a4/set_gh_pages.png 1080w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Set gh-pages branch</figcaption> + </figure></p> +<p><strong>4. Update pages URL</strong></p> +<p>Go back to the main page of your repo and click the little gear icon in the top right of the “About” section. Check the box at “Use your GitHub Pages website”.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/b6a6a99907ce6e939473565adc2a5be3/0098c/click_gear_icon.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 37.34177215189873%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABfUlEQVQoz12RyY7UMBiE+wBiUOIsdhYv6XbSk8nW6dBDQyM4sAmegofgiHj6DyUDFw6lkn/L9ZerdmFS4O8nxuUtp8sNV/fU3czp8R3T5UY7vsIcWh7GC+PyhuF8ZX8ccL6jmx4Z5ittf6aqe0RasoukZsV6WMVXFlGJCArCoECIcpsFcU6kDLEyGwtpCJThpbI8U5ZQ6u39JiiLiqY7c76+x/sJ921k/PWB5fdH3I+Jwjb000KiCgKRchdLGpHyPRB8DSJ+vrjDlhVxXrFLcrcJmn27faW0R/Khofo04j/PZK8btGs4TjfSaiY2A7GbUXbAu4nOjnzRPVnhEVKzc/XA4f6E9R3W99i6o2kXjseF2s8odUCVFanpSNyJxI7E9kSke0I7EdiJ59WZUDrCJGen9IHM1GTak9u/7Bqsf8D4FlnuyY1HVw26qpG5IZEFUZoTRhIRSaKVk/yplDXI/7FeqPKwZRdnBlXut0j0/n5buBpIstXRU2H/sJbyBx8NuQ6iyohjAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Edit &quot;About&quot; section of the repository" + title="Edit &quot;About&quot; section of the repository" + src="/static/b6a6a99907ce6e939473565adc2a5be3/f058b/click_gear_icon.png" + srcset="/static/b6a6a99907ce6e939473565adc2a5be3/c26ae/click_gear_icon.png 158w, +/static/b6a6a99907ce6e939473565adc2a5be3/6bdcf/click_gear_icon.png 315w, +/static/b6a6a99907ce6e939473565adc2a5be3/f058b/click_gear_icon.png 630w, +/static/b6a6a99907ce6e939473565adc2a5be3/0098c/click_gear_icon.png 775w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Edit &quot;About&quot; section of the repository</figcaption> + </figure> +<figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/34c8419d626f86c2e8a6f15ce75998a4/f0685/use_gh_pages_website.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 79.11392405063292%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACIklEQVQ4y42TS2vbQBSFtWmbWNZzpJE00szIelmWFDtxcF0oJVBaKHTT/oFuuix0199/ylzbgUBiZ/ExGs3VfZyjsUIuoaoV8rJDrjsU5RJcLBBwiTBRMOePJArsSHjk8CwRZSUcP4GVFDXGzQ7Deofpdo/19gN0MyDKNHi+ABflI/Ez0PusRCobKmqFvEA77dAN97iOJN64HPMggxPmB9hrKOAwAduLYblJDVFtwbod7tWIjZoQLm7Byw3hixW8rL/AEkFxAzsQsAKuwZZ3GNMFfvgcLFZwYw2fa3ixxpwVhMPkGQq4cQnbS2C5PMfPfsIvoRDGOVxewMgQxDmtcabBUkn7c4Q8h+1GsK54iX95hX3dQ0/36MctmuEO3bhFO9wiUy14XoGlCizVL2JMJA2DrIXefISsOlTtiLIdUXUTOV2UHQUZ5j6/yMx0GMQC3WpN9lMXiaTfwI8EBThBCidILuKG6WFkU918eOrktKcgllHgJUxRj2WHhEZQo5WuV1gcR276NQJe0Biv6Y4I08PITE2Y3n9B298gkzVdO6EaqnhK+Br9KM6YEqoNqs0DmuVId/LaYcRLyZ529RRK6IseetijrJeQiyV1dm60k5u2F8GeRZi9Zbh+x2BfRZg5xhSXUWb7SQfpsxqZ1YsEhG6R5jWSXQP5bYD8OiD/3GMe84PLp+Bzep3OTMJu2qJq1lDfJ6z/fsLdnwf0v/dwsgT/Acf/mhiejKDMAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Set URL of repository" + title="Set URL of repository" + src="/static/34c8419d626f86c2e8a6f15ce75998a4/f058b/use_gh_pages_website.png" + srcset="/static/34c8419d626f86c2e8a6f15ce75998a4/c26ae/use_gh_pages_website.png 158w, +/static/34c8419d626f86c2e8a6f15ce75998a4/6bdcf/use_gh_pages_website.png 315w, +/static/34c8419d626f86c2e8a6f15ce75998a4/f058b/use_gh_pages_website.png 630w, +/static/34c8419d626f86c2e8a6f15ce75998a4/f0685/use_gh_pages_website.png 835w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Set URL of repository</figcaption> + </figure></p> +<p><strong>5. Start committing</strong></p> +<p>Now you can add a commit to the main branch adjusting the example vocabularies or adding a new turtle file. The changes will automatically be published to your GitHub pages website that is now linked at the top-right of your GitHub repo (sometimes it takes a little to see the changes, remember to do some hard refreshing).</p> +<p><strong>6. Set your GitHub Pages URL as namespace (optional)</strong></p> +<p>See section “Resolving custom domains” below ⬇️</p> +<h2>Utilizing GitHub Actions &#x26; Pages</h2> +<p>Not all projects or individuals involved in the creation of controlled vocabularies are able or have the resources to run their own infrastructure. Thus, we have been pursuing this approach – formerly under the name of “skohub-docker-vocabs” – to utilize Docker and GitHub infrastructure for publishing SKOS vocabularies with <a href="https://github.com/skohub-io/skohub-vocabs">SkoHub Vocabs</a>. Specifically, the workflow relies on ”<a href="https://docs.github.com/de/pages/getting-started-with-github-pages">GitHub Pages</a>” and ”<a href="https://docs.github.com/en/actions">GitHub Actions</a>”. With GitHub Pages it is possible to host websites on the GitHub infrastructure, GitHub Actions are used for automated tests and deployments.</p> +<p>We have written <a href="https://github.com/skohub-io/skohub-pages/blob/main/.github/workflows/main.yml">a GitHub Action</a> that ensures that a process is started after each push to the repository which builds the vocabularies with SkoHub Vocabs. +The built vocabulary is then pushed to a separate git branch <code class="language-text">gh-pages</code>. +As seen above, GitHub Pages is configured to deliver HTML pages from this <code class="language-text">gh-pages</code> branch.</p> +<p>We have been using this approach in various introduction to SKOS and SkoHub workshops. +However, in the past the workflow required some adjustments in the GitHub action so that errors could quickly creep in. We are happy to having improved this considerably and made the process much less error-prone! 🎉</p> +<p>The relevant information is now set directly as environment variables and all other customizations can be changed via the GitHub GUI, so the workflow is now much more user-friendly. But that’s not all!</p> +<h2>Resolving custom domains</h2> +<p>Although with the presented approach the custom vocabulary could be provided without own infrastructure, the domains did not resolve to the GitHub pages. +This means that a concept scheme that uses URIs based on the GitHub Pages domain (e.g. <code class="language-text">https://myhandle.github.io/skohub-pages/</code>) could not be resolved so far. In the past, in order to mitigate this we recommended setting up a redirect via <a href="https://w3id.org/">w3id</a> or <a href="https://purl.archive.org/">purl.org</a>. +Of course, it still makes sense to set up a redirect (in case the vocabulary moves somewhere else). However, it is now also possible to use the domain that is assigned via GitHub Pages and have quickly set up a fully working SKOS vocabulary with resolving concept URIs which can come handy for prototyping.</p> +<p>To do this, a <a href="https://github.com/skohub-io/skohub-pages/blob/main/config.yaml"><code class="language-text">config.yaml</code></a> must be created in the repo. +The respective domain must then be entered under the <code class="language-text">custom_domain</code>. +Example: Your GitHub Pages domain is <a href="https://myhandle.github.io/skohub-pages/">https://myhandle.github.io/skohub-pages/</a>. Then provide <code class="language-text">https://myhandle.github.io/skohub-pages/</code> as <code class="language-text">custom_domain</code> in your config.yaml.</p> +<p>The base of your concept scheme could then be something like: <code class="language-text">https://myhandle.github.io/skohub-pages/myvocab/</code></p> +<div class="gatsby-highlight" data-language="yaml"><pre class="language-yaml"><code class="language-yaml"><span class="token comment">#config.yaml</span> +<span class="token punctuation">---</span> +<span class="token comment"># [...]</span> +<span class="token key atrule">custom_domain</span><span class="token punctuation">:</span> <span class="token string">"https://myhandle.github.io/skohub-pages/"</span> +<span class="token comment">#[...]</span></code></pre></div> +<div class="gatsby-highlight" data-language="turtle"><pre class="language-turtle"><code class="language-turtle"><span class="token comment"># colors.ttl</span> +<span class="token keyword">@prefix</span> <span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span></span> <span class="token url"><span class="token punctuation">&lt;</span>https://myhandle.github.io/skohub-pages/myColourVocab/<span class="token punctuation">></span></span> <span class="token punctuation">.</span> +<span class="token keyword">@prefix</span> <span class="token function"><span class="token prefix">dct<span class="token punctuation">:</span></span></span> <span class="token url"><span class="token punctuation">&lt;</span>http://purl.org/dc/terms/<span class="token punctuation">></span></span> <span class="token punctuation">.</span> +<span class="token keyword">@prefix</span> <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span></span> <span class="token url"><span class="token punctuation">&lt;</span>http://www.w3.org/2004/02/skos/core#<span class="token punctuation">></span></span> <span class="token punctuation">.</span> +<span class="token keyword">@prefix</span> <span class="token function"><span class="token prefix">xsd<span class="token punctuation">:</span></span></span> <span class="token url"><span class="token punctuation">&lt;</span>http://www.w3.org/2001/XMLSchema#<span class="token punctuation">></span></span> <span class="token punctuation">.</span> + +<span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span></span> <span class="token keyword">a</span> <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">ConceptScheme</span></span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">dct<span class="token punctuation">:</span></span><span class="token local-name">title</span></span> <span class="token string">"Colour Vocabulary"</span><span class="token tag"><span class="token punctuation">@</span>en</span><span class="token punctuation">,</span> <span class="token string">"Farbvokabular"</span><span class="token tag"><span class="token punctuation">@</span>de</span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">dct<span class="token punctuation">:</span></span><span class="token local-name">creator</span></span> <span class="token string">"Hans Dampf"</span><span class="token tag"><span class="token punctuation">@</span>de</span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">dct<span class="token punctuation">:</span></span><span class="token local-name">created</span></span> <span class="token string">"2021-11-02"</span><span class="token punctuation">^^</span><span class="token function"><span class="token prefix">xsd<span class="token punctuation">:</span></span><span class="token local-name">date</span></span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">dct<span class="token punctuation">:</span></span><span class="token local-name">license</span></span> <span class="token url"><span class="token punctuation">&lt;</span>https://creativecommons.org/publicdomain/zero/1.0/<span class="token punctuation">></span></span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">hasTopConcept</span></span> <span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span><span class="token local-name">violet</span></span><span class="token punctuation">,</span> <span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span><span class="token local-name">blue</span></span> <span class="token punctuation">.</span> + +<span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span><span class="token local-name">violet</span></span> <span class="token keyword">a</span> <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">Concept</span></span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">prefLabel</span></span> <span class="token string">"Violett"</span><span class="token tag"><span class="token punctuation">@</span>de</span><span class="token punctuation">,</span> <span class="token string">"violet"</span><span class="token tag"><span class="token punctuation">@</span>en</span><span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">altLabel</span></span> <span class="token string">"Lila"</span><span class="token tag"><span class="token punctuation">@</span>de</span><span class="token punctuation">,</span> <span class="token string">"purple"</span><span class="token tag"><span class="token punctuation">@</span>en</span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">topConceptOf</span></span> <span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span></span> <span class="token punctuation">.</span> + +<span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span><span class="token local-name">blue</span></span> <span class="token keyword">a</span> <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">Concept</span></span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">prefLabel</span></span> <span class="token string">"Blau"</span><span class="token tag"><span class="token punctuation">@</span>de</span><span class="token punctuation">,</span> <span class="token string">"blue"</span><span class="token tag"><span class="token punctuation">@</span>en</span> <span class="token punctuation">;</span> + <span class="token function"><span class="token prefix">skos<span class="token punctuation">:</span></span><span class="token local-name">topConceptOf</span></span> <span class="token function"><span class="token prefix">colour<span class="token punctuation">:</span></span></span> <span class="token punctuation">.</span></code></pre></div> +<p>Feel free to try out our simplified approach and let us know if something does not work: <a href="https://github.com/skohub-io/skohub-pages/issues/new">https://github.com/skohub-io/skohub-pages/issues/new</a></p> +<h2>Outlook: Beyond GitHub</h2> +<p>There are lots of reasons why people might not want to use the GitHub infrastructure owned by Microsoft for their SKOS publication workflows. That’s why we will be looking into replacing as much as possible of this workflow by generic git-based tooling for triggering the build. The goal is to support such an easy SKOS publishing workflow on other forges like GitLab or Forgejo. The work on this happens around this issue: <a href="https://github.com/skohub-io/skohub-pages/issues/19">https://github.com/skohub-io/skohub-pages/issues/19</a></p> +<p>Let us know if you have some good implementation ideas or more wishes for future development!</p><![CDATA[Re-working SkoHub Vocabs internationalization features]]>https://blog.skohub.io/2024-01-24-uris-without-language-tags/https://blog.skohub.io/2024-01-24-uris-without-language-tags/Wed, 31 Jan 2024 00:00:00 GMT<h2>In the past: Internationalization with drawbacks</h2> +<p>If you have worked with SkoHub Vocabs before, you might have noticed that the URLs in the address bar had a little special feature that you don’t encounter very often, a language tag before the <code class="language-text">.html</code>:</p> +<p><code class="language-text">https://skohub.io/dini-ag-kim/hochschulfaechersystematik/heads/master/w3id.org/kim/hochschulfaechersystematik/scheme.de.html</code></p> +<p>Why did we need this?</p> +<p>We wanted Internationalization features to be able to navigate multiple languages. +Normally this is done via a subdomain or adding a language tag behind the domain name like <code class="language-text">https://w3id.org/kim/hochschulfaechersystematik/en/</code>. +But this does not work for SkoHub Vocabs since the we use the URIs from the turtle files as IDs for the concept. +Changing the URI by adding a language tag somewhere would break the whole concept of SkoHub Vocabs.</p> +<p>So it was decided to add the language at the end of the URL by using Apache Multiviews features. +But this lead to some drawbacks:</p> +<ul> +<li>SkoHub Vocabs needed to be served by an Apache Webserver</li> +<li>The webserver needed special configuration</li> +<li><a href="https://github.com/skohub-io/skohub-docker-vocabs">SkoHub Docker Vocabs</a>, which is served via GitHub Pages, always needed a specific link to an index.{language}.html file, since GitHub Pages only looks for an <code class="language-text">index.html</code></li> +<li>The build directory grew quite a bit, since there were dedicated html pages built for every language</li> +</ul> +<h2>Switching to one page for all languages</h2> +<p>In order to overcome these issues we decided to change this behaviour and just build one html page with a functionality to switch languages. The shown language is now chosen the following way:</p> +<ul> +<li>by using your browser language</li> +<li>if you switched languages in the application the chosen language is taken</li> +<li>if a language is not present, a default language present in the vocabulary is used</li> +</ul> +<p>To point users to a specific language, you can use a query parameter <code class="language-text">lang=</code> like:</p> +<p><code class="language-text">https://w3id.org/kim/hcrt/scheme?lang=uk</code></p> +<p>Since SkoHub Vocabs also used the language tag of the URL internally to determine which language to serve a lot of changes had to be done in the codebase. +But overall this resulted in a much reduced size of the built vocabularies and more flexibility on serving the vocabularies.</p> +<h2>Benefits of the new approach</h2> +<p>This new internationalization approach brings lots of improvements:</p> +<ul> +<li>SkoHub Vocabs is now independent from the underlying webserver</li> +<li>The size of the vocabularies is drastically reduced, especially for vocabularies with lots of languages</li> +<li><a href="https://github.com/skohub-io/skohub-docker-vocabs">SkoHub Docker Vocabs</a> is now simpler to setup since we only have “normal” <code class="language-text">index.html</code> files that it knows how to handle</li> +</ul> +<h2>What to do if I’m running my own webhook server?</h2> +<p>If you are running your own webhook server, you should upgrade the following way:</p> +<ul> +<li>Follow the steps outlined in the webhook repository to <a href="https://github.com/skohub-io/skohub-webhook#rebuilding-vocabularies">rebuild vocabularies</a>. This will rebuild all still existing branches you are currently serving.</li> +<li>Set up a redirect in your apache config, so that links that still have <code class="language-text">...de.html</code> will be redirected to <code class="language-text">...html?lang=de</code>:</li> +</ul> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text"># Redirect from ...filename.LANGCODE.html to ...filename.html?lang=LANGCODE + RewriteRule ^(.+)\.([a-z]{2})\.html$ $1.html?lang=$2 [L,R=301]</code></pre></div> +<ul> +<li>After that you should be good!</li> +</ul> +<h2>Anything else?</h2> +<p>During developing the script to rebuild all existing vocabularies, I noticed that we are serving a lot of branches that do not exist anymore. +SkoHub Webhook currently builds a vocabulary for every branch, you are setting up and pushing to. +But the webhook service does not get notified, when a branch is deleted. +This way we end up having lots of files for branches that no one needs anymore. +In order to clean this up a bit, we will soon add a script to clean the dist directory up and remove those no longer needed files.</p><![CDATA[Supporting the Reconciliation Service API for SKOS vocabularies]]>https://blog.skohub.io/2024-01-18-reconcile/https://blog.skohub.io/2024-01-18-reconcile/Mon, 22 Jan 2024 00:00:00 GMT<p>Reconciliation is the process of integrating data from sources which do not share common unique identifiers by identifying records which refer to the same entities. +This happens mostly by comparing the attributes of the entities. +For instance, two entries in a catalogue about persons that share the same date of birth, place of birth, name and death date, will probably be about the same person. +Linking these two entries by adding the identifier from another data source is the process of reconciliation. This allows for extension of your data by taking over information from a linked record.</p> +<p>To facilitate this process multiple tools exist with <a href="https://openrefine.org/">OpenRefine</a> being the most prominent tool. +To align and standardize the way of providing data for these tools the <a href="https://reconciliation-api.github.io/specs/draft/">Reconciliation Service API</a> is drafted by the <a href="https://www.w3.org/community/reconciliation/">Entity Reconciliation Community Group</a> within the World Wide Web Consortium (W3C). +The specification defines endpoints that data services can expose so that applications like OpenRefine can handle that data. +A number of other services have already implemented the specification, like <a href="https://teipublisher.com/">TEI Publisher</a> or <a href="https://coli-conc.gbv.de/cocoda/">Cocoda</a>, or the <a href="https://developers.exlibrisgroup.com/appcenter/alma-refine/">Alma Refine plugin</a> for the commercial Library Management System Alma.</p> +<h2>Reconciliation and SKOS</h2> +<p><a href="https://www.w3.org/TR/skos-reference/">Simple Knowledge Organization System (SKOS)</a> is an established standard for modeling controlled vocabularies as Linked Data. Thus, SKOS vocabularies are often targets of reconciliation efforts as you can improve your local data by enrichting strings with identifiers of a controlled vocabulary. So SKOS and the Reconciliation Service API often go hand in hand. However, there has not existed an easy way to set up a reconcilation endpoint for an existing SKOS vocabulary. We decied to change that by developing the new SkoHub component <a href="https://github.com/skohub-io/skohub-reconcile">SkoHub-Reconcile</a>.</p> +<p>Andreas Wagner had already built a reconciliation prototype for SKOS vocabularies (see also our <a href="https://blog.skohub.io/2022-12-19-workshop-summary/">Workshop Blog Post</a>. +We picked this prototype up, refactored it and moved it into a container based infrastructure. +We also added support for <a href="https://www.w3.org/community/reports/reconciliation/CG-FINAL-specs-0.2-20230410/">v0.2 of the reconciliation spec</a>.</p> +<h2>SkoHub Reconcile Publish</h2> +<p>To make it easy to upload vocabularies to the reconciliation service a front-end was develped which you can try out at <a href="https://reconcile-publish.skohub.io/">https://reconcile-publish.skohub.io/</a>.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/d272074553e0a809343b4bf35fa04f09/5d942/reconcile-publish.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 94.9367088607595%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACkklEQVQ4y41T227TQBDNx/FEgY+Adx74H0RpS1uJqlR9ogiiBBwncdKkFyhpo7ZCENu7viXx/ZIetJO41GkaYenoWHN2jmdnxiU88Nzc3BB7SYxhFOJq6CCZZAVt0VN6SJjMki4dG68qn/D6tIswTf/fMD8kWCA3VD0X73rfsXZ2gnEcF87kuJtfWnTNu++W66J+0cNvpiPJ0qXtWVhhkmWIswzZZIJkMoEfR9AdG6pjk0bxLCucW1hhHvg1GuKY62jpA5yZBo64jsuRg6vREIdMI63LNJwaDD8tA36SLDeMshQnXKcEYSYM+raFjq6iras45gyHuoqeZVJ/F155vsn5NQbuGB2m4YfJiRXtD74bDJGY9mxw87mlZStAH5th/n3p2qRpiiAIEIYh8T34PnzfR+AHi/UgQBRF0wqFoeM40HUdnHNYlnUL27ZhGAZpOURsXmeMEeI4nl5ZCMJMiK7rwvM84vF4jNFodMs5hJafy3MFRJUFQ24YxKZlwrJtMM6hico4n4IxaIzBsCyYtg3TtmCYJhVyz5BxBlNU6DiIPA+IEyAMgSCcchj9Y/ELCj1J4Q2H9OF7hgbnGDAdzf4FGhfn2DnuYL3dxJpSx1uljlWljjdNGatNmeIbHQWr7QY611dwTIt6WDAU1V1rKtbrMtZkGS+/fMTzg328ONjHs71tPN7dxMruFlZ2N/Hkwxae7m3j0c4G3p8ewbNtakWxh6IPjKEmy/hcLkOqVtFuNNBttdBVFHSV1hStFpqShPrXb5CrVVz2+zTxQoUiIFZC0zTUZRmVSoUgSRJkWYZUqxFqM1SqVdLL5TJ65+c0FJFLhmIPxQqoqkpBIZqmSaDpGQbxXeS6gKhsMBjQULIsw1/3PpbmfX5EnQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The reconcile-publish upload UI" + title="The reconcile-publish upload UI" + src="/static/d272074553e0a809343b4bf35fa04f09/f058b/reconcile-publish.png" + srcset="/static/d272074553e0a809343b4bf35fa04f09/c26ae/reconcile-publish.png 158w, +/static/d272074553e0a809343b4bf35fa04f09/6bdcf/reconcile-publish.png 315w, +/static/d272074553e0a809343b4bf35fa04f09/f058b/reconcile-publish.png 630w, +/static/d272074553e0a809343b4bf35fa04f09/40601/reconcile-publish.png 945w, +/static/d272074553e0a809343b4bf35fa04f09/78612/reconcile-publish.png 1260w, +/static/d272074553e0a809343b4bf35fa04f09/5d942/reconcile-publish.png 1343w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The reconcile-publish upload UI</figcaption> + </figure></p> +<p>Every vocabulary that passes the SkoHub SHACL Shape (see our <a href="https://blog.skohub.io/2023-11-22-shacl-shape/">blog post</a>) should work for uploading to the reconcile service. +The only additional requirement is to provide a <code class="language-text">vann:preferredNamespaceUri</code>. +As you can see in the screenshot you also have to provide an account and a language. +As for the account you can currently choose whatever you want, just make sure it is unique enough, so your dataset (i.e. your vocabulary) does not get overwritten by someone else. +Since a <code class="language-text">lang</code> parameter has only been available since the <a href="https://reconciliation-api.github.io/specs/draft/#service-manifest">current draft</a> version of the reconciliation specification and not yet implemented in SkoHub Reconcile, the current version of the SkoHub Reconcile service requires you to specify a language you want to use for reconciliation. We will improve this in the future along with the development of the specification.</p> +<h2>Example: Usage in OpenRefine</h2> +<p>Let’s see how we can use the service with OpenRefine.</p> +<p>First, we upload the vocabulary. +We will use a classification of <a href="https://w3id.org/kim/hochschulfaechersystematik/scheme">subject groups</a>.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/e5af98f7ca69f0c23efe94e8e10c44c3/3c492/upload.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 50.632911392405056%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABzUlEQVQoz2WRy08TURSH+8eRSIgb/wZxo3tfG+NCjSY+EsVWw0soBZVqNbKRRF2YWqZWMBArrpQmnTtzX9N2ygzTtD9zTulDWXw5J/d373fOZFLdbhftdhutVgthGHJtNptDgiCAtZahfjwj6D5Bjl6vh1Qcx/A8D77vo16vc6XHxhgWKKUgpWSoHwygnCqd03uCXKkoiljSDwRfpE1p+mCrcehsfDOtNb8lB7lYSPbBJKU1jDVcPd8fIUc9ZcoYRip5UujTJ0sJLSWiMEQ3joGjI/QOIwZRBBweE1GW9Ek6aFrLQ05sqJXCz4MDOL/28an6A7lvZaxWHGTLJSyXvzBLDtUSVioO58uVLez++Q2jFDuGQuF5CLTGx/0qcsUiZkpFnN3cwPT7dzjz9gVO5XOYfDViqrCG04XnmMjnsFHdQ8sYdvwjbFiLzzvbuDyfwbWlOdzMLiL9Jo90YR2PC+vIHPczr1/i1soibmQXcP3ZLLZ2vyOgzx7/y67rsnDTKeHcgzu48Ogec3XhKQ+4NJfBlfknXC/Opjk7//Aupu/fxoevDhrGsoM3TJIEwnVRq9XgCw/tIEBo+wRKo6H/xwxzuusLwW+FEOh0OvgLSZPJA9laBt8AAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The filled in upload form with &quot;test&quot; as account name, &quot;de&quot; as language and &quot;systematik.ttl&quot; as file to be uploaded" + title="The filled in upload form with &quot;test&quot; as account name, &quot;de&quot; as language and &quot;systematik.ttl&quot; as file to be uploaded" + src="/static/e5af98f7ca69f0c23efe94e8e10c44c3/f058b/upload.png" + srcset="/static/e5af98f7ca69f0c23efe94e8e10c44c3/c26ae/upload.png 158w, +/static/e5af98f7ca69f0c23efe94e8e10c44c3/6bdcf/upload.png 315w, +/static/e5af98f7ca69f0c23efe94e8e10c44c3/f058b/upload.png 630w, +/static/e5af98f7ca69f0c23efe94e8e10c44c3/40601/upload.png 945w, +/static/e5af98f7ca69f0c23efe94e8e10c44c3/78612/upload.png 1260w, +/static/e5af98f7ca69f0c23efe94e8e10c44c3/3c492/upload.png 1300w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The filled in upload form with &quot;test&quot; as account name, &quot;de&quot; as language and &quot;systematik.ttl&quot; as file to be uploaded</figcaption> + </figure></p> +<p>After a successful upload of the <a href="https://raw.githubusercontent.com/dini-ag-kim/hochschulfaechersystematik/master/hochschulfaechersystematik.ttl">turtle file</a>, we are presented with a URI that leads to the <a href="https://reconciliation-api.github.io/specs/draft/#service-manifest">“Service Manifest”</a> of our reconciliation service.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/4972457dc61a693775b415a5d0d30d8b/3c492/upload-success.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 26.58227848101266%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA7klEQVQY022PQUvDQBCF89sFhVIP/gvBg3iRoFUPbexZLNFIEtsmdjczuyBkd5tcwpNdLBL18MEw780HEw3DAGstjDF/aNsWe+eQVxXKusbeurD7r+sd3hX1fQ8iGtMQSDGkIhjTYnp5jrOrCxhrws5no+737F1R13Ug2YBXa/BqA356DzMt36DnGdxjAZPksEkOtyyg5hlokYGf1z+kG5AkdAchM0NrDaUVlFJQWuOzapCnJabxDJPrG0ziW5zGMxRpGTLfOXT9rXd4V3hZCDFiJwSYCS/1FsfJPY4Wd4GT5AGvH9uQ7X7dSCnDy18+hG3fseizuAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The URL of the Service Manifest being returned by the upload UI" + title="The URL of the Service Manifest being returned by the upload UI" + src="/static/4972457dc61a693775b415a5d0d30d8b/f058b/upload-success.png" + srcset="/static/4972457dc61a693775b415a5d0d30d8b/c26ae/upload-success.png 158w, +/static/4972457dc61a693775b415a5d0d30d8b/6bdcf/upload-success.png 315w, +/static/4972457dc61a693775b415a5d0d30d8b/f058b/upload-success.png 630w, +/static/4972457dc61a693775b415a5d0d30d8b/40601/upload-success.png 945w, +/static/4972457dc61a693775b415a5d0d30d8b/78612/upload-success.png 1260w, +/static/4972457dc61a693775b415a5d0d30d8b/3c492/upload-success.png 1300w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The URL of the Service Manifest being returned by the upload UI</figcaption> + </figure></p> +<p>If we follow the URL <a href="https://reconcile.skohub.io/reconcile?language=de&#x26;account=test&#x26;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme">https://reconcile.skohub.io/reconcile?language=de&#x26;account=test&#x26;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme</a> we see some data that services will use for reconciliation against our vocabulary:</p> +<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"><span class="token punctuation">{</span> + <span class="token property">"versions"</span><span class="token operator">:</span> <span class="token punctuation">[</span> + <span class="token string">"0.2"</span><span class="token punctuation">,</span> + <span class="token string">"0.3.0-alpha"</span> + <span class="token punctuation">]</span><span class="token punctuation">,</span> + <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"SkoHub reconciliation service for account 'test', dataset 'https://w3id.org/kim/hochschulfaechersystematik/scheme'"</span><span class="token punctuation">,</span> + <span class="token property">"identifierSpace"</span><span class="token operator">:</span> <span class="token string">"https://w3id.org/kim/hochschulfaechersystematik/"</span><span class="token punctuation">,</span> + <span class="token property">"schemaSpace"</span><span class="token operator">:</span> <span class="token string">"http://www.w3.org/2004/02/skos/core#"</span><span class="token punctuation">,</span> + <span class="token property">"defaultTypes"</span><span class="token operator">:</span> <span class="token punctuation">[</span> + <span class="token punctuation">{</span> + <span class="token property">"id"</span><span class="token operator">:</span> <span class="token string">"ConceptScheme"</span><span class="token punctuation">,</span> + <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"ConceptScheme"</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token punctuation">{</span> + <span class="token property">"id"</span><span class="token operator">:</span> <span class="token string">"Concept"</span><span class="token punctuation">,</span> + <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Concept"</span> + <span class="token punctuation">}</span> + <span class="token punctuation">]</span><span class="token punctuation">,</span> + <span class="token property">"view"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"url"</span><span class="token operator">:</span> <span class="token string">"{{id}}"</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"preview"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"url"</span><span class="token operator">:</span> <span class="token string">"https://reconcile.skohub.io/preview?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;id={{id}}"</span><span class="token punctuation">,</span> + <span class="token property">"width"</span><span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">,</span> + <span class="token property">"height"</span><span class="token operator">:</span> <span class="token number">320</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"suggest"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"entity"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"service_url"</span><span class="token operator">:</span> <span class="token string">"https://reconcile.skohub.io"</span><span class="token punctuation">,</span> + <span class="token property">"service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;service=entity"</span><span class="token punctuation">,</span> + <span class="token property">"flyout_service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest/flyout?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;id=${id}"</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"property"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"service_url"</span><span class="token operator">:</span> <span class="token string">"https://reconcile.skohub.io"</span><span class="token punctuation">,</span> + <span class="token property">"service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;service=property"</span><span class="token punctuation">,</span> + <span class="token property">"flyout_service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest/flyout?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;id=${id}"</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"type"</span><span class="token operator">:</span> <span class="token punctuation">{</span> + <span class="token property">"service_url"</span><span class="token operator">:</span> <span class="token string">"https://reconcile.skohub.io"</span><span class="token punctuation">,</span> + <span class="token property">"service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest?language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;service=property"</span><span class="token punctuation">,</span> + <span class="token property">"flyout_service_path"</span><span class="token operator">:</span> <span class="token string">"/suggest/flyout&amp;language=de&amp;account=test&amp;dataset=https://w3id.org/kim/hochschulfaechersystematik/scheme&amp;id=${id}"</span> + <span class="token punctuation">}</span> + <span class="token punctuation">}</span> +<span class="token punctuation">}</span></code></pre></div> +<p>Now that the reconciliation service is set up with our data, let’s see how we can use it in OpenRefine.</p> +<p>For demo purposes we use a small vocabulary of a few discipline names:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 392px; " + > + <a + class="gatsby-resp-image-link" + href="/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 58.22784810126582%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACTElEQVQoz1WT607bQBCF/f4PUPVfH4ECUkUSShFBESJEkNIICi2kufuS3bW9ttfXr1qnQcXS0cx4js9452gdEZVsghwRVkQJBDLH22b4wuCLjE1gcIOCbVjiBjkqrohTWm5idlBxTSAL0qzC6XYVk4eKm9sJHz5+4uFpjogq3CDbCcucyWNGp6N5nQk+H3U4OOpw/OWMw+Nemw+uxlwNJ5Q1OC9Tw8qDm9sHDg5PmM58RFj8+0srapgtc16mJX8WIV+/DTjpXtDp9dtoMRxNuP3+TFGBM3dzpquMVdAQRDBdF7wuM2abnLlrc8PCq1hva9ZbkAn4IbgSPLXDetuw8GripMRZiZy1MEgpWW8T/LhGRhmLxYLnX7+JY839/Q/u7sZcXPTp9y9ZrdaoMEIIiZQKqcI25nmBs1EFrjKESuJLzUbmqChhvVry+PhIGCqenn4yHo8ZDodcX1+zXC6J47jthWHYQikrmOPEiUGnBmMysixDaUOcZOTGUBRF+64sS6qqoq5r7GNrC2PMGyzPchxPwzaxtAaZgq+hbMB1N0wmk1ZgNBrR7XY5PT3l7OyM8/Nz+v0+8/m87TdN8xYdmTbEprEVZdWg0pqiasjz3VRLSpKk3bGFEKKNQRC0/b3QHk6oMyy0jol0SpiURDpDCoHneaRpiu/7b7uytT2i3ZfNtdbtQBvtipyFrFmJojVlY29G2KBiw3T6ymAwaImXl5d0Oh16vV7rvjXEmrAf8s4UXyYESr81PKGRKkKp3RH//2AvEkXRO7F9bQX/AnMRgvhFKtbFAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="An OpenRefine tabe with the values &quot;mathe&quot;, &quot;bibliothek&quot;, &quot;forst&quot;" + title="An OpenRefine tabe with the values &quot;mathe&quot;, &quot;bibliothek&quot;, &quot;forst&quot;" + src="/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png" + srcset="/static/8ee81921b4fd54654268bbb82e704459/c26ae/or1.png 158w, +/static/8ee81921b4fd54654268bbb82e704459/6bdcf/or1.png 315w, +/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png 392w" + sizes="(max-width: 392px) 100vw, 392px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">An OpenRefine tabe with the values &quot;mathe&quot;, &quot;bibliothek&quot;, &quot;forst&quot;</figcaption> + </figure></p> +<p>By clicking on the dropdown button of the column we want to reconcile, we choose “Reconcile” -> “Start reconciling…“.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/1ba989cdd764d0e20d0886cbee808596/47ff6/or2.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 115.82278481012658%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACeklEQVQ4y51Ua2vaUBjOH1u/lOo+rD9yMAb70FnYhbEORm1HwVq6KhulGi/RRHMziSYxiYnPeI5NsINplwNP3nDec57z3qX+MMZtS8b5ZQPXN79h2nNwrddrgfz/uUvSDQu9Xg+O6yFJVkiSRBDouo4oiv6f0PNcjEYj2LaNLMsKxWKxKEfoui5UVcNgMIDv+4Wrq9WqHCEtsyxLIAwDcZmWcr8UoWmaGI0UDAZ9OK5TKLhfmlDTNEynUxHL5XIpFLS4FOFsNsNwOIQs9wRxvgzDKEfIRDiOA9Oy4HmeSEaapmCySrusqmqxkV9mYqIoflLku5Cfk1zXgaapyNI0pxTf2cxG/GjhZm/9RP/3ykkl23ExVicIowRxkmL5KNlBQbhJULYG0myNZJVilWaI4mQLseguhomQbu/HqN908b1xj6u2gq4e42GyxM+OjruujvPre1y1+mj8UnD7oKElG9ADYOpDSG0BJNlWDA3bgzKxMJpYmJguDMcXmFoeNNNDV9Ex1l38aNzh9dsTvHl3ivcfz1D79E3g5MMZPn/5isuLC9TrdUi7MhYGvih4fzHHaa2Gg4MXOD5+hUrlCFWiWhGycnSEw8NDvKxWIe3KHEuKNcqi57BgbRKsDMIwTMi9HhRFEY3APelf2aIMgkAQ8PD2JNpe7CwmpYjhPkK2I18ej8fo9/vodDqibjlDaXXuST5UdhLmLpOAbtF1So46WZYRhuEm1o9SFPY+C9nrBCc425H/DAMf4YNsVZ7bS5hPbVrEywSHB93eHiIs5r0W5qQcss1mE+12W7hLC5kgWknLeI6Ez7KQki/P53PhGrMZx3EB6khE3fZU+gNiEuG48BEAOwAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="OpenRefine dropdown menu to start a reconciliation process" + title="OpenRefine dropdown menu to start a reconciliation process" + src="/static/1ba989cdd764d0e20d0886cbee808596/f058b/or2.png" + srcset="/static/1ba989cdd764d0e20d0886cbee808596/c26ae/or2.png 158w, +/static/1ba989cdd764d0e20d0886cbee808596/6bdcf/or2.png 315w, +/static/1ba989cdd764d0e20d0886cbee808596/f058b/or2.png 630w, +/static/1ba989cdd764d0e20d0886cbee808596/47ff6/or2.png 852w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">OpenRefine dropdown menu to start a reconciliation process</figcaption> + </figure></p> +<p>After clicking “Add standard service”, we can enter the url we were provided with by the upload service:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/83b34368b33ec5c1c18d5da66e80c322/e8e04/or3.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 32.911392405063296%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABKklEQVQoz43LeU+CYBzAcd7/22mutbXK0gZxKgLe4oEcghdoLZVvA13Lf1zP9tn391zC3ZPC/VuDooWHuknlRedRdJBsD8maXXg3idYM2fER9PYUs+ejtFxUy8UaRmjOFHsUE+0gTCHMLr0hSCHegxAnK/xwQRQvCRcJQRQTL9cU63DMOZzg+9JjDscT5XyW/9nn5IBQeZapyS1qskVVbPL60aIqmUiNHkprgGz2EY0uotHhXXPKua7YyM0+qjVEMrrUFJu6aqPYE4QgyQiS9IqfpMwXG/x4e9VZuMKLNnjRunwXLndli7v5Yku8+UL43O/I0i1ZtmWXpb+9pfgzGbsM+r1SFAa4oyFjd4TgdLrY7Q620zn3H5x2F81oIKs6iqpjNE0UTS/PfgB4q/7qtL6stgAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Adding the Service Manifest URL in OpenRefine" + title="Adding the Service Manifest URL in OpenRefine" + src="/static/83b34368b33ec5c1c18d5da66e80c322/f058b/or3.png" + srcset="/static/83b34368b33ec5c1c18d5da66e80c322/c26ae/or3.png 158w, +/static/83b34368b33ec5c1c18d5da66e80c322/6bdcf/or3.png 315w, +/static/83b34368b33ec5c1c18d5da66e80c322/f058b/or3.png 630w, +/static/83b34368b33ec5c1c18d5da66e80c322/40601/or3.png 945w, +/static/83b34368b33ec5c1c18d5da66e80c322/78612/or3.png 1260w, +/static/83b34368b33ec5c1c18d5da66e80c322/e8e04/or3.png 1270w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Adding the Service Manifest URL in OpenRefine</figcaption> + </figure></p> +<p>Then we just have to start the reconciliation by clicking “Start reconciling…” and our reconciliation service will be queried with the terms in our OpenRefine project. +We are then presented with the results:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/d4191f055b104445a4c283e09a9ebec8/ad997/or4.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 131.0126582278481%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAYAAAC3g3x9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADMklEQVRIx42ViY6jOBCG8/7PttLu9jEzaY6E2+ATGwKY419h2Ew6nckM0qeKI/hdh6t8+BEO8AKCkvcII4O/Xzx8/0hRVO1X6G+oWhyCtN8XBn6Y4xwXIKVAWSmQSl1tUa7I3f6aQ1q2qLWGkBJRJhEmCkFSI8klGJfgUkOpGsbUaIyBMQZar+iHHLKygdE16rpGzizeQ42/vjG8etzx7wfHu89wTigqKiCVgtHKfbx+c88nwazq8OOsndD3UOBbKPDqCbz5Ai+ewD/H9X+GIOYoKwalboW147OHtEeQaHiRgB9LeLFEEDGkRCAvFTKykRKFinLUN4KPQ6YdjpHGe8DhxxynVCLOBVKy2k2IcQG9h3wv9kUwo73L4csHw/HEEKYSpGSfPLnnqYdZ1bscvvkcr/6Wv1NSgTIOqXaRG4HfCha0u+YwSKQjTCSOZ4m04FCSw5jHod4Itp+K4sU/PXzbeQ8EXn0OP+IoSn6t7pNzqJxgTC7wzhwfQYYwyhBnFIQqFJVEXkpX6ZJKSCkf5tOdQ8It2m5A07SIU4I4LdFeeox2wDRuzJPFMltnp9HCWothGB5ykAbumeYZVFokZe86JqUjKmmhTI+mmx2XfsY4jnj2HKRZACxYlgVULfBzi2PcISYdMmqRc+s2WCHCgqkerB4d0ozgekLTDpim8ZHgjFNhEeYDlL5gmZ97c/+sGp8EWT0joyMyZkHlgEvXYVm2F/+ELx6ugkk1IiID4srCNC2wzNfdN3AjsGB5lsNKzfCzAR9JhyDrEZHOhT7vod97+/9GT4qy5dBLO5zJ4MQj0jvRaZrce/c5e1Ll2YWcsxEFX/M4IqUWcTm4ahPeuWNUyhFMWfT9cHXkloNqfqoLAxSsR8UbZFXjCsPqCbqdoZoZ0kxuXbfT7vGDc1jJCcM4oW0viHMOKhqoukHftbC2xzyNrjsm1yWjs+PeLY84JKSFqjWEEO5iinPtBuspVTin67QRDlJWqOuth7WbNBtfejlfh4PZRtHa19v44jsCXiRxPEl3j6SFQFHV1+tgtVyIX8/DuGjgRwznOEeeF+7ekEqDyxpcbIj9N9vX6yi7FfwPKQ3BT/UodQMAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="OpenRefine UI with lists of reconciliation candidates" + title="OpenRefine UI with lists of reconciliation candidates" + src="/static/d4191f055b104445a4c283e09a9ebec8/f058b/or4.png" + srcset="/static/d4191f055b104445a4c283e09a9ebec8/c26ae/or4.png 158w, +/static/d4191f055b104445a4c283e09a9ebec8/6bdcf/or4.png 315w, +/static/d4191f055b104445a4c283e09a9ebec8/f058b/or4.png 630w, +/static/d4191f055b104445a4c283e09a9ebec8/40601/or4.png 945w, +/static/d4191f055b104445a4c283e09a9ebec8/ad997/or4.png 1012w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">OpenRefine UI with lists of reconciliation candidates</figcaption> + </figure></p> +<p>This already looks good! +Now we can choose matches by clicking the checkmark or get additional information by hovering over the proposed entry from the reconcile service.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/3400dd15c8f9dd3db28fa4ee867fedff/42d54/or5.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 64.55696202531645%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBUlEQVQ4y32RWU/bQBRG8/9/RtWHtuprH9qqqBJCtCQiJMFZxltsvNvjZSZNwlJOZQeCIIWHT3Ol0Rydb27PdAJMJySXK9JcU0hNUWqKaoOst93Zpr3PpXq6fxmpGcwUvShbIXzFcF4wnEtsvyBMamZzl0tjwUK4CMsjzjTb7QatNUo1/42sGnqp3OJGG6a2ZOaWiGWJ8BSDwTlnZ7/p9/ucnBxzMbrEMAziKGS1WtE06iBaKXpJscEO1oxNycQsmbttGsaTS/pnpwg7xFo2GCJjPHVw/YSyqqmqCqVaULM/23RAJ1xjtIbOztD0NTNLYyxKTO8WP4FlfIcdNAivwQtyiiJ/BnzMk6GQjM2SidVW1xwdw9cj+PLtlvH8jjC/JkkLZFlT1c0zs0NguKts+5IgKgiSPwyNml/nKaeDv/w8hZl1Q13LZ4CXsB1QPlVeLEssT+IEmu8/Uj58FHz67PDuvcvFpGK91vu/etUwfjCcmJKpXXamU0dhGA3DQcboIud8kOK4Cq3Vq6A9MJUb3EdDt2SxlAhPExYQyV1CCYm8Y6Ubmu7h/2F7QytYMxJlt5SRkBiO7jbrx/f4yf1ujjZkeX5Q+QCYyS3LeI3tZZjLHOFmWL7iKuUBdt/NbnhNEEuqsny7shcpLL9GOBFBmJBnMWmu8FO46mA7wyi/QbeVm7cr/wPRcMi+E1rICwAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Interative OpenRefine pop-up to define a match" + title="Interative OpenRefine pop-up to define a match" + src="/static/3400dd15c8f9dd3db28fa4ee867fedff/f058b/or5.png" + srcset="/static/3400dd15c8f9dd3db28fa4ee867fedff/c26ae/or5.png 158w, +/static/3400dd15c8f9dd3db28fa4ee867fedff/6bdcf/or5.png 315w, +/static/3400dd15c8f9dd3db28fa4ee867fedff/f058b/or5.png 630w, +/static/3400dd15c8f9dd3db28fa4ee867fedff/42d54/or5.png 858w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Interative OpenRefine pop-up to define a match</figcaption> + </figure></p> +<p>If we want we can also search through our vocabulary by clicking “Search for match”:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/cd12abcd7fdd02842fd5225eab7ceaf2/f5209/or6.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 46.202531645569614%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABoklEQVQoz32P6W4aMRRG5/0fBQgBHqA/qmwVyY+2QFhm3z2L7YFkKAlwqnGDVFVRLX0690q+x9fWdBbwtAj5vs54nAeE1RtpA0mDoak1xOpMrM+GkToR/5Wu7+6t4wYrjHOyojaR+oX3E5TbN+JUkGUZWZZTFCW1lNS15Hg88e85nc6Gutlize2UtZ8h5At5vaPcHtCv70gjqKnqmte25XA4sN/vP9Iatu0fHo9HOJ+RSmGFnktoL8lCj8hdI2IfKRL2W8V+p/m107SNxHEcPM9DCEGSpuR5TvrB7lGtNWEUY909PLFYPLNxHGzHxfV8KqkQRUmaCcM4SZhOp8xmM6qqMsOXKKXMbzre3N5hffn6jflqgxsmZKUkEZWhqDV5pSjVDj9KGQ6vGAwG9Ho9rq+vGY/HjEYjk66+9NbtwyMbN+DH/JnlxkV0EtkY5qWkVA1+lBhZv9837IYnk8mnsW7upyxtj/lyw8/FiigrKGRjZN2mXe2FCb1e3wi7/FfYbWj7IW4Qs7Jd1o6PG0QUtUbUikpvCeLuy0OuhkPDi/Az8W+XxoPlF1vQggAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Searching for a vocabulary term in OpenRefine" + title="Searching for a vocabulary term in OpenRefine" + src="/static/cd12abcd7fdd02842fd5225eab7ceaf2/f058b/or6.png" + srcset="/static/cd12abcd7fdd02842fd5225eab7ceaf2/c26ae/or6.png 158w, +/static/cd12abcd7fdd02842fd5225eab7ceaf2/6bdcf/or6.png 315w, +/static/cd12abcd7fdd02842fd5225eab7ceaf2/f058b/or6.png 630w, +/static/cd12abcd7fdd02842fd5225eab7ceaf2/40601/or6.png 945w, +/static/cd12abcd7fdd02842fd5225eab7ceaf2/f5209/or6.png 1061w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Searching for a vocabulary term in OpenRefine</figcaption> + </figure></p> +<p>After selecting the appropritate matches we have successfully reconciled our data:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 340px; " + > + <a + class="gatsby-resp-image-link" + href="/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 84.81012658227847%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACy0lEQVQ4y4WTW2/bRhBG+f/fiyII0gAp0Ke8GPCD4biObER1U9uS66CNL0kkkqJ43wvvK9o6BVdKkIuNDnDwfTPYHQwXQyfKDNe3HW5g8AKJv1QsQv2FINKESUUqOpK8tfo1Sb7ROGuRxQonESuOjwtuPhh2dl/x9NmvPHv+Gz/9/AtPnr5gb/+Yk78uUeWaOGts0+9JRbtpqFc4YWrQ1ZpM3hFlrZ0miEoWYUEQFURpQ5jWZHJFKs2DZNKQCLOZMIwLPn7ymc0D5u4S1wu/xV9a5l6A6w36I0N9uJ/LFscLG4JYs0w0QbLRzywizcxX/8t8ofjoSfuejusrXo8yxic5x29yziaCyYVkdJzxx585qqjIRYWQFUI9Ti5KirLByTPF6WnK6duEv6cpF9PU6sk44d1lhmkLmqqgLDVFoSkfodCKuq5xslxx4wmuXcH7uWAWSJvf+ht/9m/G9CojzRRaa5TWVr9HKUVVVThlWZOIiijfkMqaTNdWddUQi5pc1/R9i+ka6rqhaX5kmK5tWxylen4/0IzfFJydVkzOK8bjgum05uKiZjqpLOfnFUL0DLFe82Dc39/jtO0ds1mH73X4fkcYGha+IVwaXLdjOfxBXkcQGOr6bttw/SC24erunqXomcWGT5Gx3ktXuMmKRPdc+Z2tf45HhttOuB7esCFKanTZIHSDLlvri6q1iKIhVw1d19E0HcZ09H1n80GHfKBpWowxOL4vODqKeX0YWfb2Qg5eRZajUczBwaa+s7NkNIoIQ8n+fsjubsjhYcRoFPPyZcB4HNN1NY6UmihWuJ5ksZDM55K5u2EZKmYziedLPE+yXCqE0NYHgbLnh5rrSuJ4u4fDfl3e5lzc5EyuMt7PBO8+5JbrueDtPxmTq9zuX10VdufquqCq9BeGvCi2ezh8d9sami1tt6U1dJ2hbjb14dyG1Vf+W/q+5z9ZqfhGhqCzCwAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Matched values in OpenRefine column" + title="Matched values in OpenRefine column" + src="/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png" + srcset="/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/c26ae/or7.png 158w, +/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/6bdcf/or7.png 315w, +/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png 340w" + sizes="(max-width: 340px) 100vw, 340px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Matched values in OpenRefine column</figcaption> + </figure></p> +<h2>Further reads</h2> +<p>Christel Annemieke Romein, Andreas Wagner and Joris J. van Zundert published a tutorial about <a href="https://doi.org/10.21825/dlh.85751">building and deploying a classification schema using open standards and technology</a>. +In this tutorial they make use of SKOS, SkoHub Vocabs and SkoHub Reconcile. +We recommend having a look to see the use of SkoHub services in action.</p> +<h2>Next steps</h2> +<p>The services are currently in an <code class="language-text">alpha</code> phase and ready for testing. +You can test the service under <a href="https://reconcile-publish.skohub.io/">https://reconcile-publish.skohub.io/</a>.</p> +<p>Feedback is very much appreciated: via email (<a href="mailto:skohub@hbz-nrw.de">skohub@hbz-nrw.de</a>), as an <a href="https://github.com/skohub-io/skohub-reconcile/issues">issue</a> or – primarily for the German-speaking users – in the newly set up discourse forum <a href="https://metadaten.community">metadaten.community</a>.</p> +<p>Our next step will be integrating the above mentioned <code class="language-text">lang</code> parameter to be able to serve all languages of a vocabulary without the need to specify it beforehand.</p> +<h2>Repositories</h2> +<ul> +<li><a href="https://github.com/skohub-io/skohub-reconcile/">SkoHub Reconcile</a></li> +<li><a href="https://github.com/skohub-io/skohub-reconcile-publish/">SkoHub Reconcile Publish</a></li> +</ul><![CDATA[Development of SKOS SHACL shape]]>https://blog.skohub.io/2023-11-22-shacl-shape/https://blog.skohub.io/2023-11-22-shacl-shape/Wed, 22 Nov 2023 00:00:00 GMT<p>To improve the error messages thrown by SkoHub Vocabs for invalid RDF Turtle files, we decided to implement a validation step, before the static site of a vocabulary gets built with the <a href="https://www.gatsbyjs.com/">Gatsby framework</a>. +This validation step should provide more meaningful error messages than the currently cryptic ones thrown by Gatsby. +While we could have gone with one of the existing SKOS validator tools like <a href="https://skos-play.sparna.fr/play/">SKOS Play!</a>, <a href="http://www.w3.org/2001/sw/wiki/Skosify">SKOSify</a> or <a href="https://www.poolparty.biz/skos-and-skos-xl">Poolparty</a> (it’s pretty epensive) we decided to go with a more generic approach and define the shape rules not in code, but in data.</p> +<figure class="gatsby-resp-image-figure" style=""> + <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 256px; "> + <a class="gatsby-resp-image-link" href="/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png" style="display: block" target="_blank" rel="noopener"> + <span class="gatsby-resp-image-background-image" style="padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEkElEQVQ4y4WTe0xTVxzHj7VFAps2KzH849AlLsojpLhmGHRlE7BlxvWy4hybPDbGY/FFRIE4gxmBQQCNcYIVWlsaBBNrLeJE0Dk3RSbbYDAfwMDHhosxE8gYpaX3fJdzWnS6Lfsl3+Sc373nc3+/7+9cEhISQsrLy0lTUxMxm83EYrE8JbPZQtrsDWTjDgMhy6tVufu+7s07eIUuTTl2z+8Ng/6tzbXkcsdJsm37dsJDLpeHxcXF7dPr9eU6na5CEISnpBOEio0bkirCo7WlH1dd+O3ug0kse7/JE5BQh4D4OvfKxA/2v7cx6bNXo1dWEkIWksjIyA3d3d1wuVwYGxvD+PgE18SEV4/GxuF2TuJi9zCKDF2ISD8+47fGgAVao4fE1ODA8Wtg0XisCYSQcBIVFaUbGBhgORelmAGeSGTy5Vqv3psJSbaK89YYMF9TTxdojSArP6e2S8P8uaPlNAMuJ0qlUrhx4wYDigAoi0mnm7L1rFo779CgdUdpYEIdZdU9t7aektU1SNx1hjqnve86HA4GDGUVCteve4Fnu+7S/EOdKDR0Ya+pG9ZzA9DvOYewtGaYz97Cw/EpWNpuYd6aI4jd6oB7xsOOcWBLS4sXGBYRKdwdGULv8IS4u66LftN3Hy/qrZCoD4O8cgCa/FY4XTP4e8Ruc6CisYevp5yup4Gh4V7g4dOD4kFbH11f9AWHPa+pR7DOgl8fTvKD024P3MxVAFmVX2Hf8R+9eZf7mQrDI4Xbw4Ownh8Rl2ywUrK6Fi+sM2G+1siuBS7+MMoPejwinC4PX6eXfYlPzd/9e4Ws5ZGfB3H7gVNcuP4oJatqQF6rBQP7xx1BsM6Mxo7Bx+3+MeXGS+80Ym1+qy/zjIdsKD/5hnKl/z4Vdrdh1WY7ik3dGPxlDGeu3uE+qrc6UGy6hp01nahu7uVDYe8+mpj655Rv3nxybfAfsaf+GqSvG9A/8jt2130LEnMIJPog8g9d5kD7KR+Q3cP+/n4OdDqn6bTLDbfbDee0ixnOPAKoB5N/TmPz/kvQ7mzlQ5MnGiFR10KV2cyBtpMnvUCVSiWMjo7+b4UsCo198I83sT8Fcm09SGw9ttd+z4Ed5y94gUFBQUJKSgq2bNkibtq0iaalpSEzMxM5OTnIyspCdnY2PsrKRk7Wh4gXMkCiikFW1cIvwQKi/ARvvp1GC3btoNrERC+QECIQQthGVKlUVKlUQqFQsD0CAwMhkUggk8mwdOnLPBexIgY5exuwTJ2OiKholqM+QSqVhpKAgAAOzMjIEIeGhqggCCgtLUVZWRksFgs0Gg0KCgrQ19eHxYuX4JTdhsz0FKS+q4e1wcyBfn5+dO7cud4KpVIpB4aFhYlGo5E2NDRwoN1uR3t7O1JTU2Gz2dDT04OqqioYTSZeqTJqBU6csHHgnDlzqK/LUCKTyThQrVaL1dXVtLKyEnl5eWyPpKQkFBcXo6ioCLm5uSgsLERJSQmsViuSk5P5R0tKSqhcLudAmUz2xEOJRCIuWrRo9kvcN9aGv78/ZnO+thAcHPzYY4VCQSUSyeMK/wIeEsftKQa/pAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"></span> + <img class="gatsby-resp-image-image" alt="SHACL logo" title="SHACL logo" src="/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png" srcset="/static/3180b8faaa30763f57cf0aeda0f8a2e3/c26ae/shacl-logo.png 158w, +/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png 256w" sizes="(max-width: 256px) 100vw, 256px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async"> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">SHACL logo</figcaption> + </figure> +<p>If you want to validate the shape of an RDF graph, you currently have two options to do that. You can either use <a href="https://shex.io/shex-primer/index.html">Shape Expressions (ShEx)</a> or the <a href="https://www.w3.org/TR/shacl/">Shapes Constraint Language (SHACL)</a>. +We decided to go with SHACL for the following reasons:</p> +<ul> +<li>slightly better tooling (e.g. the zazuko Team provides a JS Validation library <a href="https://github.com/zazuko/rdf-validate-shacl">rdf-validte-shacl</a>)</li> +<li>there were some existing SKOS-XL SHACL definitions published by the Publications Office of the European Union: <a href="https://op.europa.eu/en/web/eu-vocabularies/application-profiles">https://op.europa.eu/en/web/eu-vocabularies/application-profiles</a></li> +</ul> +<p>Unfortunately the SKOS-XL shape did not work with our tooling (<a href="https://jena.apache.org/documentation/shacl/">Apache Jena SHACL</a>) out of the box. +Therefore we decided to build a SKOS shape from the ground up based on the <a href="https://www.w3.org/TR/skos-reference/">SKOS Reference</a>.</p> +<h2>SKOS Reference Shape</h2> +<p>The goal was to implement every consistency example from the SKOS Reference as a test case for the shape. +To accomplish this it was on the one hand needed to formalize the class and property definitions from the spec as well as the integrity conditions. +On the other hand we needed a triple store with reasoning capabilities to apply these rules to the very basic examples in the reference. +We used the Apache Jena tooling for this and built a <a href="https://github.com/skohub-io/jena-docker">jena-docker containers</a> based on the docker containers of <a href="https://github.com/stain/jena-docker">this repo</a>. +The SKOS class and property definitions are defined in <a href="https://github.com/skohub-io/shapes/blob/main/skosClassAndPropertyDefinitions.ttl">this file</a>. +The workflow for validating the SKOS shape is as follows:</p> +<ol> +<li>The fuseki container is started with the <a href="https://github.com/skohub-io/shapes/blob/main/fuseki/config_inference.ttl">inference configuration</a>.</li> +<li>The class and property definitions are appended to <code class="language-text">skos.shacl.ttl</code> file which is mounted in the container.</li> +<li>The respective example is mounted in the container as a ttl file (e.g. <a href="https://github.com/skohub-io/shapes/blob/main/tests/valid/skos.shacl.ttl/ex05.ttl">example05</a> )</li> +<li>The validation result (which is itself a RDF graph) is temporarily stored</li> +<li>The validation result is <a href="https://github.com/skohub-io/shapes/blob/main/scripts/checkForViolation.rq">queried with SPARQL for errors</a></li> +<li>Based on the query result an error message is put out</li> +</ol> +<p>This way we accomplished to validate all valid examples from the SKOS reference up to <a href="https://www.w3.org/TR/skos-reference/#example-68">example 68</a> as valid and all the invalid examples as invalid (entailment vs non-entailment examples were left out).</p> +<h2>SkoHub Shape</h2> +<p>In SkoHub Vocabs we are a bit stricter regarding some aspects of the SKOS reference. +For example we want every <code class="language-text">skos:Concept</code> to have at least one <code class="language-text">skos:prefLabel</code>. +Therefore we developed a SkoHub specific shape with <a href="https://github.com/skohub-io/shapes/blob/main/skohub.shacl.ttl"><code class="language-text">skohub.shacl.ttl</code></a>. +In contrast to the generic SKOS shape this shape does <strong>not</strong> contain any <a href="https://www.w3.org/TR/shacl/#sparql-constraints">SPARQL based SHACL constraints</a>. +Though it is possible and especially for more elaborated queries useful to use SPARQL to check constraints, the available tools (at least for javascript <a href="https://github.com/zazuko/rdf-validate-shacl">rdf-validate-shacl</a>) do not support such queries.</p> +<p>As a result, validation errors and warnings help SkoHub users to improve the quality of their vocabularies. See for example the validation warning for no provided license:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">-----------Warning-------------- +Message: [ + Literal { + value: 'A provided license increases reusability of a vocabulary. Should be an URI.', + language: '', + datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' } + } +] +Path: http://purl.org/dc/terms/license +Node, where the error occured: http://w3id.org/example-cs/ +Severity of error: http://www.w3.org/ns/shacl#Warning</code></pre></div> +<p>Or the validation error if the object of <code class="language-text">skos:hasTopConcept</code> is not a <code class="language-text">skos:Concept</code>:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">-----------Violation-------------- +Message: [ + Literal { + value: 'The target class for hasTopConcept should be skos:Concept', + language: '', + datatype: NamedNode { value: 'http://www.w3.org/2001/XMLSchema#string' } + } +] +Path: http://www.w3.org/2004/02/skos/core#hasTopConcept +Node, where the error occured: http://w3id.org/example-cs/ +Severity of error: http://www.w3.org/ns/shacl#Violation</code></pre></div> +<h3>Community</h3> +<p>Thanks to a lightning talk at SWIB23 (<a href="https://pad.gwdg.de/p/0ytHDo597">slides</a>, <a href="https://www.youtube.com/watch?v=jzdU1zHKlNU">recording</a>) we got some attention to the shape. +Suggestions made by Jakob Voß, Osma Suominen and Antoine Isaac already greatly improved the shape. +Further suggestions and improvements as well as your use cases are highly welcome.</p> +<h2>Outlook</h2> +<p>We were quite a bit surprised that we did not find any usable existing SKOS SHACL shape. +Hopefully our work may help others validating their SKOS files and improve the overall quality of vocabularies. +There is currently still <a href="https://github.com/skohub-io/shapes/issues/9">an open ticket</a> for implementing the <a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#Ambiguous_Notation_References">qSKOS best practice rules</a>. +Any feedback and collaboration on the shapes is welcome!</p><![CDATA[Moving to test-driven development and updating existing tests]]>https://blog.skohub.io/2023-02-09-tests-updated/https://blog.skohub.io/2023-02-09-tests-updated/Thu, 09 Feb 2023 00:00:00 GMT<p>For quite some time we have been adding new features to SkoHub Vocabs like <a href="https://github.com/skohub-io/skohub-vocabs/issues/79">switching languages</a>, display of all relevant properties on the concept page and <a href="https://github.com/skohub-io/skohub-vocabs/issues/159">support for <code class="language-text">skos:Collection</code></a>. Unfortunately there were no tests added to actually test these new functionalities. This led to some surprises now and then, for example when we noticed that at one point language tags did not show up when visiting a Collection page directly.</p> +<p>Originally SkoHub Vocabs already contained some tests, so being the maintainer of SkoHub Vocabs I decided to follow up on that and got myself a little bit more familiar on the topic. Quickly I stumbled over the topic of <a href="https://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development</a> (TDD) and though I heard of it before, I decided to dive a little deeper and check, if that pattern might be appropriate for SkoHub Vocabs and the other SkoHub modules (and maybe my coding approaches in general).</p> +<p>The general idea of TDD is as follows (borrowed heavily from the Wikipedia article):</p> +<ul> +<li>Requirements of a new feature are first translated into test cases</li> +<li>Tests are written</li> +<li>Code is written</li> +</ul> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/bb776e8e9127b9f8b7db84ec085e8e24/c8551/TDD_Global_Lifecycle.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACoElEQVQoz1WTW2sbRxiG9et6mdtelPaq975Of0HvixrZVWklDIGaksSFthCFONiWoSSpE1zr4Oiwc9hdaVe7lnajg3dnnzKT+qIDDx/zzcsL32FqWuszpdQHKWVPCNG3SCkdSqm+1trFe+7v99qpJ/6Xr2mtY6UUNzc3DIdDRqORYzAYIIRAa419v8fePc9z+vF4jBh9QP2n00phDX0pJbdJUmKMoapMaYxZZblRShmttPF14NBaG6mkSdPUlIUxd8aYqzQ3Ok6Mr5TT1zwhg/w25amIzXd9zcZUFOs1bDds1huE9BhPe0ymA4ScslzmlCXstor3achnv7/miYgpPmZ4QlITSgVQ8fNAm69eXLIoDIQhgZqxLNbo8B9G3iVj8Q5PX7ErE/LiBqpbsruCw1HAdZpjj/Z9amEYBnfbLcUiNRGQ73Zks4gvO5d8+27IZpUipY9SPsliyTD+gT+uH6DyIcPZirLYObM7UxFFEbXA94Msy9hd/GWWf75guytZlxX7vQHdKGOVJAgpkFIQzRek2x59+YhloijKikG64utX7zmfpaziiJqcesEGiB/9aPoPPmej+uQmADKoKnzfdxP8FBW7nbEdYi19zGTCTz3JFydXyGVG6GtqUspgHseYRWK4HkC5pWTjygjDGZPJxGFXZDqdOtP15iO5HRxwLGN+FTF2sHbNXA//fvuWw8ePzS/Hz3h58orjZ7/RarXodDpMJxO3n3YvreHZ2RntVoujoyNenpxw/PQJh+023W6XMAw/Gb5+84Zms2kOGg2+r9dpNBocHBzw/HnHiWy5ltlsxvn5uXvb39+nXq+72Gw2OT09dZqaUiqwwiiKzH2/LPP5nCRJnKElCAKHzdlp2l9j892LC9qHbR5+85C9vT3+Bb6OWOgwZKY/AAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Test-Driven-Development Cycle" + title="Test-Driven-Development Cycle" + src="/static/bb776e8e9127b9f8b7db84ec085e8e24/f058b/TDD_Global_Lifecycle.png" + srcset="/static/bb776e8e9127b9f8b7db84ec085e8e24/c26ae/TDD_Global_Lifecycle.png 158w, +/static/bb776e8e9127b9f8b7db84ec085e8e24/6bdcf/TDD_Global_Lifecycle.png 315w, +/static/bb776e8e9127b9f8b7db84ec085e8e24/f058b/TDD_Global_Lifecycle.png 630w, +/static/bb776e8e9127b9f8b7db84ec085e8e24/40601/TDD_Global_Lifecycle.png 945w, +/static/bb776e8e9127b9f8b7db84ec085e8e24/78612/TDD_Global_Lifecycle.png 1260w, +/static/bb776e8e9127b9f8b7db84ec085e8e24/c8551/TDD_Global_Lifecycle.png 2814w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Test-Driven-Development Cycle</figcaption> + </figure></p> +<p>This leads to the following development cycle:</p> +<ol> +<li> +<p><strong>Write tests</strong>: This ensures that the developer actually understands the user requirements. Usually this is done with the help of use cases and user stories.</p> +</li> +<li> +<p><strong>Run tests</strong>: The tests should now fail. If not, it might be the case that the actual feature is already present in the code and no further code needs to be written. Maybe documentation has to be updated accordingly.</p> +</li> +<li> +<p><strong>Write the simplest code that passes the new tests</strong>: The code can (and should) later be refactored, so it can be ugly at this point.</p> +</li> +<li> +<p><strong>All tests should now pass</strong>: If the code is still failing it should be revised till all tests pass.</p> +</li> +<li> +<p><strong>Refactor as needed</strong>: Your tests now verify that the new feature is working as expected. If any tests during refactoring fail, you now can and will immediately correct your code.</p> +</li> +</ol> +<h2>Consequences on SkoHub development</h2> +<p>This approach has some consequences for the development of SkoHub modules. +These changes will also be reflected in the <a href="https://github.com/skohub-io/skohub-vocabs/issues/242">yet to be published CONTRIBUTING.md</a>. +Issues for new features should contain use cases and user stories as well as some notes that indicate when the feature is actually correctly implemented. +Just when all of this is present, the issue can be marked as ready. +The use cases and notes can then be used to write the tests and follow the above mentioned development cycle.</p> +<p>Regarding code review, this approach also has some consequences. Code review should only be approved if tests were added for the new feature or the tests were adjusted in case of bug fixing.</p> +<h2>Testing Strategies and Technologies in SkoHub Vocabs</h2> +<p>At the end of this blog post I want to give you a short overview of currently used testing strategies and technologies used in SkoHub Vocabs development. We use <strong>unit tests</strong>, <strong>integration tests</strong> and <strong>end-to-end tests</strong> whereby we try to write more unit tests than integration tests than end-to-end tests. The reason for this is that end-to-end tests take long and are quite expensive regarding computing power and time. Unit and integration tests on the other hand are cheap and can also auto-run in the background on every save, thus giving you immediate feedback when something is broken.</p> +<p>For unit and integration tests we use <a href="https://jestjs.io/">Jest</a> and the <a href="https://testing-library.com/docs/react-testing-library/intro">React-Testing-Library</a> since Gatsby – with which SkoHub Vocabs is built – uses React. +Some of the older tests used <a href="https://enzymejs.github.io/enzyme/">Enzyme</a>, but after upgrading to React 18 I noticed that Enzyme was no longer working, because <a href="https://dev.to/wojtekmaj/enzyme-is-dead-now-what-ekl">the project is dead</a>. +After some research I found the React-Testing-Library as the most recommended testing framework and migrated the old Enzyme tests. +After some initial training, writing tests became actually quite handy and fun.</p> +<p>Adding tests is by no way finished at this point, but a lot of the lately added features now have some proper testing. This already required a few changes to the code base from now and then when I noticed things weren’t working as expected.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/a0ad657099e495b1977b78ba0e9879f4/3f3b9/test_coverage.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 79.74683544303798%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACj0lEQVQ4y21U13LbMBDkd7hQoggSANHZJbmoOLE9cezEk///lc3gKI9K8nBzHJBY7N4umDhdo8gFipxT54WErhziulEeztQItoFWDlaFqetAVYcWwTXwtqZeMomk6QOsNwS4mBUEKoVCOwY476GUxnjXopIK/bqG1haVUmiHSKQiAhEodpaVSEJvsdrVsEGD5SXyrERZSCy3AaH1qEyF/fsSnEvcP7cw1kAqgfunDqrkmKU5shnD/NAT1xjs30dsf46wtSbAfM4ReoNuWaMoODavA/KMo7/3cMFCKon1toPmAot5cVaJ8Rr7jxHrfUsfspwTYD1YdKuaTn14HsAWETCcARohkGcXgMTwY0S78pCVRMHiqRNgv6oxT/8PuNq2NLNZyjC7ZUhvGT0nvjX49rlCM7pphovyyPAg+fFloFGcMdx1GIOCVwK2EnBKoOJ8Yvj42iP2gpVHyb0hhiR506C4YHi37zB4Ba8FgpZUWnAkJmjsf41YP7VwjUZZHCRHwHWN9DrHw3NPsTo1JUq+ucpxfZXj9iY/kdxZbN8GLDc1hBDI0uJMchxDlLeYlRguTHFSIhgJWXJSQqbEjbv3ETGPylbQVh9jczDl/nsPll2aEnMoYKQAZ+UpoMPznzU2PwZs3gb060CbyeV1g/Rmkjy5fC45vYkO53ToYs6mYPs+xmbAuAnk6OyaIUtLuFYRwxiJ6HK8khNDh+ogOY7hn2C3TY+u69C2HXxjKI/eBzShg3c1xUWKivIZDeNlRQbRWs6J+bFKJL8/PrF73KHiGsu7DtuXFaw19IephME8SrrNkaWMpMU7+9WjxMtKNpsn1HUPWTk0zRLe9ZjPS2QLTiGP2SwYP+lTxXdfRpxK/gupYeYBEmn59gAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Test Coverage in SkoHub Vocabs" + title="Current test coverage in SkoHub Vocabs" + src="/static/a0ad657099e495b1977b78ba0e9879f4/f058b/test_coverage.png" + srcset="/static/a0ad657099e495b1977b78ba0e9879f4/c26ae/test_coverage.png 158w, +/static/a0ad657099e495b1977b78ba0e9879f4/6bdcf/test_coverage.png 315w, +/static/a0ad657099e495b1977b78ba0e9879f4/f058b/test_coverage.png 630w, +/static/a0ad657099e495b1977b78ba0e9879f4/3f3b9/test_coverage.png 870w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Current test coverage in SkoHub Vocabs</figcaption> + </figure></p> +<p>For end-to-end tests I decided to go with <a href="https://www.cypress.io/">cypress</a> since it has an excellent documentation, is fully open source and runs tests in a real browser.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/058d6/cypress.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 32.278481012658226%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWklEQVQY04WRy07CUBRF+QAf8RG11pZSsICKiGgc6C9oSFBnOjD6hU408Recmgg+iBoTQ6VYKHLb3i5TiI+ZO1nJGa1k75NIW1toRgkjs0Emu4Wqr/6gp0pMTGfYPzyj05M8vdk0HZcgkIThEN8PESKkL3xabY+EtbSNubiJbpXJrexgpMtoRhHNWCNprjM1Y1E9OMX56NNst+h4HkIIXu0mL3YTKSVRFBGn5XRJzGsFBpirGPkyWqqAouWZVSwUNcfI6Dx7lSM63YC2+4HwfT77fey2Q0+Igehb6MTCuFosVM0iyWwJPRXXXWZGWRwKx1R2K0e43QAR+IRRhB8GBGGIBAIpB0gi3p3OH2FmDWNpA80soOh55tQcippnZGyBvcoxPU/yXzz381e4kC6Rym6STJdRk8OnxFuOT5pUqyc0bJfz2g2X9zUu7m4HDO8aVw91rh7rXDee+QI+MD3OeY3jmQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Test in Cypress" + title="Example of Tests running in Cypress. On the left you see the test and can also jump forth and back between states, on the right you see the rendered HTML page" + src="/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/f058b/cypress.png" + srcset="/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/c26ae/cypress.png 158w, +/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/6bdcf/cypress.png 315w, +/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/f058b/cypress.png 630w, +/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/40601/cypress.png 945w, +/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/78612/cypress.png 1260w, +/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/058d6/cypress.png 2277w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Example of Tests running in Cypress. On the left you see the test and can also jump forth and back between states, on the right you see the rendered HTML page</figcaption> + </figure></p> +<p>All of the tests are actually integrated in the SkoHub Vocabs CI pipeline and run before a new docker image gets build.</p><![CDATA[Notes from the November workshop]]>https://blog.skohub.io/2022-12-19-workshop-summary/https://blog.skohub.io/2022-12-19-workshop-summary/Mon, 19 Dec 2022 00:00:00 GMT<p>Due to new funding for SkoHub development we conducted – as <a href="https://blog.skohub.io/2022-11-skohub-workshop/">previously announced</a> – a workshop on the 17th of November. About <a href="https://pad.gwdg.de/s/2022-11-17-skohub-workshop#Attendees">15 participants from three different countries</a> joined updates and discussion around the following topics:</p> +<ol> +<li>Current state of SkoHub</li> +<li>Introduction of Metadaten.nrw project</li> +<li>Collection of requirements from the community regarding PubSub and reconciliation</li> +<li>Presentation of SkoHub Reconcile prototype by Andreas Wagner</li> +</ol> +<p>We split the workshop in two parts. First, we gave a general overview about the current state of SkoHub and the renewed funding through the Metadaten.nrw project. Then we had a general discussion about SkoHub PubSub – the module to connect a SKOS vocab with the Fediverse – as well as Andreas Wagner’s Reconciliation prototype. See also the <a href="https://pad.gwdg.de/p/veKgVreqw">slides for the first part of the workshop</a>.</p> +<p>In the second half Andreas gave us a technical deep dive into his reconciliation prototype, walked us through the code and we discussed the architecture as well as future development and integration into the SkoHub ecosystem.</p> +<p>In the following, we will go deeper into what happened in the different parts.</p> +<h2>Current state of SkoHub</h2> +<p>Currently, SkoHub Vocabs is by far the most used SkoHub module. It is used by the <a href="https://www.hbz-nrw.de/">hbz</a>, the metadata standardization groups around <a href="https://wiki.dnb.de/display/DINIAGKIM">KIM</a>, <a href="https://wirlernenonline.de/">WirLernenOnline</a>, The <a href="https://www.iqb.hu-berlin.de/">Institute for Educational Quality Improvement (IQB)</a>, in research projects in the area of digital humanities and by other people and institutes to publish their controlled vocabularies.</p> +<p>The browser plugin SkoHub Editor as well as the PubSub module haven’t been used in production yet and have been shut down temporarily in March 2022 due to missing resources.</p> +<p>In 2022 the work on SkoHub started again when we <a href="https://blog.skohub.io/2022-05-eww-project-kickoff/">partnered with effective WEBWORK (eWW)</a> to redesign the web pages, create a new logo, improve UI configuration and address other issues as for example the support of <code class="language-text">skos:Collection</code>. (See the <a href="https://github.com/orgs/skohub-io/projects/2">project kanban</a> for an overview.)</p> +<h2>Decouple software and services</h2> +<p>The general idea is to further decouple the software “SkoHub” from its running instances. Therefore we also wanted eWW to work on UI configuration possibilities, so other institutes or projects can easily brand their SkoHub instance.</p> +<p>In the future, we will move the hosted instance, currently running at skohub.io to metadaten.nrw, the project which grants the further development of SkoHub.</p> +<h2>Metadaten.nrw</h2> +<p>In the end of 2021 hbz secured some funding by the Ministry of Culture and Science of North Rhine-Westphalia (MKW) for a project called Metadaten.nrw. It consists of two sub-projects, with one called “Infrastructure Initiative Metadata Services” being located in the Open Infrastructure team (OI) at hbz, where SkoHub development will take place.</p> +<p>We got four positions funded from which two are already filled, amongst them Steffen for SkoHub development. The goal of the project is to expand the community of users for the existing metadata infrastructure provided by hbz/OI, with focus on libraries and scholars in North Rhine-Westphalia (NRW), and to establish hbz as a competence center for metadata in NRW.</p> +<p>Accordingly, we plan to develop SkoHub further regarding the following topics:</p> +<ul> +<li>Fediverse integration: Further development of SkoHub PubSub in the context of a concrete use case</li> +<li>Reconciliation: Bringing the SkoHub reconciliation module into production</li> +<li>Possibly support <a href="https://annif.org/">Annif</a> integration in a later project phase</li> +<li>Offer SkoHub tutorials and workshops</li> +</ul> +<h2>Community, PubSub &#x26; Reconciliation</h2> +<p>To further encourage contributions like the one from Andreas with the reconciliation prototype, we will set up contributing guidelines to have a clear and transparent definition of the development and deployment processes.</p> +<h3>SkoHub PubSub</h3> +<p>Afterwards we made a small (re)introduction to SkoHub PubSub and discussed possible use cases. We developed ideas about SkoHub PubSub serving as a communication hub between researchers for their research fields. Raphaëlle Lapotre came up with a conrete use case. They currently have some pains in the context of <a href="https://datu.ehess.fr/timel/en/">Timel Thesaurus</a>, an indexing Thesaurus for huge amounts of digitized pictures of medieval iconography. Currently, there are problems with the task of storing the large amounts of images centrally in a repository. Researchers could hold the files locally in their NextCloud and publish the image metadata to inboxes of SKOS concepts. A central service could then listen to the data provided by each concept’s inbox and then display the metadata with a link pointing to the image in its storage location. There are actually two possible use cases : one with the digitized illuminations pictures of the Ahloma lab (EHESS, <a href="https://didomena.ehess.fr/collections/3x816n47s?locale=fr">sample</a>), the second one with painted ceilings pictures from all the mediterranean area, <a href="https://rcppm.org/blog/histoire-et-decouverte/carte-interactive-des-plafonds-peints-medievaux/">collected by an association of scholars and retired volunteers</a>. Possibly, the <a href="https://nextcloud.com/blog/nextcloud-introduces-social-features-joins-the-fediverse/">support for ActivityPub in Nextcloud</a> could help with such a project.</p> +<p>Another topic was the idea of community building around concepts. The Open Educational Resource Search Index (<a href="https://oersi.org">OERSI</a>) as well as the <a href="https://wirlernenonline.de/">WirLernenOnline</a> project already use elaborated vocabularies to index their resources. Interested humans could easily follow these concepts and engage in discussions around them.</p> +<p>This is also applicable to researchers that will be able to build up a topic-specific data base and open discussions about their research in the fediverse. This also rose practical questions about what happens on the notification side with broader and narrower concepts. If I’m following a concept do I also want to get notifications about its narrower or broader concepts? These are questions that can be discussed further in our community.</p> +<h3>SkoHub Reconciliation</h3> +<p>Following the PubSub discussion Andreas presented his reconciliation prototype. The reconciliation prototype is based on the <a href="https://reconciliation-api.github.io/specs/latest/">Reconciliation API spec</a> developed by the <a href="https://www.w3.org/community/reconciliation/">W3C Entity Reconciliation Community Group</a>, so it is interoperable and can be used in any kind of application that acts as a reconciliation client. Andreas implementation already worked in <a href="https://openrefine.org/">OpenRefine</a> as well as in <a href="https://teipublisher.com">TEI Publisher</a>’s annotation tool. After showing the implementation with some examples we went into a technical deep dive.</p> +<p>Andreas walked us through the code and we discussed the current implementation as well as the future architecture of the SkoHub modules. His current approach is based on the SkoHub Vocabs webhook part and lending code from SkoHub PubSub regarding the elasticsearch indexing.</p> +<p>The discussion resulted in the proposal to separate SkoHub Vocabs from the webhook module and by this further separate concerns of the respective modules. He integrated a <code class="language-text">doreconc</code> query parameter to the webhook, which triggers a <a href="https://github.com/mpilhlt/skohub-vocabs/blob/feature-reconc/src/populateReconciliation.js">script</a> that will populate the vocabulary to the <a href="https://github.com/skohub-io/skohub-reconcile">reconcile prototype</a>.</p> +<p>After the workshop we transferred the <a href="https://github.com/skohub-io/skohub-reconcile">skohub-reconcile</a> repository from Andreas to the SkoHub organization and are happy to start further developing it in 2023.</p> +<h2>Final thoughts</h2> +<p>The workshop was a great event to discuss with SkoHub users and those who want to be. We collected valuable feedback and ideas for development in the upcoming two years. +Especially the sudden rise in awareness for the Fediverse opens up interesting use cases for SkoHub PubSub, which we are happy to engage in. The highlight of the workshop was the presentation of Andreas’ reconciliation prototype and its transfer in the SkoHub organization. This is a good example for the benefits of open source and use case driven development.</p> +<p>We are looking forward to future community events, more use cases and even more modules to be developed in the SkoHub ecosystem.</p> +<p><strong>More links:</strong></p> +<ul> +<li><a href="https://reconciliation-api.github.io/">Reconciliation API spec &#x26; ressources</a> (e.g. a <a href="https://reconciliation-api.github.io/testbench/#/">list of databases offering a Reconciliation Endpoint</a>)</li> +<li><a href="https://docs.openrefine.org/manual/reconciling">Reconciliation in OpenRefine</a>, <a href="https://lobid.org/gnd/reconcile">GND reconciliation for OpenRefine</a>, <a href="https://histhub.ch/reconciling/">HistHub Blog entry (dt.)</a></li> +<li><a href="https://teipublisher.com/exist/apps/tei-publisher/doc/blog/tei-publisher-710.xml">Annotation in TEI Publisher</a></li> +<li>SkoHub Reconcile prototype: <a href="https://github.com/skohub-io/skohub-reconcile">GitHub</a>/<a href="https://c111-064.cloud.gwdg.de/reconc/">Test Instance</a></li> +</ul><![CDATA[Have U Seen The New Look?]]>https://blog.skohub.io/2022-12-02-new-look/https://blog.skohub.io/2022-12-02-new-look/Fri, 02 Dec 2022 00:00:00 GMT<p>We are happy to announce the new SkoHub logo and design we have deployed right in time for our <a href="https://swib.org/swib22/programme.html#day3">SWIB22 workshop</a> on Wednesday! In the last months, Kai Mertens and effective WEBWORK helped to work out this new look in the context of the <a href="https://blog.skohub.io/2022-05-eww-project-kickoff/">project we have announced earlier</a>. We have now updated the <a href="https://skohub.io">SkoHub website</a>, this blog and the default <a href="https://github.com/skohub-io/skohub-vocabs">SkoHub Vocabs</a> setup to incorporate the new logo and design.</p> +<p>Here is an <a href="https://w3id.org/kim/hochschulfaechersystematik/scheme">example</a> of how a vocabulary built with SkoHub Vocabs will look now with this default design:</p> +<p><a href="https://w3id.org/kim/hochschulfaechersystematik/scheme"><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 71.51898734177216%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqElEQVQoz5WS7WrUQBSGczWJU3MJFQv1TuyCP/y4JUtrs6OBbku3FfcCRPCPaLWo7W6p2aSTnXwn83WSkSRWakHdPrw/hgPPHHg5xtra/Qfr6/dWVy3LMk0TIWTb9t2brNi2jRAyTdOyLITQHdNcQcjYHDqbL7afb21t7+y4rosxHl7hDIeO4/RvjPHLDtd1R7u7rzB2MDbqphE1KK2hafRtaLQ2pGiRHWXVoqT0QvLu5POH029vvxwfz6YX5PLM92bB/HTunZPg+/zHBSGCC4MLQZMkTlNQqqyqvCxAKZ8uPp5PP83O3n89mQZ+ENF5tPBj6tHQo4uCM621AjAqxvyIlpxLAAWgtYYayrRIL6MsL3JWxUVR0IyHGQsztsgZySBrZehlksQ0z0gSJ2Xefym51Kpu/tlCK3MhwjQmSRwXeVaVQnVI+d/CWplx7kc0iGhvSuhttZTclsw5k+L3tFu83GboSrrOLeS+4eYqWmuplOjk5i/5tQPA0HV983QAagVLnFhjPJ2MB4ejjWsZHO0NjvY2/hz2eXg4evR6/9lk/OTNwePJ+Ce3Edi1hGz4mQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects" + title="The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects" + src="/static/384b141891ff0a44d576e0792c5562e3/f058b/skohub-vocabs-screenshot.png" + srcset="/static/384b141891ff0a44d576e0792c5562e3/c26ae/skohub-vocabs-screenshot.png 158w, +/static/384b141891ff0a44d576e0792c5562e3/6bdcf/skohub-vocabs-screenshot.png 315w, +/static/384b141891ff0a44d576e0792c5562e3/f058b/skohub-vocabs-screenshot.png 630w, +/static/384b141891ff0a44d576e0792c5562e3/40601/skohub-vocabs-screenshot.png 945w, +/static/384b141891ff0a44d576e0792c5562e3/78612/skohub-vocabs-screenshot.png 1260w, +/static/384b141891ff0a44d576e0792c5562e3/b880f/skohub-vocabs-screenshot.png 1507w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">The overview page of the SkoHub Vocabs build of the SKOS Destatis classification for subject groups, study areas and study subjects</figcaption> + </figure></a></p> +<p>I looks much clearer and more modern than before. We also love the new logo. Kai did a great job creating the new logo and design while not totally breaking with the previous look. We created an extra repo at <a href="https://github.com/skohub-io/skohub-logo">https://github.com/skohub-io/skohub-logo</a> for the logo and related files. In the next days, we will add some more documentation, especially on <a href="https://github.com/skohub-io/skohub-vocabs/issues/188#issuecomment-1327321911">how to configure a customized version for your own SkoHub Vocabs instance</a>.</p><![CDATA[Things are moving at SkoHub]]>https://blog.skohub.io/2022-11-skohub-workshop/https://blog.skohub.io/2022-11-skohub-workshop/Fri, 04 Nov 2022 00:00:00 GMT<p>In this blog post we want to introduce to you a new member in the Open Infrastructure team at the Hochschulbibliothekszentrum NRW who will be working on SkoHub as well as invite you to a workshop to present and discuss our future plans for the SkoHub project.</p> +<p>After some time with not much happening (or even with shutting down some SkoHub services), we are happy to inform about a lot of movement in the space. We already <a href="https://blog.skohub.io/2022-05-eww-project-kickoff/">announced</a> the current project with the effective WEBWORK team to develop a new logo, improve the design and fix some minor issues in SkoHub. We are happy about the improvements made. Watch this space for more details in an upcoming post.</p> +<h3>Welcome, Steffen!</h3> +<p>We are very happy to welcome <a href="https://lobid.org/team/sr#">Steffen Rörtgen</a> in the open infrastructure team at the Hochschulbibliothekszentrum NRW who has joined the team this November. In his former projects he already made heavy use of SkoHub Vocabs and contributed to the project. He will now focus on further SkoHub development in context of the Metadaten.nrw project which is funded by the Ministry of Culture and Science of North Rhine-Westphalia (MKW).</p> +<p>With the grant for this project, we have resources for further development and would like to discuss with you our plans, especially regarding the <strong>use of SkoHub for reconciliation</strong> and the ActivityPub-based <strong>publish/subscribe</strong> approach (SkoHub PubSub). Having already defined some work packages within the Metadaten.nrw project we would like to align these with use cases and ideas the SkoHub community has.</p> +<h3>Upcoming workshop</h3> +<p>Therefore we are happy to invite you to a small workshop on Thursday, the <strong>17th of November</strong>. We will start at <a href="https://zonestamp.toolforge.org/1668675632">10:00h CET</a> and split the workshop into two parts with each one lasting about two hours:</p> +<p>In the <strong>first part</strong> we will give an overview of the past and current developments of SkoHub as well as an introduction to the Metadaten.nrw project and its plans for SkoHub. At the end of the first part we want to discuss use cases for the publish/subscripe approach of SkoHub as well as for reconciliation. Our community member Andreas Wagner already developed a prototype for reconciliation with SkoHub, which he will present.</p> +<p>In the <strong>second part</strong> of the workshop we will then deep dive into the reconciliation topic. We will discuss Andreas’ approach and develop a roadmap for SkoHub to implement the desired reconciliation functionalities.</p> +<p>For more details, see the <a href="https://pad.gwdg.de/s/2022-11-17-skohub-workshop">pad with the preliminary agenda</a>.</p> +<p>If you are interested in the workshop, please send an email to <a href="mailto:skohub@hbz-nrw.de?subject=Registration for SkoHub-Workshop on Nov, 17th&body=Hello there,%0D%0AI'm interested in your workshop!%0D%0AI will join%0D%0A- [ ] the whole workshop%0D%0A- [ ] just the first part%0D%0A"><a href="mailto:skohub@hbz-nrw.de">skohub@hbz-nrw.de</a></a> +and give us a note if you are joining the whole workshop or just the first part.</p> +<p><em>Please be aware that we won’t give a general introduction to SkoHub and expect you to be familiar with SKOS and the approach of SkoHub.</em></p><![CDATA[Collaborating on improving SkoHub Vocabs]]>https://blog.skohub.io/2022-05-eww-project-kickoff/https://blog.skohub.io/2022-05-eww-project-kickoff/Thu, 19 May 2022 00:00:00 GMT<p>In a kickoff workshop, the SkoHub team at hbz has launched a cooperation with the Hamburg-based company <a href="https://www.effective-webwork.de/">effective WEBWORK</a> to work on some pending issues regarding both functionality and design of <a href="https://github.com/skohub-io/skohub-vocabs">SkoHub Vocabs</a>. The issues and progress of the project can be followed in a <a href="https://github.com/orgs/skohub-io/projects/2">Kanban board</a>.</p> +<p><a href="https://github.com/orgs/skohub-io/projects/2"><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABj0lEQVQoz42Q2W7bMBBFqWijNmqhJJKSuEjUYtlKYrdu4AKFH/v/n1TQbgwD6UOB8zAcnovBDBDrNoyHtGxSzFBBEWYIs3ud3or08/kVQDvd8BFTQdqetb1Sc93IqlGYcEx4SUVJRd2ou53k5Bmg9L5iMsnqOKvNtFs3Sqs4e2C+kpzEWZXk9RME5HWbE+FFhRdmLkzcAIWoxJQHqPTjwo9NH0Z5UlBMJUxKYxryIC4AG1a1/+jm7934zsSkxkNJO328iv1PNrw1+r3mk1mBiX67iOUsdme+/BDzibY9qNWqXq9y+8XnU6vfGNdZyTq9cb0xObf9Srm5gguR40UujF3/LyHCgMhFHC78NpmKqWIyLdlwvMr9pZtOfPfRTkfaacePgQ2BHRicANjQDRBox9f5/Fvuzmr51qqFdDopaCNmxnXFJOkGTLkaV8ePLQdaTnAH2NALU4AKhmuB8hphijDNSxYkOXjxgQ0fnu1FJmx/CVs2BJZn7E9cmDwkgw1tP/53+MUNLSd8tt0A/Wf4Dxd0MJGMINoYAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The Backlog, Ready and Working columns of the project&#39;s Kanban board as of 2022-05-19" + title="The Backlog, Ready and Working columns of the project&#39;s Kanban board as of 2022-05-19" + src="/static/a2a343d6e0b18eb6e55f81fc6f505d25/f058b/kanban.png" + srcset="/static/a2a343d6e0b18eb6e55f81fc6f505d25/c26ae/kanban.png 158w, +/static/a2a343d6e0b18eb6e55f81fc6f505d25/6bdcf/kanban.png 315w, +/static/a2a343d6e0b18eb6e55f81fc6f505d25/f058b/kanban.png 630w, +/static/a2a343d6e0b18eb6e55f81fc6f505d25/40601/kanban.png 945w, +/static/a2a343d6e0b18eb6e55f81fc6f505d25/d56b5/kanban.png 1215w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">The Backlog, Ready and Working columns of the project&#39;s Kanban board as of 2022-05-19</figcaption> + </figure></a></p> +<p>A big part of the project will concern a new functionality to support the grouping of concepts by creating SKOS collection pages (<a href="https://github.com/skohub-io/skohub-vocabs/issues/159">Issue #159</a>). Another central goal of the cooperation is a redesign of the static sites that are generated by SkoHub Vocabs. Finally, a logo is to be developed for the SkoHub softwar suite that will hopefully capture the spirit of the software and the community behind it. We are looking forward to presenting the results within the next months.</p> +<p>The team from effective WEBWORK consists of software developers, a librarian and a designer whose skills overlap with those of the SkoHub community in many ways and especially regarding their enthusiasm for open source solutions. We are looking forward to this collaboration!</p><![CDATA[SKOS Introduction workshops with SkoHub Vocabs]]>https://blog.skohub.io/2021-12-10-skohub-vocabs-workshops/https://blog.skohub.io/2021-12-10-skohub-vocabs-workshops/Fri, 10 Dec 2021 00:00:00 GMT<p>We facilitated two workshops in November with the goal to introduce participants into Simple Knowledge Organization System (SKOS) by hands-on learning how to publish a small vocabulary with SkoHub Vocabs. The first one “Eine Einführung in SKOS mit SkoHub Vocabs” was held as a cooperation between the Hochschulbibliothekszentrum NRW and the Göttingen eResearch Alliance with 14 German-speaking participants on 2021-11-02, see the <a href="https://pad.gwdg.de/s/OCbQBibi2">workshop pad</a> and the <a href="https://pad.gwdg.de/p/einfuehrung-in-skos-mit-skohub">slides</a>.</p> +<p>As the workshop worked quite well, we applied the same approach to our Workshop “An Introduction to SKOS with SkoHub-Vocabs” on 2021-11-30 at <a href="https://swib.org/swib21">SWIB21</a> (<a href="https://pad.gwdg.de/p/introduction-in-skos-with-skohub">slides</a>) with around 20 participants.</p> +<p><a href="https://pad.gwdg.de/p/introduction-in-skos-with-skohub"><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABlElEQVQoz4VSy07CUBBlLyqUPqBK2gRCeEOgLSQaU2kkDSE1vArh4dqNccXKnzJu3fgBLvyjY2bIbRANLk7OzNwzp3PnNpZOp5HJZKBpGmRZhqIoSKVSzCIXTJAkic+FhnLqJQ/yiokgm82iVquhVCqh0WgwV6tVlMtl5mKxiEKhAMuyGK1Wi2sUU68YjA3pS5VKBaPRCP1+H/P5HJvNBsvlkmPiIAjgui7W6zVWqxWm0ymGwyHHZKyq6s5QOBPT+IlEgnmxWGA8HnPDZDKB7/sIwxCz2YzNhTaZTGLfgycUO8zn82g2mzwtMV2rXq+j2+1y7jgOOp0Ox+12G7ZtI5fLRTuMriwMTdNkMzLp9XrcYFltOFYLd94tbMuC53kYDAa8b7qqYRi/DQ9fmnISqooCu3sNP1jgPnzA1Y0LTVVhmCZraff7L/xjQlGIYl3H+Vkcj09bvL5/4u3jC8/bF5zGT/hMaCO9MKTkEPtiTVWgKSkossQTHxpFOHyU/6EfP6dBLi4Ro//nGGhH+/hbt6traR3fuxM7qEiV7HEAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="First slide of the SKOS introduction workshop at SWIB21" + title="First slide of the SKOS introduction workshop at SWIB21" + src="/static/5617f981b723e476e73f28ec316dd720/f058b/slides.png" + srcset="/static/5617f981b723e476e73f28ec316dd720/c26ae/slides.png 158w, +/static/5617f981b723e476e73f28ec316dd720/6bdcf/slides.png 315w, +/static/5617f981b723e476e73f28ec316dd720/f058b/slides.png 630w, +/static/5617f981b723e476e73f28ec316dd720/40601/slides.png 945w, +/static/5617f981b723e476e73f28ec316dd720/78612/slides.png 1260w, +/static/5617f981b723e476e73f28ec316dd720/29114/slides.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">First slide of the SKOS introduction workshop at SWIB21</figcaption> + </figure></a></p> +<p>Generally, we had the impression that participants of both workshops where having a good time, at least nobody left the conference room before the end of the workshop. Here are some notes and lessons learned we collected after the SWIB workshop:</p> +<ul> +<li>We invited participants to share their screen to not be talking to the void. Around 4-5 participants followed our invitation which was ok for us.</li> +<li>Many participants joined without their microphones connected. We missed to explicitly ask them to turn their mics on.</li> +<li>We introduced ourselves and used the BigBlueButton poll feature to get to know the participants and their previous experience bit more.</li> +<li>We divided the workshop into two parts: an introduction as a frontal presentation and a hands-on part with discussion and Q&#x26;A phases in between. Though this worked quite well, we think it might be nice to switch more often between explanatory parts and hands-on parts.</li> +<li>Participants were a bit shy. We got some good feedback in the chat at the end but only from some participants. Next time, we should prepare another poll for getting feedback at the end of the workshop</li> +</ul> +<p>With regard to the further development of SkoHub Vocabs, it became clear during the workshops that it would be great to have an automatic test with each commit that lets you know whether a SKOS/Turtle file in a repo is “SkoHub-ready”, i.e. conforms to the pattern that is supported by SkoHub Vocabs. <a href="https://github.com/skohub-io/skohub-vocabs/issues/91">Issue #91</a> is already addressing this need and should be worked on to accomplish this.</p><![CDATA[SkoHub Presentation at LIS Workshop 2021]]>https://blog.skohub.io/2021-lis-workshop/https://blog.skohub.io/2021-lis-workshop/Mon, 12 Jul 2021 00:00:00 GMT<p><a href="https://pad.gwdg.de/p/lis-workshop21-skohub"><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABSklEQVQoz4WR626CQBCFeQd19jILW4Qm/KCx0A12Kxq7tUmBhESpVtT3f46mbOql0fT7scnZmdlzNuOwDkKIlNL3fSml2xEEwV2HEAIRPc+z97afUup5nnMU4/F4v98fDoeyLLMsW6/Xbdt+dVRVVdf1arVq2zZJEgBgjEkpHc45AMRxXNf1crncbrebzcYYs9vtrGyaxhjTdFRVVRRFGIYA8DN8dD6eQggAMOa1LD4+m0br516vh4iEkPPOU+y/EBDRo1RvMplhEDFKGOeMMd5hh0/OVttXGWMAMAzvx5NZpnPpD+0nzxsuhimlo9FIa52mqVIqyzKl1ORFT/OJUirP8yRJtNbz+TyKIpv/whkR7VYQ0XVdKeXifZHPpnZPosN1XUT8JzYhhHOePqXxQ2wl/eVK7Kv0+/3BYHC9Rqnw7hxyG2t1u8y+AfH4XWGcvyn/AAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="First slide of SkoHub presentation at LIS Workshop 2021" + title="First slide of SkoHub presentation at LIS Workshop 2021" + src="/static/23e9cd5c100418dc7d1c27eed6901f62/f058b/slides.png" + srcset="/static/23e9cd5c100418dc7d1c27eed6901f62/c26ae/slides.png 158w, +/static/23e9cd5c100418dc7d1c27eed6901f62/6bdcf/slides.png 315w, +/static/23e9cd5c100418dc7d1c27eed6901f62/f058b/slides.png 630w, +/static/23e9cd5c100418dc7d1c27eed6901f62/40601/slides.png 945w, +/static/23e9cd5c100418dc7d1c27eed6901f62/78612/slides.png 1260w, +/static/23e9cd5c100418dc7d1c27eed6901f62/29114/slides.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">First slide of SkoHub presentation at LIS Workshop 2021</figcaption> + </figure></a></p> +<p>Last Friday afternoon, the 2021 Workshop on Classification and Subject Indexing in Library and Information Science (LIS Workshop) took place organized by the Working Group within the GfKL – Data Science Society. Adrian and Steffen had the chance to present SkoHub in the workshop’s first presentation. The slides can be viewed at <a href="https://pad.gwdg.de/p/lis-workshop21-skohub">https://pad.gwdg.de/p/lis-workshop21-skohub</a>.</p> +<p>Here is an overview over the full <a href="http://www.gfkl.org/blog/2019/10/14/lis-workshop-2021-rotterdam/">programme</a> that comprised six talks:</p> +<ul> +<li>Adrian Pohl (hbz, Cologne, Germany) &#x26; Steffen Rörtgen (GWDG, Göttingen, Germany): <em>SkoHub: Publishing and using knowledge organization systems on the web</em></li> +<li>Colin Higgins (University of Cambridge, Cambridge, United Kingdom): <em>Justice, governance, and the thesaurus – the Cambridge experience with ‘illegal aliens’</em></li> +<li>Gislene Rodrigues da Silva &#x26; Célia da Consolação Dias (Universidade Federal de Minas Gerais, Belo Horizonte Brasil): <em>Subjective aspects of indexing photographs from visual communication using a reading model based on the complex method and the primary functions of the image</em></li> +<li>Heidrun Wiesenmüller (Stuttgart Media University, Stuttgart, Germany): <em>Orientation and exploration – the presentation of subject headings in German catalog</em></li> +<li>Karin Schmidgall (Deutsches Literaturarchiv Marbach, Marbach, Germany) &#x26; Matthias Finck (Effective Webwork, Hamburg, Germany): <em>Glückliche Funde - ein Katalog der Forschende auf neue Ideen und Pfade bringt</em></li> +<li>Julijana Nadj-Guttandin (Deutsche Nationalbibliothek, Frankfurt, Germany) &#x26; Sarah Pielmeier (University and State Library, Münster, Germany): <em>Ein neues und modulares Regelwerk für die verbale Inhaltserschließung / A new and modular standard for subject indexing</em></li> +</ul> +<p>The workshop happened as part of the virtual conference “Data Science, Statistics &#x26; Visualisation and European Conference on Data Analysis 2021” (DSSV-ECDA 2021). The promotion for the workshop could probably have been better, e.g. the presentations weren’t even listed in the regular DSSV-ECDA programme. In the end, the speakers and moderators were among themselves with little additional audience. However, the talks discussed interesting topics and discussion was lively.</p><![CDATA[SkoHub workshop at SWIB20]]>https://blog.skohub.io/2020-11-25-swib20-workshop/https://blog.skohub.io/2020-11-25-swib20-workshop/Wed, 25 Nov 2020 00:00:00 GMT<p>From 23-27 November the <a href="https://swib.org/swib20/">12th Semantic Web in Libraries Conference</a> took place online. The programme with links to recordings and slides forum can be viewed at <a href="https://swib.org/swib20/programme.html">https://swib.org/swib20/programme.html</a>.</p> +<p>Wednesday was workshop day where Adrian and Steffen offered a SkoHub workshop. They tried out a flipped classroom approach and created several video tutorials and wrote down walkthroughs for the participants to prepare themselves. This did not work out as intended, lesson learned: Always be prepared that a bigger number of participants is not prepared.</p> +<p>Here are some links to the materials:</p> +<ul> +<li><a href="https://pad.gwdg.de/p/HJeIvDvq5w">workshop agenda</a></li> +<li><a href="https://github.com/skohub-io/swib20-workshop">workshop repo</a></li> +<li><a href="https://github.com/skohub-io/swib20-workshop/blob/main/resources/README.md">overview over the workshop materials</a></li> +</ul><![CDATA[ActivityPub Conference 2020]]>https://blog.skohub.io/2020-10-09-skohub-apconf/https://blog.skohub.io/2020-10-09-skohub-apconf/Fri, 09 Oct 2020 00:00:00 GMT<p>From 2-5 October the <a href="https://conf.activitypub.rocks/">ActivityPub conference</a> happened online where people using the ActivityPub protocol came together to discuss topics all around federated networks and the respective web standards. For presentations, a flipped classroom approach was chosen where talks would be uploaded before the conference and the live part would be Q&#x26;A sessions for each talk. On Sunday, there was an additional round of lightning talks and some birds of a feather (bof) sessions where – quite similar to a barcamp session – people interested in a topic could propose a session and meet with likeminded people.</p> +<p>The programme with links to the recordings and forum can be viewed at <a href="https://conf.activitypub.rocks/#live">https://conf.activitypub.rocks/#live</a>.</p> +<p>On Friday, we had a session about SkoHub. Here is our previously recorded video:</p> +<div class="gatsby-resp-iframe-wrapper" style="padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem" > <iframe sandbox="allow-same-origin allow-scripts allow-popups" src="https://conf.tube/videos/embed/85a7d230-7e75-48fd-b399-d182ddece030" frameborder="0" allowfullscreen="" style=" position: absolute; top: 0; left: 0; width: 100%; height: 100%; "></iframe> </div> +<p>With regard to creating and maintaining controlled vocabularies and assigning topics, (at least some) people who develop applications for the Fediverse have quite some interest in building on experiences and approaches from the library world. What we learned from our Q&#x26;A session is to better prepare next time as there most certainly will be some people who haven’t fully watched the recording or where some time has passed since watching it: Next time we would have some slides ready to recap the basic concepts and some links to point to exemplary implementations and further information.</p> +<p>Here are some projects that are dealing with categories, taxonomies in the Fediverse:</p> +<ul> +<li><a href="https://socialhub.activitypub.rocks/t/commonspub-and-the-quest-for-a-modular-decentralised-app-ecosystem/938"><strong>CommonsPub</strong></a> – which builds on experiences from MoodleNet – is working on “[f]ederated taxonomies for topic-based search and discovery across instances.”</li> +<li>The CommonsPub-based <a href="https://haha.academy/"><strong>HAHA</strong> Academy</a> is experimenting with collaboratively created and maintained <a href="https://haha.academy/#the_knowledge">“taxonomy of all human knowledge”</a>.</li> +<li><a href="https://socialhub.activitypub.rocks/t/learnawesome-org-building-a-better-goodreads-with-activitypub/946"><strong>LearnAwesome.org</strong></a> helps people in managing and finding learning material online in very different formats. It supports following certain topics.</li> +<li>The <a href="https://socialhub.activitypub.rocks/t/the-reboot-of-the-indymedia-project/942"><strong>“Rebooting Indymedia” project</strong></a> wants to use topic-based channels to create moderation workflows for building independent news sites from decentrally published content.</li> +<li>In a related effort by Trolli Schmittlauch, the problem is addressed how to create a comprehensive <strong>hashtag search</strong> &#x26; subscription in a federated social network. See <a href="https://git.orlives.de/schmittlauch/paper_hashtag_federation/src/branch/master/paper_hashtag_federation.pdf">this paper</a> for details.</li> +</ul> +<p>In a birds of a feather session about <a href="https://socialhub.activitypub.rocks/t/topics-and-services-we-can-subscribe-to/995">“Topics” and Services we can subscribe to</a> some of the people working on tags, controlled vocabularies etc. came together and had a fruitful exchange, sorting out the different problems and which approaches exist to address them. We are looking forward to further working on SkoHub and discussing common approaches to assigning or following controlled topics in the fediverse.</p><![CDATA[Presenting SkoHub PubSub]]>https://blog.skohub.io/2020-06-25-skohub-pubsub/https://blog.skohub.io/2020-06-25-skohub-pubsub/Thu, 25 Jun 2020 00:00:00 GMT<hr> +<p>ⓘ <strong>Update, 2022-03-01</strong>: <em>Due to lacking resources for maintenance, we decided to shut down the SkoHub PubSub demo server at skohub.io for an indefinite time. However, the <a href="https://github.com/skohub-io/skohub-pubsub">code</a> is still there for anybody to set up their own instance.</em></p> +<hr> +<p>In the previous blog posts we have presented <a href="http://blog.lobid.org/2019/09/27/presenting-skohub-vocabs.html">SkoHub Vocabs</a> and <a href="http://blog.lobid.org/2020/03/31/skohub-editor.html">SkoHub Editor</a>. In the final post of this SkoHub introduction series we will take a deeper look at SkoHub PubSub, the part of SkoHub that brings the novel approach of KOS-based content subscription into the game.</p> +<p>Let’s refresh what SkoHub is about by quoting the gist from <a href="https://skohub.io/">the project homepage</a>:</p> +<blockquote> +<p>SkoHub supports a novel approach for finding content on the web. The general idea is to extend the scope of Knowledge Organization Systems (KOS) to also act as communication hubs for publishers and information seekers. In effect, SkoHub allows to follow specific subjects in order to be notified when new content about that subject is published.</p> +</blockquote> +<p>Before diving into the technical implementation and protocols used, we provide an example on how this subscription, publication and notification process can be carried out in practice. Although SkoHub PubSub constitutes the core of the SkoHub infrastructure being the module that brings all SkoHub components together, it is not visible to end users by itself but only through applications which send out notifications or subscribe to a specific topic. (This is the great thing about open standards as it also invites everybody to develop new clients for specific use cases!)</p> +<p>So, let’s take a look at an example workflow involving SkoHub Editor and the federated microblogging service <a href="https://en.wikipedia.org/wiki/Mastodon_(software)">Mastodon</a> to demonstrate the functionalities.</p> +<h2>Subscribing to a subject</h2> +<p>In one of the already mentioned blog posts we exemplarily published the <a href="https://w3id.org/class/esc/scheme">Educational Subjects Classification</a> with SkoHub Vocabs. Now, let’s take a look at a single subject from this classification, e.g. <a href="https://w3id.org/class/esc/n0322">Library, information and archival studies</a>:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/85426ef69485c8c526778217db5f24f5/1e1c3/concept.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACC0lEQVQoz6WS22oTURSG531EPIEgIop4443P4aWI+AAieC2FNtU7RbC0KkUUpJaKaGnS2mQ6maSpxZY2c85kDplJ5phPMj3goVbBH3722ou9P9YPS5hfXeSTtMKiXKUsi4WXG2tU6iJLa1Uqkkit1aDWahaWvraQNlqsynW+yHXKYo3ycoUv1RoLlTLCHfklt6QZbtamuLH0mOufH3HtY4mrH0pcWZjk0nyJi3MlLryb5PzbEudeT3B2doLTL8Y5NT3ByefjnHgyxpm7t7n84B6CFQbooc9uz2XT69BwDKq2wpK2xcL2Ou+3Gsxtr/NmU2J2Y41XLZGZZpUpeZVn0gpPxWWmv60zVRe5/3AMYXenjapo6JqBruqYqoHbcem7Pay2iq3qOJpR2FY00l5IHvTJgpCkF5AGIQeybRthZ3cHwzTxez5BGNAfDIiTGD+ICcKIKI4IB30G0aiOGfK7sjwv+m1FRbAsi57vEwQBg36fNEmLR2mWcZSGw+GRHklRNQRV1zDtDkbHouu5xFlKkmUF8LjPB+ePdQF0fA/bd+l4Lm4YECYxUZqQ7U+4B+FY/QRUFAXf83FdF8/ziuhZmh1GHv6N9itQVVW6jkO32y3sOA5JkpCke5HzfPjH6AfO87wAtlUVYQSJouiw+T/SDXM0oVasjWla+6eJbhhoul7cDeNfbDDaFrnZ5Dvze3ezzKW6aQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot of the HTML version of a SKOS concept published with SkoHub." + title="Screenshot of the HTML version of a SKOS concept published with SkoHub." + src="/static/85426ef69485c8c526778217db5f24f5/f058b/concept.png" + srcset="/static/85426ef69485c8c526778217db5f24f5/c26ae/concept.png 158w, +/static/85426ef69485c8c526778217db5f24f5/6bdcf/concept.png 315w, +/static/85426ef69485c8c526778217db5f24f5/f058b/concept.png 630w, +/static/85426ef69485c8c526778217db5f24f5/40601/concept.png 945w, +/static/85426ef69485c8c526778217db5f24f5/78612/concept.png 1260w, +/static/85426ef69485c8c526778217db5f24f5/1e1c3/concept.png 1670w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of the HTML version of a SKOS concept published with SkoHub.</figcaption> + </figure></p> +<p>On the left-hand side, you can see the location of the topic in the classification hierarchy. On the right-hand side, there is some basic information on the subject: It has a URI (<code class="language-text">https://w3id.org/class/esc/n0322</code>), a notation (<code class="language-text">0322</code>), a preferred label (<code class="language-text">Library, information and archival studies</code>) and an inbox. This is how the <a href="https://w3id.org/class/esc/n0322.json">underlying JSON data</a> (e.g. by adding the format suffix <code class="language-text">.json</code> to the URI) looks like:</p> +<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"><span class="token punctuation">{</span> + <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"https://w3id.org/class/esc/n0322"</span><span class="token punctuation">,</span> + <span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"Concept"</span><span class="token punctuation">,</span> + <span class="token property">"followers"</span><span class="token operator">:</span><span class="token string">"https://skohub.io/followers?subject=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322"</span><span class="token punctuation">,</span> + <span class="token property">"inbox"</span><span class="token operator">:</span><span class="token string">"https://skohub.io/inbox?actor=hbz%2Fvocabs-edu%2Fheads%2Fmaster%2Fw3id.org%2Fclass%2Fesc%2Fn0322"</span><span class="token punctuation">,</span> + <span class="token property">"prefLabel"</span><span class="token operator">:</span><span class="token punctuation">{</span> + <span class="token property">"en"</span><span class="token operator">:</span><span class="token string">"Library, information and archival studies"</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"notation"</span><span class="token operator">:</span><span class="token punctuation">[</span> + <span class="token string">"0322"</span> + <span class="token punctuation">]</span><span class="token punctuation">,</span> + <span class="token property">"broader"</span><span class="token operator">:</span><span class="token punctuation">{</span> + <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"https://w3id.org/class/esc/n032"</span><span class="token punctuation">,</span> + <span class="token property">"prefLabel"</span><span class="token operator">:</span><span class="token punctuation">{</span> + <span class="token property">"en"</span><span class="token operator">:</span><span class="token string">"Journalism and information"</span> + <span class="token punctuation">}</span> + <span class="token punctuation">}</span><span class="token punctuation">,</span> + <span class="token property">"inScheme"</span><span class="token operator">:</span><span class="token punctuation">{</span> + <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"https://w3id.org/class/esc/scheme"</span><span class="token punctuation">,</span> + <span class="token property">"title"</span><span class="token operator">:</span><span class="token punctuation">{</span> + <span class="token property">"en"</span><span class="token operator">:</span><span class="token string">"Educational Subjects Classification"</span> + <span class="token punctuation">}</span> + <span class="token punctuation">}</span> +<span class="token punctuation">}</span></code></pre></div> +<p>Besides the usual SKOS properties, the <code class="language-text">followers</code> key gives a hint that I can somehow follow this subject. Clicking on the associated URL, I will see a JSON file containing the list of followers of this subject. I am also interested in this topic and want to follow it to receive notifications about new online resources that are published and tagged with this subject. How do I achieve this?</p> +<p>As already noted, what I need is an application that speaks ActivityPub. In this case we will use one of the most popular services in the <a href="https://en.wikipedia.org/wiki/Fediverse">Fediverse</a>: Mastodon. So, I open up my Mastodon client and put the topic URI into the search box:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 296px; " + > + <a + class="gatsby-resp-image-link" + href="/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 95.56962025316456%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADNUlEQVQ4y41UuXIrVRCd34BnjTRaZ5U0i0YzkkazSJqRtXosy7Lxqwc2b6MoKIqYT6BIqCKkipAIIgISPoCAmISciE840C3JdgImONV9ezm3um/3FdRmD2Z3gqYVsbRIt2MYZsg6oeUkaNnx/Zli252E9WOu1U0h610ITStEMrvB2fXH8MM13P4c+c0nePH2C9a7wRKz85dYbt/AHSz4fH7zKdLl++gOFvDDM6x2HyFMd9DbAYSWEyPKrpGtb9GL8z3B5hW2Lz6HF6zgDdeYnt1hmt/BG6740vnmFUazG/ZRDvmJ0DCHECoNE7Luoa44LBXDQ01xUG1YrBPIV1c692fyN1SXdcqpHXLLtRaEYlljpVQxGFL1AXubDqnavNcf4g42iq01Uam3UZRUCKR4wwWS2RV6EZU4RzA+RzS9hBcuEIxy9OIVwvSC7f14jcEohx8tEU8vEWVb+OGCyyUuLrlph+j0M1jeGK1OzNL2Jmh3YriDU5jdEWx/wrC6Izh+yj6ym27C+Vp7gHK9BaFQklEsqyAplhSIksqyQDpLGaK0l8eYo008xFAOtaNQlPcl0/w0NBcN3UVd7TDoTPb/gwZJgx6lCaGm2Oj0TmF7GUx3DHdAs7dgqZsBdHN4kP8Nww5BXEJNdR4m3olgeykcf8q2B8KnEHAfmVA6PHupqnNTpdp+FEivyhYqsonqE+AYxUKxokF4t1CBYQ1hdseoa9Q/h/tChAVJhlhWngY9UFnFSbFOhFU07Qi2nzIhlU3rSMQURLf+G8h/BJ1Pig0IVB7hnUINz8QGxLLGOClRoI5ixUCBbTpLAtnEig6a4SOodNo6gZxBvMCXX3+Lr775Dul8C68/wXR+gXC0QBDNkM0ukEzWGGc5JtOcbcNkjrq6Hy3adcU47PIzUcZmd4tff/8Tv/3xF+7efIZwvMbu+Wtsru6wzJ/j4upD5JcfYHv9kvXZ6hrnu1vo7T73f5BsmJAeVxAlDUmW4/sff8YPP/2C+dl7ML0UfrRCZ3AKu5cxLG+C7nABp3/K/XaDOZPRDtO3phj+npA2paE9mnraGM3lL4m/LfURHtvoC+PYDo8XT8Y/hH8DA7lqZs2FNQEAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button" + title="Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button" + src="/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png" + srcset="/static/7ac0ab406412da9d354db3ca10b81ac9/c26ae/subscribe.png 158w, +/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png 296w" + sizes="(max-width: 296px) 100vw, 296px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of a Mastodon search result for a topic URL with adjacent subscribe button</figcaption> + </figure></p> +<p>I click on the follow button and am now following this subject with my Mastodon account and will receive any updates posted by it.</p> +<h2>Describing and announcing a resource with SkoHub Editor</h2> +<p>Let’s now switch into the role of a scholar, teacher, tutor or general interested person who has created an instructive online resource and wants to publish it to all people interested in the topic of “Library, information and archival studies”. In this case, I published a <a href="http://blog.lobid.org/2020/01/29/skohub-talk-at-swib19.html">blog post about a talk at SWIB19 – Semantic Web in Libraries Conference</a> and want to share it with others. I somehow need to send a message to the topic’s inbox, in this case I am using the SkoHub Editor (but it could be any other ActivityPub client or even the command line interface from which I publish). For the best user experience I download the SkoHub browser extension (<a href="https://addons.mozilla.org/firefox/addon/skohub-extension/">Firefox</a>, <a href="https://chrome.google.com/webstore/detail/skohub/ghalhmcgaicdcpmdicinaegnoanfmggd">Chrome</a>).</p> +<p>As the default JSON schema uses another classification, we first have to configure the editor based on a schema that actually makes use of the Educational Subjects Classification. For this, we created a <a href="https://raw.githubusercontent.com/dini-ag-kim/lrmi-profile/useEsc4Subjects/draft/schemas/schema.json">version of the default schema</a> that does so. Now I put it into the extension’s settings:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/0c9af9bcdba57992a010aab21454ead2/c391c/configure-extension.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 57.59493670886076%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMElEQVQoz6WQ227DIAxA8/+/NmndAqRZs3ZNQ64iEMhlhOtE2ql7mrTuyLKE5SNjR0TNXdOc88tYaWf97zgX8rHVRTeun3OEJa9x+Zam1XvDCKGUDmzoe0opZWxgwyA4F2IUQoQnY8s0pnmfnRu1ysgoxQZ+qmhyacGx+cBtVZZVXRcFpowtyzKN0zhO87zIG6vRq9HKGBt1XafUyqQvuMfcS+0E52FuT5VS0zQR0hPSCyHchv1Gax0RQo6nU12XZZHjSy6lvO7mnLfWhnbvQ2yaMdbYOxHGZQzgC4BPz7vdKwAoAck+RiiGCKAEon0MYQxQCIhimACUxBClhyzIVV0n+3SV0mw/0VorpX7kW0WpraLuDc65qGnbQ5YZY/wfCbJ/lCBfj/Gg/K/J9lGMMV9xgrNr3lzzTgAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox" + title="Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox" + src="/static/0c9af9bcdba57992a010aab21454ead2/f058b/configure-extension.png" + srcset="/static/0c9af9bcdba57992a010aab21454ead2/c26ae/configure-extension.png 158w, +/static/0c9af9bcdba57992a010aab21454ead2/6bdcf/configure-extension.png 315w, +/static/0c9af9bcdba57992a010aab21454ead2/f058b/configure-extension.png 630w, +/static/0c9af9bcdba57992a010aab21454ead2/c391c/configure-extension.png 673w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of how to configure a custom schema in the SkoHub Editor extension for Firefox</figcaption> + </figure></p> +<p>Then, I fire up the extension when visiting the web page I like to share and add data to the input form:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/492b5e6e95c98c3719cf62258f6ff200/29114/describing.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+ElEQVQoz3WSPW/TUBhGM5ZfQYtgohMLUidEBwQSjMCfIUykYmNgofwRaJeKlVKpH2qq1k4TJ/68TmzHHze+tnOQr2gHqrzSkWU/1tF9Xt3O78NDjo7+cHx8rDk9PaXf72vOzs70+w0nJyf6W5tdXFxo+i3//j/v9+kEQhCGgiiKiFuShCRJ9LPIc6RcaMqy1OR5TpZlnIdjhpbFcGRxZZiYhsHgekiHFTNLUszLc+yRzbU5IggCXNelqiqdL+oK1/PxA0EgQpI0wxeCznK55H/aaU93dWVgmgaGYTIejxkMBhSy0Hld14ysMbbjIqZTZlGMNbHvnvBGqJQijhOklMhCspBKV1aqhmUrbBAi1PXLUqGqCi8IVgtHlsW3r1/Y6X2i19thp/eZbvcjP3/s6byqa4Kg3f+UNMs1E8e9K2yrtLO/t8+TRw94uHGf9fUNNjcfc29tjW73g85LpRBhqPfY1s3yAsf1VgsPDn6x/ew5796/ZfvFS169fsPTrS12v+/ersT1PF07TuZkWY4vwtWVF6rEmQlymTJNZsRpxDxLWJTqtrLjB/hiyjRKiOcZjuevFkrZ4LuSeZyRxjnzWUo0U/h+Q9MsaZoG23UZ244W2a7HxHZWC4tiiec1VGVNuagoZYVSUJbt1UILW9mlOcAYDLFsV1+bv4/4J7HOt8tVAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Describing a resource with the SkoHub Editor browser extension" + title="Describing a resource with the SkoHub Editor browser extension" + src="/static/492b5e6e95c98c3719cf62258f6ff200/f058b/describing.png" + srcset="/static/492b5e6e95c98c3719cf62258f6ff200/c26ae/describing.png 158w, +/static/492b5e6e95c98c3719cf62258f6ff200/6bdcf/describing.png 315w, +/static/492b5e6e95c98c3719cf62258f6ff200/f058b/describing.png 630w, +/static/492b5e6e95c98c3719cf62258f6ff200/40601/describing.png 945w, +/static/492b5e6e95c98c3719cf62258f6ff200/78612/describing.png 1260w, +/static/492b5e6e95c98c3719cf62258f6ff200/29114/describing.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Describing a resource with the SkoHub Editor browser extension</figcaption> + </figure></p> +<p>I select the topic “Library, information and archival studies” from the suggestions in the “subject” field, add information on licensing etc. and click “Publish”. A pop up lets me know that the resource is published to “Library, information and archival studies”. In the background, the description of the resource is sent to the respective topic (it could be more than one) which distributes the information to all its subscribers. Thus, in the end I as a subscriber of the topic will receive a notification of the resource in my Mastodon timeline:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 472px; " + > + <a + class="gatsby-resp-image-link" + href="/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 36.075949367088604%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABdklEQVQoz3WMvZKTYBiFuRVndsxHAoHwFwKbP34CYQOEYDbJ7kYbG5tttPQCLLfayrH3KrwBWys7b8BLeBwYHNNYPHPOO+e8RwrTPXl1pqheM13kaOaSkR2iW0HHpf9H07nEGMdcBxWS5UZ40zXmOMJwQjRzgW41o0Grf+9LRvYSdTRvUfQZij5FNebtsPTp6TPfvv/k7bv33JQHsuLAZnuiqO54dXhDXh7YlEfq/ZmiPFLVD9T7B/zZGsuNcbwYaxyg6D4DzUd6/vKVH79+8/jhI3FatU/l7p5sU7Op7lnlJ+bJvtUoP7FIaoLswKo8s1zfkm7PJMUdpp8iVA/JvU6I0x22v2KW3uJHO5bZkeDmhLHY8tJOEHaMcBKEkyKsztsrhBnSM8LW992MwWiGdCVMXlxpiKGPOskQxhLZilpVxyv6wwnywEb0rY5LbyG6rCebyKqLJJQxDc2jbs6RFYfBcIKieejmos3koUev6/2PJpfVCX8A+bf0AFYI6eEAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The toot announcing a resource newly published to a SkoHub topic" + title="The toot announcing a resource newly published to a SkoHub topic" + src="/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png" + srcset="/static/158048ebfeeb80ac9314a6beda41e5d6/c26ae/toot.png 158w, +/static/158048ebfeeb80ac9314a6beda41e5d6/6bdcf/toot.png 315w, +/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png 472w" + sizes="(max-width: 472px) 100vw, 472px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The toot announcing a resource newly published to a SkoHub topic</figcaption> + </figure></p> +<h2>Protocols and implementation</h2> +<p>The SkoHub-PubSub server is built in <a href="https://nodejs.org/en/">Node.js</a> and implements a subset of <a href="http://activitypub.rocks/">ActivityPub</a>, <a href="https://www.w3.org/TR/ldn/">Linked Data Notifications</a> and <a href="https://docs.joinmastodon.org/spec/webfinger/">Webfinger</a> to achieve the behavior described above. On the ActivityPub side, Server to Server <a href="https://www.w3.org/TR/activitypub/#follow-activity-inbox">Follow</a> and corresponding <a href="https://www.w3.org/TR/activitypub/#undo-activity-inbox">Undo</a> interactions can be received to handle the subscription mechanism. Non-activity messages are considered Linked Data Notifications and can simply be sent to the inbox of a subject using a <a href="https://www.w3.org/TR/ldn/#sender">POST request</a> with any JSON body. These notifications are considered metadata payload, wrapped in a <code class="language-text">Create</code> action and distributed to every follower of the corresponding subject again using ActivityPub.</p> +<p>As for the internals, <a href="https://www.mongodb.com/">MongoDB</a> is used to manage followers lists and an <a href="https://www.elastic.co/elasticsearch/">Elasticsearch</a> index is used to keep an archive of all payloads that have been distributed. This archive can be used to search and further explore metadata that has been distributed, e.g. by visualizing the distribution of subjects across all payloads.</p> +<p>The most challenging aspects of the implementation were to gain an understanding of <a href="https://github.com/hbz/skohub-pubsub/issues/27">Webfinger</a> for user discovery and of the details of message signatures and how to validate them. <a href="https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/">“How to implement a basic ActivityPub server”</a> was a good guidance here!</p> +<h2>Outlook</h2> +<p>We currently consider PubSub the least mature component of SkoHub. In the future, we would like to validate incoming Linked Data Notifications against a JSON schema that should be specific enough to ensure a consistent experience when viewing them e.g. in Mastodon but flexible enough to support additional use cases. We would also like to support <a href="https://github.com/hbz/skohub-pubsub/issues/38">ActivityPub on the publication side</a> and <a href="https://www.w3.org/TR/activitypub/#announce-activity-inbox">Announce</a> activities in order to enable use cases such as <a href="https://github.com/hbz/skohub-pubsub/issues/37">mentioning a SkoHub concept on Mastodon</a>. We would really value your input on this!</p><![CDATA[Presenting the SkoHub Editor]]>https://blog.skohub.io/2020-03-31-skohub-editor/https://blog.skohub.io/2020-03-31-skohub-editor/Tue, 31 Mar 2020 00:00:00 GMT<hr> +<p>ⓘ <strong>Update, 2022-03-01</strong>: <em>Due to lacking resources for maintenance, we decided to shut down the SkoHub Editor demo for an indefinite time. However, the <a href="https://github.com/skohub-io/skohub-editor">code</a> is still there for anybody to set up their own instance.</em></p> +<hr> +<p>In a <a href="http://blog.lobid.org/2019/09/27/presenting-skohub-vocabs.html">previous blog post</a> we presented a first SkoHub module: <em>SkoHub Vocabs</em>. Before talking about another module, first a short summary of the features SkoHub Vocabs offers. Basically, it provides an editorial workflow to publish a SKOS vocabulary on the web which can then be consumed by humans and applications. It builds on git-based online software development platforms (currently GitHub and GitLab are supported) where you maintain a SKOS vocabulary as a Turtle file. This allows you to use all the associated features such as branches and pull requests for a full-fledged review process. With every new commit in a branch, triggered by a webhook, SkoHub Vocabs will build a static site for the vocab – with HTML for human consumption and JSON-LD for consumption by applications.</p> +<p>In this post, we present <em>SkoHub Editor</em> (<a href="https://skohub.io/editor/"><del>demo</del></a>, <a href="https://github.com/skohub-io/skohub-editor">code</a>) that is accompanied by a browser extension. In a nutshell, SkoHub Editor enables the automatic generation of a web form based on a JSON schema, along with the possibility to look up terms in a controlled vocabulary that is published with SkoHub Vocabs. Additionally, metadata generated by the editor can be published using SkoHub PubSub, which we will describe in an upcoming post. Let’s take a look at the specifics by configuring an editor that lets you create JSON-LD describing an open educational resource (OER) on the web.</p> +<h2>Describing a resource with the browser extension</h2> +<p>Let’s start with actually using SkoHub Editor. You will have the most comfortable experience when using the SkoHub browser extension that wraps the SkoHub Editor and pre-populates some field in the web form. The browser extension is available both for <a href="https://addons.mozilla.org/en-US/firefox/addon/skohub-extension/">Firefox</a> and <a href="https://chrome.google.com/webstore/detail/skohub/ghalhmcgaicdcpmdicinaegnoanfmggd">Chrome</a>. Just add the extension to your browser and a little icon will be shown on the right-hand side of your navigation bar:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/2b8d11bca715d365580506508d352f7a/63ec5/extension-icon.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 15.18987341772152%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAjElEQVQI1zXNQRKDIAxAUe9/mfYGHa1oSQIoISqChaXH6NgZ3+rvfiOBObBn75zVoBHRGIMAiEhEiMAw+Ns8TRJkTynlTETNi0CprlfdMPZk0Bia/ph59v6KIMtNllWWa7cya62b/fiKCCLGGHPOpZRaLtu2lVLO86y1ppScc2QtqMFbM7/H+Hx82vYHYBSTRpcqu6YAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The SkoHub extension icon in between other extensions in the Firefox nav bar" + title="The SkoHub extension icon in between other extensions in the Firefox nav bar" + src="/static/2b8d11bca715d365580506508d352f7a/f058b/extension-icon.png" + srcset="/static/2b8d11bca715d365580506508d352f7a/c26ae/extension-icon.png 158w, +/static/2b8d11bca715d365580506508d352f7a/6bdcf/extension-icon.png 315w, +/static/2b8d11bca715d365580506508d352f7a/f058b/extension-icon.png 630w, +/static/2b8d11bca715d365580506508d352f7a/63ec5/extension-icon.png 812w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The SkoHub extension icon in between other extensions in the Firefox nav bar</figcaption> + </figure></p> +<p>While having any web page open, you can now open the SkoHub editor in your browser to describe that web resource. Let’s use as an example the YouTube video <a href="https://www.youtube.com/watch?v=ZaiDDOZcaqc">“COVID-19 – 6 Dangerous Coronavirus Myths, Busted by World Health Organization”</a> published recently by the World Economic Forum under a CC-BY license. Open the video in your browser, click on the extension and you will see that several fields are automatically filled out.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/ec0c8783a270bd477ef034281c1c4796/29114/prepopulated-webform.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnklEQVQozx2O20tTcQDH94dED0UkEgWCDz1pRih4qSlakTM3NufOfTvt7JwtZ7XpdDNTRNLhjRQ1MwozgyhXim2agUG99JCXqbv9ds7Z2dntnJWxvnwePi8f+CpAMHh8EARxFgDAcxzHchzL8nwiEksAwLEgHo8DlmUzydT473X069zDwJL146J2ec7+7o0ik82OPBnQaGCoVU+p1HdUBo/D9XxqZG6UnO9D7RTdDtPTE5Mz49OvAh9f//o2/90/s+N/trPl3VhTJASBMZLNevOthtaWq9XllTcxtfbtcOMMeX6BvrDQV61WaVyPeqyMfcu/mUlnU6lMVpJFWT4MRwqxlSBhi7NNg7Zcq6lW3tVhTrOmYUJ3bh4vnsWKKG2jy+FBDIZAYCMhCFEAYgDwPH8cCisSCYHu7CE63Eab29HtacOdZdftVUpCXVlqqynxQGrMyDBd/QaTfTuwHY2B/WAweHTEcnw4Ei3ErsFR99CYe2hscXkFMXbV3tD39fQyhFFTq3RCkNc7QXcPKpuxFy/f5/N5PiEISTGdziQEoXB7xbfu+7n7eY/9sscu+X90Ogddzseq+iZtfR2hQ6z4vfomXZ1S9WF1TZIkUUyl0ulsLieIogLEYhTF9Hunn07NDgyPeCdnb2sdJWXa0tKqi6dPFV+qvXxFdfZMUUV5hc/3SRTFcCTK8byQTPKCoOB4HqWsFoq20VbGQnfYu0xmB0E+YOwek4kmzZ1Wey9JUpABXl31JUUxCgDL8XGWY3leIcv5zRB7zArZnCTLspTLyVJOlqW8LJ0U9vfk5M9/OZFkeXf/YD94eBQKRWIgKaYUMNYOwQYUNyG4EcOJAoQRw3EMR1EcQVAEQRAMRwwQBGOEAUZJs4Wx3dfqEbVa8w+jHqtDtRlU5QAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="SkoHub extension in the sidebar of the browser with fields &#39;URL&#39;, &#39;Title&#39; and &#39;Description&#39; being pre-populated" + title="SkoHub extension in the sidebar of the browser with fields &#39;URL&#39;, &#39;Title&#39; and &#39;Description&#39; being pre-populated" + src="/static/ec0c8783a270bd477ef034281c1c4796/f058b/prepopulated-webform.png" + srcset="/static/ec0c8783a270bd477ef034281c1c4796/c26ae/prepopulated-webform.png 158w, +/static/ec0c8783a270bd477ef034281c1c4796/6bdcf/prepopulated-webform.png 315w, +/static/ec0c8783a270bd477ef034281c1c4796/f058b/prepopulated-webform.png 630w, +/static/ec0c8783a270bd477ef034281c1c4796/40601/prepopulated-webform.png 945w, +/static/ec0c8783a270bd477ef034281c1c4796/78612/prepopulated-webform.png 1260w, +/static/ec0c8783a270bd477ef034281c1c4796/29114/prepopulated-webform.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">SkoHub extension in the sidebar of the browser with fields &#39;URL&#39;, &#39;Title&#39; and &#39;Description&#39; being pre-populated</figcaption> + </figure></p> +<p>We can now add additional metadata by selecting a type (<code class="language-text">VideoObject</code> in this case), add a creator, creation date, language etc. As we mentioned, you can look up a subject from a controlled vocabulary for some fields in the web form. You will experience this when inputting content into the fields “Subject”, “License”, “Learning Resource Type”, and “Intended Audience”. For those fields you will get a drop down with suggestions from a controlled vocabulary, e.g. for “Subject” from a German <a href="https://w3id.org/kim/hochschulfaechersystematik/scheme">classification</a> of subjects in Higher education that is published with SkoHub Vocabs.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 458px; " + > + <a + class="gatsby-resp-image-link" + href="/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 79.11392405063292%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACaUlEQVQ4y6WUW2+bQBCF/f//VNWoVaXIMZj7slwXbO5rcOLEjh9ONQMkVaM+1dLR7gIevj1nlk3btpBSoqkb/M/v9n7H+HzBZhxHqEIhzmJUbY2mbzGMGnrUPK7S/xDdO00ab7cbppdXbK7XK6bzhJ+Pv/Dt4QHff/6AE/hwQwHvD9HaFasCHum65XvYWQam8xnnyxs29/sdWmvYngvTtmG5DgzLgmHt8fi0xdYwsDV2eDINmLYFw7awdxwed3sTYRwjKwr0esSZCOu6RhAEUGWFrDiwUlWyoiSDkDFElCDOFJK84Ov58gzdG8aZrO31XLDXJ6R5gSjN4XgBHJ8kuIhMUsRZzoX9UHJRT0iIKEaqCvasP03o9AlNP8wFm7aDCCWyooSMU8gkQ5zm/IckU0ySqRJJrpiMitNclUe0wwndcOKx6ZaCbdNACAF1qGDaDmtnWnCDEG4gsHc8WI7HJC9vNzy/Xlm0TSJcRZScctcPcFwP5bGe8emtepzfzlvRqLthuT7f+9BK12s0XT8THqsa252JsmrYP9cXTBTGCcI4RZRmi4cRe0je+ouPBLGSfhAOwwClFPLyyJ5ROKt3KXtXcGhkSVnV/Bx1Aq2PTfeVkI9eFHEggYznYJY50dFIRHSsLtd31urhp48X3j4T1m0HY29zcpQsJbr2Y7ZQzuuSSYmYiFYPV78/Uu76HjKKeZtioSJCmocLKfWeJ0ImpX6kkOb+G78WHPqeT8qhahDICEEYwQtC7kWioSD09MxbpbYh/d0ytP4MRWuocm7Y9ZTYnv9JJCRbQSFQM7NovigvD3yaqqblj8NvkLCbgQ33WlAAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="The string &#39;gesund&#39; is input in the subject field and several entries with this string from a controlled vocabulary are suggested." + title="The string &#39;gesund&#39; is input in the subject field and several entries with this string from a controlled vocabulary are suggested." + src="/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png" + srcset="/static/6417112bfbd5cb40999e9ce1d97b7b82/c26ae/auto-suggestion-from-skos-vocab.png 158w, +/static/6417112bfbd5cb40999e9ce1d97b7b82/6bdcf/auto-suggestion-from-skos-vocab.png 315w, +/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png 458w" + sizes="(max-width: 458px) 100vw, 458px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">The string &#39;gesund&#39; is input in the subject field and several entries with this string from a controlled vocabulary are suggested.</figcaption> + </figure></p> +<p>Currently, only the fields “URL”, “Type” and “Title” are obligatory, all other fields are optional. When you think you have described the resource sufficiently, you can click on “Show Preview” in the extension, copy &#x26; paste the JSON-LD to the clipboard and include it in the HTML of any web page within a <code class="language-text">&lt;script type="application/ld+json"></code> tag.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 486px; " + > + <a + class="gatsby-resp-image-link" + href="/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 125.9493670886076%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVQ4y51V2XbjNgzN//9XX9qm2Sb2xI4d2bJ2i7I27tRtAWW3Zx7Kc3BESSRwiXsBXg1SwzgHYy+Yc9DWQhvL7/R8N2tf11le13Y9Tl2Pq1EZ/G70/YA0L7A/JEjSDHlZsWVFiSTLcUgzZHmOLMtQ1YIcat44TdOZ0aiFwOJpheubW6yfN1g+rfHwuMCPxU/cPTzi+vYeq/Uz0jRFeRQzwtlBuIjQBWAYJaTS0NZhlIrn4zhCSslPYwziwwFV3eBKagPnHKQyUMpDSgetPJybMHmLMDSAkYAZMY0toIfZvo19HM8OR22A4KCrFE2coHnZoEsSqEbA1wnMyx18V8MPJ/i2hO8F3KkEJYRtOnNoMVkFvb2FTVYwux9whyXsyw3s4Sf05h/Y7Bm+yeGqPWzxgjCe4ModXBnBEepzhB62FTjuUog4hZM9bLyE3t7AZhu4fAubrvhdb645CAUORr6T9+5QGoegBpjnv2EJWbxgow1mv2B0tojgmgKhF4zOd0f4tuKT/SKHHrouIbIaRmv4oeEgZLTRa4lASggek3dsb+MMIefQWxhCFt3B7h5g9w/8dCKFq2J4kTEhc952Mzpy/kmvHw6pUqYALSqIaIfTdo02jiGiCEMnEayaHXY1S4iMCAqqnxHiIssaenOLfruETCOoKke/voepErhjDL3+C3r1J2y6ZkI05TvfwBURgtXfHBqHySio5R+wuzu49Al2dw8b3cLlG9YhpYMYdnUys15EMCSzdM3HJ5zfHMpZCvESJnqAofyRqOMlbL7lOf2nfBL7dGT6TicL56TMlWKaI6p9gWJXQnUtow6y42Bz7k7MOjkngoLsEfQIr8ZfsEyao6PGC7jihXNkonu4Jodvilk+Inv9t4U7Hrhy6BvV3z4+fGXZnGqIfQKxi2FORw7ABBye5rIjlt8K99M4Z/m1H/oAlHmPLOmgdIAaOpixB7zF5F5b3Ieaz/rmVx3S0mmCMQpWWwythNIz+yRuPu6phD8V3HWmz0jPHeov0Jt6xH5zRNcbhLZkDXI9UyfaP8IkK/ixhadAFCRcrJTpldERXdVAJAU8sSs7bgTEJlUG9UJCy98JLeV2aC8IW49zz6PNg0AQh3kxsXqMec5oqARp3tVznfN79k3Y2swdxFm+M/7viD9kM+dwGCT6doBRDtY4aGlhtONa9dwH27mljS3r9vNN+XbdNv/dy/8CJkl96BetmE0AAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Preview of the structured JSON data in the SKoHub extension" + title="Preview of the structured JSON data in the SKoHub extension" + src="/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png" + srcset="/static/70707507ae9efdd0f829cba5b111f2fd/c26ae/json-preview.png 158w, +/static/70707507ae9efdd0f829cba5b111f2fd/6bdcf/json-preview.png 315w, +/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png 486w" + sizes="(max-width: 486px) 100vw, 486px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Preview of the structured JSON data in the SKoHub extension</figcaption> + </figure></p> +<p>Using the <a href="http://blog.lobid.org/2019/05/17/skohub.html#subject-specific-subscription-to-web-resources">content subscription &#x26; publication features of SkoHub</a>, you can furthermore publish the resource via SkoHub PubSub (to be covered in detail in an upcoming post).</p> +<h2>Configuring the web form with JSON Schema</h2> +<p>As said above, the SkoHub Extension wraps the SkoHub Editor running at <a href="https://skohub.io/editor/">https://skohub.io/editor/</a>. SkoHub Editor is configured with a <a href="https://json-schema.org/understanding-json-schema/">JSON schema</a> document that is used both to generate appropriate form inputs and to validate the entered content. Thus, the JSON Schema is the central, most crucial part when working with SkoHub Editor. Currently, we are using as default schema a <a href="https://dini-ag-kim.github.io/lrmi-profile/draft/schemas/schema.json">draft schema for OER</a> we created using relevant properties and types from <a href="https://schema.org">schema.org</a>. With the JSON schema URL, we can now load the <a href="https://skohub.io/editor/?schema=https://dini-ag-kim.github.io/lrmi-profile/draft/schemas/schema.json">web form</a> you already know from the browser extension by providing the link to the schema. Of course, you can just write your own schema to build a web form for your use case.</p> +<p>Let’s take a short look at the underlying schema, which we tried to keep as straightforward as possible. Generally, with JSON schema you can specify a number of optional or mandatory properties and what type of input each expects. The <code class="language-text">"title"</code> of each property will be used as the label for the field in the web form.</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">{ + "properties": { + "name": { + "title": "Title", + "type": "string" + } + } +}</code></pre></div> +<p>It is also possible to allow only values from a predefined list (an <code class="language-text">enum</code>), which the editor will render as a drop down:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">{ + "type": { + "title": "Type", + "type": "string", + "enum": [ + "AudioObject", + "Book", + "Course", + "CreativeWork", + "DataDownload", + "ImageObject", + "PresentationDigitalDocument", + "SoftwareApplication", + "VideoObject" + ] + } +}</code></pre></div> +<p>Such lists of allowed values can be considered controlled vocabularies, and ideally they should be shared across many data sources. This is where SkoHub Vocabs comes into play. Instead of embedding the list of allowed values into our schema, we can reference a SKOS vocabulary on the web:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">{ + "about": { + "title": "Subject", + "type": "array", + "items": { + "type": "object", + "properties": { + "inScheme": { + "type": "object", + "properties": { + "id": { + "type": "string", + "enum": [ + "https://w3id.org/kim/hochschulfaechersystematik/scheme" + ] + } + } + } + }, + "_widget": "SkohubLookup" + } + } +}</code></pre></div> +<p>Notice the custom key <code class="language-text">_widget</code> in the JSON schema. This will configure the editor to use the specified UI element for the given field. In our example, the <code class="language-text">SkohubLookup</code> widget is used, which works with all controlled vocabularies that are published with SkoHub Vocabs. All custom JSON schema extensions start with an underscore <code class="language-text">_</code> and are used to control the look and feel of the editor; see below for an example for how to hide a field on the form.</p> +<p>Finally, to make our data JSON-LD, we also set a mandatory <code class="language-text">@context</code> property and a default object value for the <code class="language-text">@context</code>. This makes the editor add it to the document without any user interaction needed.</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "OER", + "description": "This is a generic JSON schema for describing an Open Educational Resource with schema.org", + "type": "object", + "default": { + "@context": { + "id": "@id", + "type": "@type", + "@vocab": "http://schema.org/", + "skos": "http://www.w3.org/2004/02/skos/core#", + "prefLabel": "skos:prefLabel", + "inScheme": "skos:inScheme", + "Concept": "skos:Concept" + } + }, + "properties": { + "@context": { + "type": "object", + "additionalProperties": true, + "_display": { + "className": "hidden" + } + } +}</code></pre></div> +<h2>Implementation</h2> +<p>Of course you can also poke around the editor while running it locally:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">$ git clone https://github.com/hbz/skohub-editor.git +$ cd skohub-editor +$ npm install</code></pre></div> +<p>As is the case with SkoHub Vocabs, the editor is implemented in <a href="https://reactjs.org/">React</a>. The form components are located in <code class="language-text">src/components/JSONSchemaForm</code>. In a nutshell, a <code class="language-text">Form</code> provides data to the various input components:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">&lt;Form + data={{title: 'A title'}} + onSubmit={console.log} +> + &lt;Input property="title" /> + &lt;Textarea property="description" /> + &lt;button type="submit">Publish&lt;/button> +&lt;/Form></code></pre></div> +<p>Obviously it would be tedious to manually code all the inputs for a given schema. This is where the <code class="language-text">Builder</code> comes into play. It reads a schema and creates all necessary input components:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">&lt;Form + data={{title: ''}} + onSubmit={console.log} +> + &lt;Builder schema={{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "My JSON schema", + "type": "object", + "properties": { + "title": { + "type": "string", + "title": "Title" + }, + "description": { + "type": "string", + "title": "Description", + "_widget": "Textarea" + } + } + }} /> + &lt;button type="submit">Publish&lt;/button> +&lt;/Form></code></pre></div> +<p>The browser extension is essentially a simple wrapper for the editor running at <a href="https://skohub.io/editor/">https://skohub.io/editor/</a>, which the extension injects as an <code class="language-text">iframe</code> into the current page. Additionally, before the iframe is injected, some metadata is scraped from that page. This data is used to pre-populate the editor. This process obviously depends both on the data found in the web page and on the schema the editor is configured to use. YouTube for example uses <code class="language-text">meta name="description"</code> for data about YouTube itself rather than the actual video, which is described in <code class="language-text">meta property="og:description"</code>. Even if the correct metadata is extracted, there is no guarantee that the schema used to configure the editor even has a <code class="language-text">description</code> field. In the future, it would be nice to find a possibility to somehow map page metadata to properties in the schema itself.</p> +<h2>Outlook</h2> +<p>SkoHub Editor already works very well and can be extremely useful. However, some things are still work in progress and will need some future effort to be improved:</p> +<ul> +<li><strong>Using schema.org markup for pre-population</strong>: This might sound obvious but we have not implemented it yet, see <a href="https://github.com/hbz/skohub-extension/issues/17">#17</a>.</li> +<li><strong>Further issues</strong>: See also the issues at <a href="https://github.com/hbz/skohub-editor/issues">https://github.com/hbz/skohub-editor/issues</a> for further ideas for improvement.</li> +</ul> +<p>Furthermore, some work will have to be put into the current default schema and the controlled vocabularies it uses:</p> +<ul> +<li><strong>Develop JSON Schema</strong>: The JSON Schema definitely is not finished yet. For example, it makes sense to include <code class="language-text">http://schema.org/keywords</code> in the future for adding arbitrary tags to describe a resource. We plan to develop the schema within the common <a href="https://oerworldmap.org/resource/urn:uuid:fd06253e-fe67-4910-b923-51db9d27e59f">OER metadata group</a> of DINI AG KIM &#x26; Jointly with a focus on describing OER in the German-speaking world.</li> +<li><strong>Improve Vocabularies</strong>: For “Learning Resource Type” and “Intended Audience” we are using controlled vocabularies that are not nearly finished but in development at the <a href="https://www.dublincore.org/groups/lrmi-task-group/">LRMI Task Group</a> of the Dublin Core Metadata Initiative (DCMI). Trying out the browser extension, you will for instance see that the educational resources types are missing some options. However, we assume that the combination of SkoHub Editor &#x26; SkoHub Vocabs makes a pretty nice environment for the development of these vocabularies in an open and transparent process on GitHub or GitLab.</li> +</ul> +<h2>Get involved</h2> +<p>Please try it out and let us know what doesn’t work or which feature you are missing and also what you like about SkoHub. We are happy about every bug report, suggestion and feature requests for the production version. Get in <a href="https://lobid.org/team-en/">contact</a> with us via a hypothes.is annotation, GitHub, Email, Mastodon or IRC.</p><![CDATA[SkoHub talk at SWIB19: KOS-based content syndication with ActivityPub]]>https://blog.skohub.io/2020-01-29-skohub-talk-at-swib19/https://blog.skohub.io/2020-01-29-skohub-talk-at-swib19/Wed, 29 Jan 2020 00:00:00 GMT<p>On November 27th 2019, Adrian Pohl and Felix Ostrowski (graphthinking) presented SkoHub at the “Semantic Web in Libraries” conference in Hamburg (<a href="http://swib.org/swib19/">SWIB19</a>).</p> +<div class="gatsby-resp-iframe-wrapper" style="padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem" > <iframe src="https://www.youtube-nocookie.com/embed/9cmkKPC3jlo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" style=" position: absolute; top: 0; left: 0; width: 100%; height: 100%; "></iframe> </div><![CDATA[Presenting the SkoHub Vocabs Prototype]]>https://blog.skohub.io/2019-09-27-skohub-vocabs/https://blog.skohub.io/2019-09-27-skohub-vocabs/Fri, 27 Sep 2019 00:00:00 GMT<p>We are happy to announce that the SkoHub prototype outlined in our post <a href="http://blog.lobid.org/2019/05/17/skohub.html">“SkoHub: Enabling KOS-based content subscription”</a> is now finished. In a series of three post we will report on the outcome by walking through the different components and presenting their features.</p> +<p>SkoHub is all about utilizing the power of Knowledge Organization Systems (KOS) to create a publication/subscription infrastructure for Open Educational Resources (OER). Consequently, publishing these KOS on the web according to the standards was the first area of focus for us. We are well aware that there are already plenty of Open Source tools to <a href="http://skosmos.org/">publish</a> and <a href="http://vocbench.uniroma2.it/">edit</a> vocabularies based on <a href="https://en.wikipedia.org/wiki/Simple_Knowledge_Organization_System">SKOS</a>, but these are usually monolithic database applications. Our own workflows often involve managing smaller vocabularies as <a href="https://github.com/hbz/lobid-vocabs">flat files on GitHub</a>, and <a href="https://github.com/dcmi/lrmi/tree/master/lrmi_vocabs">others</a> seem to also do so.</p> +<p>We will thus start this series with <a href="https://github.com/hbz/skohub-vocabs">SkoHub Vocabs</a> (formerly called “skohub-ssg”), a static site generator that provides integration for a GitHub-based workflow to publish an HTML version of SKOS vocabularies. Check out the <a href="https://jamstack.org/best-practices/">JAMStack Best Practices</a> for some thoughts about the advantages of this approach. SkoHub Vocabs – like SkoHub Editor that will be presented in a separate post – is a stand-alone module that can already be helpful on its own, when used without any of the other SkoHub modules.</p> +<h2>How to publish a SKOS scheme from GitHub with SkoHub Vocabs</h2> +<p>Let’s take a look at the editing and publishing workflow step by step. We will use SkoHub Vocabs to publish a subject classification for Open Educational Resources. We will use the “Educational Subject Classification” (ESC), that was created for the <a href="https://oerworldmap.org">OER World Map</a> based on <a href="http://uis.unesco.org/sites/default/files/documents/isced-fields-of-education-and-training-2013-en.pdf">ISCED Fields of Education and Training 2013</a>.</p> +<h3>Step 1: Publish vocab as turtle file(s) on GitHub</h3> +<p>Currently, a SKOS vocab has to be published in a GitHub repository as one or more <a href="https://www.w3.org/TR/turtle/">Turtle</a> file(s) in order to be processed by SkoHub Vocabs. ESC is already <a href="https://github.com/hbz/vocabs-edu/blob/master/esc.ttl">available on GitHub</a> in one Turtle file, so there is nothing to do in this regard. Note that you can also use the static site generator locally, i.e. without GitHub integration; see <a href="#implementation">below</a> for more about this.</p> +<h3>Step 2: Configure webhook</h3> +<p>In order to publish a vocabulary from GitHub with SkoHub Vocabs, you have to set up a webhook in GitHub. It goes like this:</p> +<ol> +<li>In the GitHub repo where the vocab resides, go to “Settings” → “Webhooks” and click “Add webhook”</li> +</ol> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 52.53164556962025%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVQoz6WS626cMBBGef9nS6SoiqpEVdVtdlkWDCz4gm/YpzK021WTH6060vGM0PDZ89mVmBbqwXIQFrkEQoy4EHE+4EN8h/WB07GmPzeocaRpO6TStF2PNgtVWaReGCeFNpZZKiapMIvlOkmUNhtSGaRUKOuYHh7pHx+YX15wZsEBPuWNSi1+23ld140QAsMw0gmB954SOedb3qryXes9K0l4ekJ8ekZ/O1AJvdLrldkU0bSJDsNA23XMs0RrgzblhAqtNVqXSTTKGGbjmMcJ9XakP3zHjVeq9vMXprcTOa2klIgxcmlbmubC+dxwqmvOTUNd19RNy/HSc2oEFzEirpr2qjE+YEMgAVX7/Mrw9Y207oLlhGXUe5xzew4rNoANmZj4HcWSYkdKVGVcofaRQ9xFf3n2LrYf00bOaev9k6qXASHDT6G0+fhR40eUjfc67xeWM1V5LuNs8H5/ezGud43p1vi3VGJUdFeDth7rPCHE/xP0MWFDIq73vuRb/a+CPwDkpVjCrQYeOQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path." + title="Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path." + src="/static/a30562938e313d345071b4f50e905510/f058b/add-webhook.png" + srcset="/static/a30562938e313d345071b4f50e905510/c26ae/add-webhook.png 158w, +/static/a30562938e313d345071b4f50e905510/6bdcf/add-webhook.png 315w, +/static/a30562938e313d345071b4f50e905510/f058b/add-webhook.png 630w, +/static/a30562938e313d345071b4f50e905510/40601/add-webhook.png 945w, +/static/a30562938e313d345071b4f50e905510/78597/add-webhook.png 947w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of the Webhook page in a GitHub repo with highlighted fields for the navigation path.</figcaption> + </figure> +2. Enter <code class="language-text">https://test.skohub.io/build</code> as payload URL, choose <code class="language-text">application/json</code> as content type and enter the secret. (Please <a href="http://lobid.org/team/">contact</a> us for the secret if you want to try it out.) +<figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 77.84810126582278%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+klEQVQ4y41TW24bMQzcq/cO/egNeqCiH2mA/hSJ1/vSavV+UBOQazuO7bQlMBiBNmeHpNSlnOG9h/Mexjo4H6A3I2yshw9Rzta9/86s+j/YhheUUpGv0MVcoV1GqYRSK1prUrTqDdO8YBhnhJgQUoZnjlnAdYJUENOey6WgC7lhMoTN8x8IHOzspR93HAZMs8K8KCiloVYtZ/4Y87ysGKcZi7YgInTWGLweZxBVAE0chlQw6oDVFbhIoFpRa5WCejozyjUTSW3nfUC/OPh0SgIy00PfQykFYwxSLvtISr3MjIs/RgMRCyZCvxZo995yCBHDMGITsXxxwg7POAsyX6NjkaMuCCLGyV3wOE6yTWpArSQu+UytCT+KvWUpVjAuwoeEnAtWG3FcLHwBbCTY2GBT2zkSdCDE0i4zP0Na5gUclcfmssyG3biQcBgU5tWKcxcrXNrhM8HnhlLbXbuyZflO23GOGCO01jDGyoKC90jMzqHmjM9CWgZ26+cER85ZFsKC/GpEUG+IekO27s7ZR4c3SQ4fAqZplsvLgny1jHPYrEVI6eF2LzO8tcxRSoF1DmpdYazF/8ap5XvBypc3ZJRYZIY8089c3bX8SHALBk/Db7zaAT4GpJRkDDGmvwrTrUNq+0v5qZ7x5cdXfPv1HSZZ2Vml/aX8q+U3aH7kicYMJaUAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot of the Webhook page with input (payload URL and secret)." + title="Screenshot of the Webhook page with input (payload URL and secret)." + src="/static/8650d807e6599370e6b3819a46654b15/f058b/add-webhook2.png" + srcset="/static/8650d807e6599370e6b3819a46654b15/c26ae/add-webhook2.png 158w, +/static/8650d807e6599370e6b3819a46654b15/6bdcf/add-webhook2.png 315w, +/static/8650d807e6599370e6b3819a46654b15/f058b/add-webhook2.png 630w, +/static/8650d807e6599370e6b3819a46654b15/40601/add-webhook2.png 945w, +/static/8650d807e6599370e6b3819a46654b15/38124/add-webhook2.png 953w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of the Webhook page with input (payload URL and secret).</figcaption> + </figure></p> +<h3>Step 3: Execute build &#x26; error handling</h3> +<p>For the vocabulary to be built and published on SkoHub, there has to be a new commit in the master branch. So, we have to adjust something in the vocab and push it into the master branch. Looking again at the webhook page in the repo settings, you can see a notice that the build was triggered:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/5d638e5a214e95beb550c5ddf028b8fa/01dae/check-webhook-response.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 85.44303797468356%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8UlEQVQ4y42STW7bMBCFfe2ueoJuuugRuuoFeocCAWpFhWMkiC3EEiWb/z9DcjgsZKWGW8RIPzwQBMlHviG5IiLnvLVukbHWmEVOaZNSKm+BOGtFRNqY04lLqbgQ3nvn5718CNb5jEhvUYiwnM0AYIzVWnMuEEu9gm5wZY7ROieVOgmhjYEARHTb+I/ZgeaGElEuMaWUM5aScy6lvGOuVHs7rtnDhj89iU4LaYTUQmpj8UbBV+Zav3XfP/z89LH5/GX7VY+T7np1YIj4XzVra4SWXEmplQNAolmIWN5hVUrph4ExNjL2cuin41QrXa66LLri+vwVUUlUDGTlwIboQxbacW1PykLKl+DLXpUopgQxQYwZcVUruRC4thOXXT/8eGmlcx6Shbj8kForABx6Zp0HiM5574Pz8/+Za2aMGWNrrSnFKXAkXJJfoqaUtLEhzoQAMUYAWJ6KxmkahoGNo1Q6xzyvAAhhWfxKzjn9TTnHrvt997DdPj4+Pj/vdrtd13X73X6ajv42zrmc8xx7Op2E0lJrqY0yhkvpQkiIMeeYczq315qnUkLEVUEcH7ZxHPM0vep4TOMYFzEGjEX2p7OM9H3WusxPheg3G9m2fL2WbavaX6ptZXMv789qGr5eq3m8FU0j71veNPzuDoYBa/0N6FnSaftrdg8AAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot from GitHub Webhook page with information that build was triggered with link to build log." + title="Screenshot from GitHub Webhook page with information that build was triggered with link to build log." + src="/static/5d638e5a214e95beb550c5ddf028b8fa/f058b/check-webhook-response.png" + srcset="/static/5d638e5a214e95beb550c5ddf028b8fa/c26ae/check-webhook-response.png 158w, +/static/5d638e5a214e95beb550c5ddf028b8fa/6bdcf/check-webhook-response.png 315w, +/static/5d638e5a214e95beb550c5ddf028b8fa/f058b/check-webhook-response.png 630w, +/static/5d638e5a214e95beb550c5ddf028b8fa/01dae/check-webhook-response.png 721w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot from GitHub Webhook page with information that build was triggered with link to build log.</figcaption> + </figure></p> +<p>However, looking at the build log, an error is shown and the site did not build:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/c0afbbe39292d1e772cf87dc2ac2b4f5/29114/error-in-build-log.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvklEQVQoz4WSXW/aMBRA+fltWUmkjQDdntbtt3S8VOWhUqtJFBKHMEyBJLbz3TPFIFg7bbV1dK+udI+u5duRUvK82SDCiJkvmIuQqS+YBQIRLRGLiCc/sASLiCBcEISn2PYFiyVi5iOCkI4yOYky7FKN0hmFaVitC3RsqLKaJm+o8wZq4OUNNaQ6I2lJFUmq6cTKEGtDonO2JsWvfH6mjzwmD0yzKUEd2JpoBOFL+IpFHbHTmkRlxDojVppOovdCrUrmOqRf9nGky2V4iStdBsWAYTVkUA6ODMsh/arP1+IaqXekKreOgzA7CU2IV3k4kUN31rVSL/dOwuqNsHxHONOCT+YjztKhO+/i/HKOE7YSGw95K7x+T9g+eVB4uEuXnt/DjVw85TEqR4yqE1fVlZ32W/md9f+ETyagV/c4l+eWM3nGxfYCp3Re4ZYul+UHPhdf/j1hW1zpDWP9g7Eac5PccJvfMqknTJq/uWvuuK/v2Wp1+GVj188KbUEZlM4p4oJUpmTbDMr9rtlYHPI/T7Pfw7a39Wzi5CC04xpS08oTAhGwXC2RzxK5lmy2G1KVWqqmojncqqmt6CjcJfwGy5Ucr+Jh6OIAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot from build log with error message" + title="Screenshot from build log with error message" + src="/static/c0afbbe39292d1e772cf87dc2ac2b4f5/f058b/error-in-build-log.png" + srcset="/static/c0afbbe39292d1e772cf87dc2ac2b4f5/c26ae/error-in-build-log.png 158w, +/static/c0afbbe39292d1e772cf87dc2ac2b4f5/6bdcf/error-in-build-log.png 315w, +/static/c0afbbe39292d1e772cf87dc2ac2b4f5/f058b/error-in-build-log.png 630w, +/static/c0afbbe39292d1e772cf87dc2ac2b4f5/40601/error-in-build-log.png 945w, +/static/c0afbbe39292d1e772cf87dc2ac2b4f5/78612/error-in-build-log.png 1260w, +/static/c0afbbe39292d1e772cf87dc2ac2b4f5/29114/error-in-build-log.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot from build log with error message</figcaption> + </figure></p> +<p>Oops, we forgot to check the vocab for syntax errors before triggering the build and there actually <em>is</em> a syntax error in the turtle file. Fixing the syntax in a new <a href="https://github.com/hbz/vocabs-edu/commit/6ab97649874607df7784eaa0787adadbcefde166">commit</a> will automatically trigger a new build:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; " + > + <a + class="gatsby-resp-image-link" + href="/static/a295ec74a05afd3b5175ce477988c1fb/29114/fix-error.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 55.06329113924051%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmklEQVQoz42Sb2vbMBCH89GXpc2fbmQM9m6DfaRtaRInaVwY7EW9po4sS5ZkyX6KnDRraQYVPAjufvfjuLveIlkzmy9JVhu2aUp6e8t8uepiP2cLfvyaM5snXC8SrucJy9WG9U3KarM9kay3rBcJ25uU3vTzF8YfPzH+MD0xuprSv7zi/eX4wHDCYDihfzHi3SAypH8Rc5Mu34+awYiv377Ts9bhXN1h41/XCCHZCU2pDaoy6MqijUNIRVEe4pV11LXHHal9QJYlPc68LJf8zgR/7iV77ZG2RVThiCcrHKXxr+qstfTatuU58anKkhcapQ3GOkLb4kNz4hC3nfZ5nTHmvGGlDbKQ7HY5QpTdCKRUKKVRqiKOyftw3vCp3ReGpkQUOVl2Ry72CFlQyAJZyo6ilBhr3m74Ny+4u9+zLxS1b3C+ofZtN4qIDy2had9uKKWkVBrTbd2jjaUyFlM5jHFRfKqB/xj+Exw35upuIZF4EpFMPZCVO0LTvGjiqc45d75D7z1K6+NtHu40xnIjeDCCJura14YhBB4BmLo8H+QEGOsAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot from build log with error message" + title="Screenshot from build log with error message" + src="/static/a295ec74a05afd3b5175ce477988c1fb/f058b/fix-error.png" + srcset="/static/a295ec74a05afd3b5175ce477988c1fb/c26ae/fix-error.png 158w, +/static/a295ec74a05afd3b5175ce477988c1fb/6bdcf/fix-error.png 315w, +/static/a295ec74a05afd3b5175ce477988c1fb/f058b/fix-error.png 630w, +/static/a295ec74a05afd3b5175ce477988c1fb/40601/fix-error.png 945w, +/static/a295ec74a05afd3b5175ce477988c1fb/78612/fix-error.png 1260w, +/static/a295ec74a05afd3b5175ce477988c1fb/29114/fix-error.png 1920w" + sizes="(max-width: 630px) 100vw, 630px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot from build log with error message</figcaption> + </figure></p> +<p>This time the build goes through without errors and, voilà, SkoHub has published a human-readable version of the vocabulary at <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html">https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html</a>. SkoHub Static Site Generator also publishes an <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/index.en.html">overview</a> of all the SKOS vocaularies in the GitHub repo.</p> +<h3>Step 4: Redirect vocab URI to SkoHub</h3> +<p>As we want the canonical version of ESC to be the one published with SkoHub Vocabs, we need to redirect the namespace URI we defined in the Turtle file to SkoHub. As we used w3id.org for this, we have to make a pull request in the respective repo.</p> +<p><a href="https://github.com/perma-id/w3id.org/pull/1483"><figure class="gatsby-resp-image-figure" style=""> + <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "> + <span class="gatsby-resp-image-background-image" style="padding-bottom: 89.24050632911393%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAACvElEQVQ4y3VUSY4cRwys/3/DH/DVJwF+gS8+SJBHI0x3116570sIZNW0JUFKgCCyKhlkBoM5+JiwqIhFRtyPiBAicopIMSKX+oPV2mCcx7zuMNZh2wW0sRBS4xASMWUMdNCFDOMShA5wcodeH4hawLoA5yN8iLDOMxgBHVJxMH0nH2JiT1iD0gr/vb5gnCbM84x123F7THi7P7DtO9btQEwJvXfUWtFaY6M9rXfvvEeiCj+qF/zx+U+s+wYhJKRSUEpiFxq7yZDGw4QCFwms4vtFYO+AnKh3DKUWCCOZi1IqX4OukHKBcQEpV1gfoLRFjAmtgwPbBYQO1FZh9IGSEoZpHPHy5Svmw7Ct0kOHChMbzOXtZcoXrMpjUwE+VZiriLPCytUOxAsRSmQrZdioWqXN0+h/40o6amuX7xdgua7PxWI4HWAtXSki5/I89DNXbABypnOZAb0PJ9j1f6CA2gHriLuMmAp8SMwdcem954Pfd7c30mThzv6QjACj+Ad2+oDoD3izwJkFVpPNMHKC9xboBFSBXkFNDKkwoLXu/yTvgCVMyPoTin1AyRXeCpRskZNGzfYknDV4VphLYwnlnH4NSAG5d9zFA+N9xmPe8JhW3McF6yawC8mmreNJIX59LEyH1gb5J74ZMDSHf4+PONYN07ph3iSWecK2rViWBeu6cEXnaiy+3gs3hbRJlaWceZIGCrjdbmil8bxSZspKwnY+wIVweh9YWsY5CJ7lhEMo3O4j3u4jdqFYkwN1kcaNAqS2PBXUbeo0PQ60twwcT+8jlHGc0IfAOqUXiqp7ckjaogP0WpTafmv1st7AD8GyrM9ZftcrA5Za+TraOChjeVI07y03giaF6OCKQ8BuJKTR2A9x0uE8C/3ZlNY6d+9XRqMWnMc4zpiXHS/LG/56/Ruv8gbCMD6iXA0hwG+z5XasAJgiPgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"></span> + <img class="gatsby-resp-image-image" alt="Screenshot of a pull request to redirect ESC to SkoHub" title="Screenshot of a pull request to redirect ESC to SkoHub" src="/static/dcbc73109ed2edf14419bc87466a5342/f058b/open-pr-at-w3id.png" srcset="/static/dcbc73109ed2edf14419bc87466a5342/c26ae/open-pr-at-w3id.png 158w, +/static/dcbc73109ed2edf14419bc87466a5342/6bdcf/open-pr-at-w3id.png 315w, +/static/dcbc73109ed2edf14419bc87466a5342/f058b/open-pr-at-w3id.png 630w, +/static/dcbc73109ed2edf14419bc87466a5342/40601/open-pr-at-w3id.png 945w, +/static/dcbc73109ed2edf14419bc87466a5342/eb2af/open-pr-at-w3id.png 954w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async"> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of a pull request to redirect ESC to SkoHub</figcaption> + </figure></a></p> +<p>If everything looks good, w3id.org PRs are merged very quickly, in this case it happened an hour later.</p> +<h3>Result: HTML &#x26; JSON-LD representation published with SkoHub &#x26; basic GitHub editing workflow</h3> +<p>As a result, we have published a controlled vocabulary in SKOS under a permanent URI and with a human-readable <a href="https://w3id.org/class/esc/scheme.html">HTML</a> representation from GitHub with a minimum amount of work. Additionally, the initial Turtle representation is transformed to more developer-friendly <a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.json">JSON-LD</a>. The HTML has a hierarchy view that can be expanded and collapsed at will:</p> +<p><a href="https://test.skohub.io/hbz/vocabs-edu/heads/master/w3id.org/class/esc/scheme.en.html"><figure class="gatsby-resp-image-figure" style=""> + <span class="gatsby-resp-image-wrapper" style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; "> + <span class="gatsby-resp-image-background-image" style="padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfUlEQVQoz62P20rjUBiF82bOlVgG8UIQxLuBufYBvPQxFLStWBhm8IRVEBRBRWRQk1btEA+1traxSbrbNImJSb8hoR4Rqsws+Nh7/4fF2tJEfoHJQpZx+SffDzN8+z3P2H6a0f05RvbSDO+kGdpOMriV5OvGLIn1GRJrsyRWkwysJBlYTtG/kOJLZpq+uSmkU6OCrF1zqBU5qF6wV1HZrV6wWTpjo3jK+lWe7GWeJVUmWyqwVlZZLv1hsVjg1+UZP85PyKh55tUTUoUckjAaVG7K1Ksad7c1hG7iCAu9fItRqca0dZPAcuAhpJcks9FA0zTato3n+3SAe9+P322ni21jOw4ty6LZaj2dTev5btk2rucj6YZBrVajXq9jmiaue08Q9k7ynqK9OKGu6wjRRAiB47pdww6dzseJDYMQqSGacTLP8wiCgDAM40akx8FeemX49ntR858MH4IgLoTd6FHCx9pnifYk/rMkWVFQlBzyC47fqfVCyeU4Opb5CzP1NdXpUl2bAAAAAElFTkSuQmCC'); background-size: cover; display: block;"></span> + <img class="gatsby-resp-image-image" alt="Screenshot of the HTML version of ESC published with SkoHub." title="Screenshot of the HTML version of ESC published with SkoHub." src="/static/e5a580cc6f532f9f98c427ff90a06429/f058b/published-vocab.png" srcset="/static/e5a580cc6f532f9f98c427ff90a06429/c26ae/published-vocab.png 158w, +/static/e5a580cc6f532f9f98c427ff90a06429/6bdcf/published-vocab.png 315w, +/static/e5a580cc6f532f9f98c427ff90a06429/f058b/published-vocab.png 630w, +/static/e5a580cc6f532f9f98c427ff90a06429/40601/published-vocab.png 945w, +/static/e5a580cc6f532f9f98c427ff90a06429/78612/published-vocab.png 1260w, +/static/e5a580cc6f532f9f98c427ff90a06429/29114/published-vocab.png 1920w" sizes="(max-width: 630px) 100vw, 630px" style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" loading="lazy" decoding="async"> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot of the HTML version of ESC published with SkoHub.</figcaption> + </figure></a></p> +<p>There also is a search field to easily filter the vocabulary:</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; " + > + <a + class="gatsby-resp-image-link" + href="/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 82.27848101265823%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC7UlEQVQ4y6WRzYscVRDA54+QrJ7j5ubBg+JJFEQPIngSFAQ95ZJcchMha/wa4iHBEBMQRQjBHCKCEJC4SXbjRtyEWXXdzHZPT+/szPZ3T3/MdM9Md8/XT96bzLrrTS34UfXqVdWrqld6uvIZL/9xiecq53nxt4s8v3GBZx+c44XKRV7auMQz6+dYvPcJx9bKHFv7lMWfyzPulllcLfOkYKXM0Ttljt4uU3qqcpaT2nXerF7hXeVbjivXeG3zK96uXuWE+h2vbFzmsZX3eWJ1iYWV0yzcWeKI4PYSR249YvkDFpbP8PjyGUpf7v3CF801LrfWuLB7l893VznfWOGsfouP6z/xkXaTD7WbnK79yHvKDU5Vf+Dk1vcc37zOO79f462Nq7xRucLrD77h1fWvKU2yCdNswmQwQdhzpnO/ZHzo7mDMOBuTD4b0+jmdXp9S3OuTDDLSrCDJ8n9NKinoZwW9rKA0yAsG2YC426Gbdv8zcdKhnw0oFcMxpmNyb/1XNqtV1B19H0Wvo9TrUu+f9b/Pc5+q62ypCi2jSSkfjvADH0WrUW/soO3oVFWF7Zoqz/puY99X323MYhq6vD8Yo+oalmNTyooRYRRjWA6W49EyTDb/3OLhtoph2Vi2K336TkPem7aDaTk8rCpsKzVahsWeadNo7mFZttjhkNFohOd5BEGbOI5IkkTS6XQkcRxLnSRdaYtYoaMoYpBlDIdDiqJgMpnMCgqHptVlkus6MmFOEIQ4jotlWQRBgO+3MQ0D0zSxbVvmHhT5y6JymqaotRphGBKGAZ7r4vk+URRLu9XawzAMWfSfIvKn06lEFhyPx/Klbrcrk3zfx3VdqTVNo9lsyg79dhvXcbAdB8dxsExTdjyXQwVdzyMKQ3zPk7ZIEMFip6LrKAqJ4pgwCGgHgdyfmETY7Xab0Wg8G1n8cp7nrN+/T6vVIk0SGTQbN5JdC8QnxXHn0WfEpGlP7lzEHCrYzwvZ6nwP/0fEyH8B2i950qA9U44AAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Screenshot: Filter the scheme by yping in the search box" + title="Screenshot: Filter the scheme by yping in the search box" + src="/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png" + srcset="/static/15d14a94c2569955b4f41228f46ab1ec/c26ae/skohub-ssg-filter.png 158w, +/static/15d14a94c2569955b4f41228f46ab1ec/6bdcf/skohub-ssg-filter.png 315w, +/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png 500w" + sizes="(max-width: 500px) 100vw, 500px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Screenshot: Filter the scheme by yping in the search box</figcaption> + </figure></p> +<p>This filter is based on a <a href="https://github.com/nextapps-de/flexsearch">FlexSearch</a> index that is also built along with the rest of the content. This allows us to implement lookup functionalities without the need for a server-side API. More about this below and in the upcoming post on the SkoHub Editor.</p> +<h2>Implementation</h2> +<p>To follow along the more technical aspects, you might want to have SkoHub Vocabs checked out locally:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">$ git clone https://github.com/hbz/skohub-vocabs +$ cd skohub-vocabs +$ npm i +$ cp .env.example .env</code></pre></div> +<p>The static site generator itself is implemented with <a href="https://www.gatsbyjs.org/">Gatsby</a>. One reason for this choice was our good previous experience with <a href="https://reactjs.org/">React</a>. Another nice feature of Gatsby is that all content is sourced into an in-memory database that is available using <a href="https://graphql.org/">GraphQL</a>. While there is certainly a learning curve, this makes the experience of creating a static site not that much different from traditional database-based approaches. You can locally build a vocab as follows:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">$ cp test/data/systematik.ttl data/ +$ npm run build</code></pre></div> +<p>This will result in a build in <code class="language-text">public/</code> directory. Currently, the build is optimized to be served by Apache with <a href="https://httpd.apache.org/docs/2.4/mod/mod_negotiation.html">Multiviews</a> in order to provide content negotiation. Please note that currently only vocabularies are supported that implement the <a href="https://www.w3.org/2001/sw/BestPractices/VM/http-examples/2006-01-18/#slash">slash namespace</a> pattern. We will add support for hash URIs in the future.</p> +<p>In order to trigger the static site generator from GitHub, a small webhook server based on <a href="https://koajs.com/">Koa</a> was implemented. (Why not <a href="https://expressjs.com/">Express</a>? – It wouldn’t have made a difference.) The <a href="https://developer.github.com/webhooks/">webhook</a> server listens for and validates POST requests coming from GitHub, retrieves the data from the corresponding repository and then spins up Gatsby to create the static content.</p> +<p>A final word on the FlexSearch index mentioned above. An important use case for vocabularies is to access them from external applications. Using the FlexSearch library and the index pre-built by SkoHub Vocabs, a lookup of vocabulary terms is easy to implement:</p> +<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/FlexSearch/0.6.22/flexsearch.min.js">&lt;/script> + +&lt;script> + fetch('https://w3id.org/class/esc/scheme', { + headers: { accept: 'text/index'} + }).then(response => response.json()) + .then(serialized => { + const index = FlexSearch.create() + index.import(serialized) + console.log(index.search("philosophy")) + }) +&lt;/script></code></pre></div> +<p>Note that currently the index will only return URIs associated with the search term, not the corresponding labels. This will change in a future update.</p><![CDATA[SkoHub: Enabling KOS-based content subscription]]>https://blog.skohub.io/2019-05-17-skohub/https://blog.skohub.io/2019-05-17-skohub/Fri, 17 May 2019 00:00:00 GMT<p>For a long time, openness movements and initiatives with labels like “Open Access”, “Open Educational Resources” (OER) or “Linked Science” have been working on establishing a culture where scientific or educational resources are by default published with an <a href="http://opendefinition.org/">open</a> license on the web to be read, used, remixed and shared by anybody. With a growing supply of resources on the web, the challenge grows to learn about or find resources relevant for your teaching, studies, or research.</p> +<p>In this post, we describe the SkoHub project being carried out in 2019 by the hbz in cooperation with graphthinking GmbH. The project seeks to implement a prototype for a novel approach in syndicating content on the web by combining current web standards for sending notifications and subscribing to feeds with knowledge organization systems (KOS, sometimes also called “controlled vocabularies”).*</p> +<h2>Current practices and problems</h2> +<p>What are the present approaches to the problem of finding open content on the web, and what are their limitations?</p> +<h3>Searching metadata harvested from silos</h3> +<p>Current approaches for publishing and finding open content on the web are often focused on repositories as the place to publish content. Those repositories then provide (ideally standardized) interfaces for crawlers to collect and index the metadata in order to offer search solutions on top. An established approach for Open Access (OA) articles goes like this:</p> +<ul> +<li>Repositories with interfaces for metadata harvesting (<a href="http://www.openarchives.org/OAI/openarchivesprotocol.html">OAI-PMH</a>) are set up for scholars to upload their OA publications</li> +<li>Metadata is crawled from those repositories, normalized and loaded into search indexes</li> +<li>Search interfaces are offered to end users</li> +</ul> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 421px; " + > + <a + class="gatsby-resp-image-link" + href="/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 89.87341772151898%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqElEQVQ4y5WUiYrDMAxE/f8fWChtAr3S9G6T9D60PMF4vSHLbgSuXVsajTWKQ1mWdj6f7Xg82ul08vXhcLDb7Wabzcbquo5nTdP42fV6td1uZ1VVxTP8OA+Xy8WwyWTiDhhg7BOIzedzB8eez6cnVdx6vbaiKEwW9vu9PR4Pz0DW+/3umZjJzkwiWLDGj4TMYqo9/gd+GGySDSYAvd9vdwKEpLBgzR5n+OC7Wq0iOKyDdZgY40Qwxvrz+fjMDfDpsoBTe8i4JleC+WKxiEIoSVdsZNgGJEj1BQh1EQR2iKKYdHaGbcopIMEYrSUlpXIb6E9AZgpPsOpG0akt4vQClKNU3m633ousJU5vhlwZIFghDmJorabuDagaIg7C/KuGKf10AIiyqEzb0MCsSaJPst0ZsW26MmEwgR09qD4U699uFtIr6kEAiPoBhjAyfYaciSkxr9frm2GqqJ4tWgMRAEAEfWZ63jhnAMZ/vVI/AAlmjdNyufQe1L76jmQAUE+uryctFSkCcoXBYGB5nttoNLLxeGxZltl0Oo1Xms1mNhwOfV/nzJRAgF88jHsXHV2+bAAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top." + title="Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top." + src="/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png" + srcset="/static/09b20404ba79837614549b8eb52ee6d1/c26ae/repo-approach.png 158w, +/static/09b20404ba79837614549b8eb52ee6d1/6bdcf/repo-approach.png 315w, +/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png 421w" + sizes="(max-width: 421px) 100vw, 421px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">Diagram of the current approach with metadata being crawled from repos, indexed and search offered on top.</figcaption> + </figure></p> +<p>With this approach, subject-specific filtering is either already done when crawling the data to create a subject-specific index, or when searching the index.</p> +<h3>Maintenance burden</h3> +<p>When offering a search interface with this approach, you have to create and maintain a list of sources to harvest:</p> +<ol> +<li>watch out for new relevant sources to be added to your list,</li> +<li>adjust your crawler to changes regarding the services’ harvesting interface,</li> +<li>homogenize data from different sources to get a consistent search index.</li> +</ol> +<p>Furthermore, end users have to know where to find your service to search for relevant content.</p> +<h3>Off the web</h3> +<p>Besides being error-prone and requiring resources for keeping up with changes in the repositories, this approach also does not take into account how web standards work. As <a href="https://doi.org/10.1045/november2015-vandesompel">Van de Sompel and Nelson 2015</a> (both co-editors of the OAI-PMH specification) phrase it:</p> +<blockquote> +<p><small>“Conceptually, we have come to see [OAI-PMH] as repository-centric instead of resource-centric or web-centric. It has its starting point in the repository, which is considered to be the center of the universe. Interoperability is framed in terms of the repository, rather than in terms of the web and its primitives. This kind of repository, although it resides on the web, hinders seamless access to its content because it does not fully embrace the ways of the web.”</small></p> +</blockquote> +<p>In short, the repository metaphor guiding this practice obscures what constitutes the web: <strong>resources</strong> that are identified by <strong>HTTP URIs</strong> (<a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier">Uniform Resource Identifier</a>).</p> +<h2>Subject-specific subscription to web resources</h2> +<p>So how could a web- or resource-centric approach to resource discovery by subject look like?</p> +<h3>Of the web</h3> +<p>To truly be part of the web, URIs are the most important part: Every resource (e.g. an OER) needs a URL that locates and identifies it. In order to make use of knowledge organization systems on the web, representing a controlled vocabulary using <a href="https://en.wikipedia.org/wiki/Simple_Knowledge_Organization_System">SKOS</a> vocabulary is the best way to go forward: each subject in the vocabulary is identified by a URI. With these prerequisites, anybody can link their resources to subjects from a controlled vocabulary. This can be done e.g. by embedding <a href="http://www.dublincore.org/specifications/lrmi/lrmi_1/">LRMI</a>, “Learning Resource Metadata Initiative” metadata as JSON-LD into the resource or its description page.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 221px; " + > + <a + class="gatsby-resp-image-link" + href="/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 127.21518987341773%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB50lEQVQ4y72V56ojMQyF5/0fKZDeCymE9D/pvfeu5dPFw93sTO7sEtZwGNuSFck6J7bq9brs93tZr9cfgTUej+WTQwPO53MJhUISi8WkWCxKPB6XVCqle3zNXjQaVVQqFcnn85JMJiWTyUg2m5Vut/sVcDgc6uR4PGrKp9NJr+BwOMhyubTns9lM7ZvNRn3YwwY4e71evwL2er2Plft8PsXqdDpC2aPRyBHYKKfRaMhkMhEqcvMFlons9osMylksFvLO127K4/FQJycw2u22FAoFyeVyAsVMUDdYXu4FFnA1P2WnGeJM55xAV8/ns9IEalwuF1mtVq7+wKrVatr6746v7N9ut7Lb7dTn/yul3+/bC6jh8/m0Ael0WhKJhCrE7/dLqVRSVRhFBQIBtTWbTT1rmmsrhcX9freVwn0xB1wDa9RB2cwpD4Vw5rcMjVIweOmiEwvIzsBCBW5KIXtYQIcjkYiS25NSfhqU51Xzrkphn9FqtewmlcvltyrxrBSaMZ1OvSkFR0qie06A1EZ6htzvYCF42m/UwNcJrzY3X1spf0sbc8d/lAwNMKKKYDCobwXviHlD2KtWqxIOh3X9+sWOihCABhwMBnaGbPLvcrvdbKUYNVCOeTsAPt/npjo74L+oxOlN+QU8Bnvq+QJwZQAAAABJRU5ErkJggg=='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together" + title="A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together" + src="/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png" + srcset="/static/91c27021f2bed77637541330d58cb36b/c26ae/subject-indexing-with-uris.png 158w, +/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png 221w" + sizes="(max-width: 221px) 100vw, 221px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">A diagram with three resources (an OER, a subject and a classification), each identified by a URI and linked together</figcaption> + </figure></p> +<h3>Web-based subscriptions and notifications</h3> +<p>So, HTTP URIs for resources and subject are important to transparently publish and thereafter identify and link educational resources, controlled vocabularies and subject on the web. But with URIs as the basic requirement in place, we also get the possibility to utilize further web standards for the discovery of OER. For SkoHub, we make use of <a href="https://www.w3.org/TR/social-web-protocols/">Social Web Protocols</a> to build an infrastructure where services can send and subscribe to notifications for subject. The general setup looks as follows:</p> +<ol> +<li>Every element of a controlled vocabulary gets an inbox, identified by a URL.</li> +</ol> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 479px; " + > + <a + class="gatsby-resp-image-link" + href="/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABCElEQVQoz5WSaaqEQAyEvf/JFG/gf/ddcV/y+AIZfMKg01B0JyRFqtJOWZZSFIXkeS72truua2maRvZ9F855nvJ0HIiyLJM4jiVNU70h5A3ZMAyybdt7wnEctYm773vpuk4sB8gZEfcTnCt7FEU62f1cGx4nnKZJlmWRdV3Vt6qqVOI8z5/Jr8TkqKUHUEdMnlglMxneJUmifoZhqDHLYDH43Lat5sxvak0R9dRA6thkNDIdoIkbQvOVYpYErM5+BCDPcDqhjW0TXCVjyV2ySTUQwwPHv6UY4belvDkOkvAHWeD+RspxHO+/DU3mh/nDG7ORDpDy+mP7vi+e54nruh8QG4Ig+En2H385ocIb7HZiAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together" + title="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together" + src="/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png" + srcset="/static/7348d68aaa1145cecf691f6ae17749ca/c26ae/subject-indexing-with-uris-and-inbox.png 158w, +/static/7348d68aaa1145cecf691f6ae17749ca/6bdcf/subject-indexing-with-uris-and-inbox.png 315w, +/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png 479w" + sizes="(max-width: 479px) 100vw, 479px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together</figcaption> + </figure> +2. Systems can send notifications to the inbox, for example “This is a new resource about this subject”. +<figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 479px; " + > + <a + class="gatsby-resp-image-link" + href="/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 60.75949367088608%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABO0lEQVQoz4WSyQrDMAxE/f9fmENOIfu+74nLU1EwpaUCIXssy6OxTNu2dlkWO02Tnef5cd0Pw2DXdbWu3fctdzSXNRhm6rq2WZaJJ0nyrIuikEjhqqok4mma2q7rxMMwtHEc23EcZX8cx7sgG5i6se97iSTjMLiuSy7BGOY4eZyDkWO2bZMkHOowgMl5noLt+y6FtFXXKEKua4YiHHCRl3zfl1eViasPRh66EekGachVzECbS0TVgsieJIqqPqybpnlkUHk0HyLSMpsoiuRT8jyXGASB4BgylGX5nMOKNR/Cx3EXjHzDizoCRA7QRTGSeFQNNp8jpmMmBdGHdhAe0PM8OXBx/RB1sG8uv0zfMEAf1YgXFYORMvz85W9mEJU2cfRhLonoBuaOhsvylxsY6BC7w42DMwpuwX8MXzdZojR43FRZAAAAAElFTkSuQmCC'); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox" + title="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox" + src="/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png" + srcset="/static/bab82f631204dc5c42b2e30c8705c217/c26ae/sending-notification.png 158w, +/static/bab82f631204dc5c42b2e30c8705c217/6bdcf/sending-notification.png 315w, +/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png 479w" + sizes="(max-width: 479px) 100vw, 479px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox</figcaption> + </figure> +3. Systems can subscribe to a subject’s inbox and will directly receive a notification as soon as it is received (push approach). +<figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 479px; " + > + <a + class="gatsby-resp-image-link" + href="/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 62.0253164556962%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABUklEQVQoz22TjY6CQAyEef8XNCSaAIoIKAgqCIi9fE2G7F2uSdMy25/Zbom6rrP3+23jOP6rwzC4Iuu6ui7LYs/nczt7vV6OIVHTNHY+n60oCsvzfPOrqnJL4vV6dYteLhe73+8GkePx6DkUBKNo1LatAwRjH4/H5qsITEMhkXPd4BdDXQHLYZZlXkT45/Ox7/e7aSgUhEAoEQAH0zR5wTRNPWieZ8dVXMK8iSOe29V17bFiHIkys2QO0tvt5jgM5TM35omlmHLwsRDxgho23Ugoy9IfhwDYgasJ51geDeWbXDAv2Pe9X0OrQyHYcCVdWQPX3DQizmCr8ZAXhcMHiOPYaBLiSPgo4PgwgwA+Rf1RwsXGarjSv2ujlYIhlubynSEAndRNC306nRzTC0ogoHNWbLfbWZIknuczJAAHpXioYNoCif4Sih4OB9vv996YePAfLLqchdSPdjkAAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox" + title="A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox" + src="/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png" + srcset="/static/1f4f72b3e6e880fe043b2587a7b99a98/c26ae/pushing-notification.png 158w, +/static/1f4f72b3e6e880fe043b2587a7b99a98/6bdcf/pushing-notification.png 315w, +/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png 479w" + sizes="(max-width: 479px) 100vw, 479px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">A diagram with four resources (an OER, a subject, an inbox, a classification), each identified by a URI and linked together plus a notification being sent from the OER to the suject&#39;s inbox</figcaption> + </figure></p> +<p>This infrastructure allows applications</p> +<ol> +<li>to send a notification to a subject’s inbox containing information about and a link to new content about this subject</li> +<li>to subscribe to the inbox of a subject from a knowledge organization system in order to receive push updates about new content in real time.</li> +</ol> +<p>Here is an example: a teacher is interested in new resources about environmental subjects. She subscribes to the subject via a controlled vocabulary like <a href="https://unesdoc.unesco.org/ark:/48223/pf0000235049">ISCED-2013 Fields of Education and Training</a>. She then receives updates whenever a colleague publishes a resource that is linked to the subject.</p> +<p><figure class="gatsby-resp-image-figure" style=""> + <span + class="gatsby-resp-image-wrapper" + style="position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 321px; " + > + <a + class="gatsby-resp-image-link" + href="/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png" + style="display: block" + target="_blank" + rel="noopener" + > + <span + class="gatsby-resp-image-background-image" + style="padding-bottom: 93.67088607594937%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACYElEQVQ4y5VUS0tyURQ9v9aZJOjYJoJjKQMlZw5sEiaiFYRaIaWGpkg+KHtoia9INJ+5Ym04fVdJ4ztwuN59t+usvdY+Wy0WC3BzxWIxHB4eIhQK4eDgAM/PzxL/+vqCXjp3Mpng4eEBT09P8my1WhJXOuH4+BgXFxfy2+12Y3d3F+l0Wt7n8zn0wRq8Xq8jHo/j9fVVtt1uRzgchuLHaDT6A/b4+IizszPkcjnc3NwssTKut7c33N/f/7yfnp4KqGKZyWRSgkzQv/k8Pz/H+/s7Pj4+BIC72+3i8/MT5XIZpVIJzWYT+Xwe/X5fmCqfz4fZbIaXlxdcX18L2OXlJU5OTqTUwWAgz16vJzqNRiPJob4EzGazODo6QiaTQaVSgep0Otjf318CowR/LbKhGSSSSqXkABqktB7BYFBcphZat9+2NoWlUutqtSosKRdNUixHJ2hmxlZaNUS/E5gy0O2rqyuwUuqrjEkMagZG0NW1GqcHegkgheZJ1KPRaGA4HG5kaGzuWq0m5pAM40qXS1PYe4lEQsTexFLHptOp6E9QttYPQ1Lmx3a7Lady/0/Zxnxl/ED7yXbd7fit7PF4jEKhAG2u0iZQu+3tbTgcDtFjHcPV9uH93drakuZeAmRT2mw2WCwW6S3dGuvaRjMKBAIwmUwyTJamDQEjkYg0tr5ef+nHPF45jrxisfjPlNvbW5jNZuzs7MDj8cDr9a7tOaMMzLVarfD7/XA6nTKdlB6se3t7kkBQDgz24qabwunCGcDN/7pcLplOSmvFcXR3dyfzcB3YKijNY6m8x+xd4nwDrPiBhn1BUk4AAAAASUVORK5CYII='); background-size: cover; display: block;" + ></span> + <img + class="gatsby-resp-image-image" + alt="A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource." + title="A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource." + src="/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png" + srcset="/static/09f488bdb6d0d546d1e0c74279c53e8d/c26ae/pubsub.png 158w, +/static/09f488bdb6d0d546d1e0c74279c53e8d/6bdcf/pubsub.png 315w, +/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png 321w" + sizes="(max-width: 321px) 100vw, 321px" + style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" + loading="lazy" + decoding="async" + /> + </a> + </span> + <figcaption class="gatsby-resp-image-figcaption">A diagram with Teacher A subscribing to a subject tag that a document published by Teacher B is about, thus receiving notifications about the new resource.</figcaption> + </figure></p> +<p>To be really useful, applications for subscribing to content should enable additional filters, to subscribe to combinations of subjects (e.g. “Environment” &#x26; “Building and civil engineering”) or to add addtional filters on educational level, license type etc.</p> +<h2>Advantages</h2> +<p>This subject-oriented notification/subscription approach to content syndication on the web has many advantages.</p> +<p><strong>Push instead of pull</strong> +<br /> +With the push approach, you subscribe once and content is coming from different and new sources without the subscriber having to maintain a list of sources. Of course quality control might become an issue. Thus, instead of whitelisting by administering a subscription list one would practice blacklisting by filtering out sources that distribute spam or provide low-quality content.</p> +<p><strong>Supporting web-wide publications</strong></p> +<p>Being of the web, SkoHub supports publications residing anywhere on the web. While the repository-centric approach favours content in a repository that provides interfaces for harvesting, with SkoHub any web resource can make use of the notification mechanism. Thus, content producers can choose which tool or platform best fits their publishing needs, be it YouTube, a repository, hackmd.io or else. The only requirement is for publications to have a stable URL and, voilà, they can syndicate their content via KOS.</p> +<p><strong>Knowledge organization systems are used to their full potential</strong> +<br /> +This additional layer to the use of Knowledge Organization Systems makes them much more powerful (“KOS on steroids”) and attractive for potential users.</p> +<p><strong>Encouraging creation and use of shared Knowledge Organization Systems across applications</strong> +<br /> +In the German OER context it is a recurring theme that people are wishing everybody would use the same controlled vocabularies so that data exchange and aggregation required less mapping. With a SkoHub infrastructure in place, there are big additional incentives on going forward in this direction.</p> +<p><strong>Incentive for content producers to add machine-readable descriptions</strong> +<br /> +When subject indexing becomes tantamount with notifying interested parties about one’s resources, this means a huge incentive for content producers to describe their resources with structured data doing subject indexing.</p> +<h2>SkoHub project scope</h2> +<p>The SkoHub project has four deliverables. While working on the backend infrastructure for receiving and pushing notifications (skohub-pubsub), we also want to provide people with means to publish a controlled vocabulary along with inboxes (skohub-ssg), to link to subjects and send notifications (skohub-editor) and to subscribe to notifications in the browser (skohub-deck).</p> +<p><strong>skohub-pubsub: Inboxes and subscriptions</strong> +<br /> +Code: <a href="https://github.com/hbz/skohub-pubsub">https://github.com/hbz/skohub-pubsub</a> +<br /> +This part provides the SkoHub core infrastructure, setting up basic inboxes for subjects plus the ability of subscribing to push subscriptions for each new notification.</p> +<p><strong>skohub-ssg: Static site generator for Simple Knowledge Organization Systems</strong> +<br /> +Code: <a href="https://github.com/hbz/skohub-ssg">https://github.com/hbz/skohub-ssg</a> +<br /> +This part of the project covers the need to easily publish a controlled vocabulary as a SKOS file, with a basic lookup API and a nice HTML view including links to an inbox for each subject.</p> +<p><strong>skohub-editor: Describing &#x26; linking learning resources, sending notifications</strong> +<br /> +Code: <a href="https://github.com/hbz/skohub-editor">https://github.com/hbz/skohub-editor</a> +<br /> +The editor will run in the browser and enable structured description of educational resources published anywhere on the web. It includes validation of the entered content for each field and lookup of controlled values via the API provided by skohub-ssg.</p> +<p><strong>skohub-deck: Browser-based subscription to subjects</strong> +<br /> +Code: <a href="https://github.com/hbz/skohub-deck">https://github.com/hbz/skohub-deck</a> +<br /> +The SkoHub deck is a proof of concept to show that the technologies developed actually work. It enables people to subscribe to notifications for specific subjects in the browser. The incoming notifications will be shown in a Tweetdeck-like interface.</p> +<h2>Outlook</h2> +<p>The project will be completed by end of 2019. We intend to provide updates about the process during the way. Next up, we will explain the technical architecture in more detail, expanding on our use of social web protocols. Furthermore, we will provide updates on the development status of the project.</p> +<hr> +<p>*<small> Note that while SkoHub has clear similarities with the “Information-Sharing Pipeline” envisioned in Ilik and Koster 2019 regarding the use of social web protocols on authority data, there is also a fundamental difference: While Ilik and Koster are talking about sharing <em>updates</em> of authority entries themselves (e.g. receiving updates for a person profile to be considered for inclusion in one’s own authority file), SkoHub is about sharing new <em>links</em> to an entry in an authority file or other controlled vocabulary.</small></p> +<h2>References</h2> +<p>de Sompel, Herbert Van / Nelson, Michael L. (2015): Reminiscing About 15 Years of Interoperability Efforts. D-Lib Magazine 21 , no. 11/12. DOI: <a href="https://doi.org/10.1045/november2015-vandesompel">10.1045/november2015-vandesompel</a></p> +<p>Ilik, Violeta / Koster, Lukas (2019): Information-Sharing Pipeline, The Serials Librarian, DOI: <a href="https://doi.org/10.1080/0361526X.2019.1583045">10.1080/0361526X.2019.1583045</a>. Preprint: <a href="https://doi.org/10.31219/osf.io/hbwf8">https://doi.org/10.31219/osf.io/hbwf8</a></p> \ No newline at end of file diff --git a/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png b/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png new file mode 100644 index 0000000..2e1c64b Binary files /dev/null and b/static/09b20404ba79837614549b8eb52ee6d1/092ed/repo-approach.png differ diff --git a/static/09b20404ba79837614549b8eb52ee6d1/6bdcf/repo-approach.png b/static/09b20404ba79837614549b8eb52ee6d1/6bdcf/repo-approach.png new file mode 100644 index 0000000..c45db98 Binary files /dev/null and b/static/09b20404ba79837614549b8eb52ee6d1/6bdcf/repo-approach.png differ diff --git a/static/09b20404ba79837614549b8eb52ee6d1/c26ae/repo-approach.png b/static/09b20404ba79837614549b8eb52ee6d1/c26ae/repo-approach.png new file mode 100644 index 0000000..90d3c8f Binary files /dev/null and b/static/09b20404ba79837614549b8eb52ee6d1/c26ae/repo-approach.png differ diff --git a/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png b/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png new file mode 100644 index 0000000..831a3c1 Binary files /dev/null and b/static/09f488bdb6d0d546d1e0c74279c53e8d/30592/pubsub.png differ diff --git a/static/09f488bdb6d0d546d1e0c74279c53e8d/6bdcf/pubsub.png b/static/09f488bdb6d0d546d1e0c74279c53e8d/6bdcf/pubsub.png new file mode 100644 index 0000000..00e4dd7 Binary files /dev/null and b/static/09f488bdb6d0d546d1e0c74279c53e8d/6bdcf/pubsub.png differ diff --git a/static/09f488bdb6d0d546d1e0c74279c53e8d/c26ae/pubsub.png b/static/09f488bdb6d0d546d1e0c74279c53e8d/c26ae/pubsub.png new file mode 100644 index 0000000..57969bd Binary files /dev/null and b/static/09f488bdb6d0d546d1e0c74279c53e8d/c26ae/pubsub.png differ diff --git a/static/0c9af9bcdba57992a010aab21454ead2/6bdcf/configure-extension.png b/static/0c9af9bcdba57992a010aab21454ead2/6bdcf/configure-extension.png new file mode 100644 index 0000000..965027a Binary files /dev/null and b/static/0c9af9bcdba57992a010aab21454ead2/6bdcf/configure-extension.png differ diff --git a/static/0c9af9bcdba57992a010aab21454ead2/c26ae/configure-extension.png b/static/0c9af9bcdba57992a010aab21454ead2/c26ae/configure-extension.png new file mode 100644 index 0000000..923eb9c Binary files /dev/null and b/static/0c9af9bcdba57992a010aab21454ead2/c26ae/configure-extension.png differ diff --git a/static/0c9af9bcdba57992a010aab21454ead2/c391c/configure-extension.png b/static/0c9af9bcdba57992a010aab21454ead2/c391c/configure-extension.png new file mode 100644 index 0000000..2f132fc Binary files /dev/null and b/static/0c9af9bcdba57992a010aab21454ead2/c391c/configure-extension.png differ diff --git a/static/0c9af9bcdba57992a010aab21454ead2/f058b/configure-extension.png b/static/0c9af9bcdba57992a010aab21454ead2/f058b/configure-extension.png new file mode 100644 index 0000000..62b7ff0 Binary files /dev/null and b/static/0c9af9bcdba57992a010aab21454ead2/f058b/configure-extension.png differ diff --git a/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png b/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png new file mode 100644 index 0000000..fb297cd Binary files /dev/null and b/static/158048ebfeeb80ac9314a6beda41e5d6/3c5de/toot.png differ diff --git a/static/158048ebfeeb80ac9314a6beda41e5d6/6bdcf/toot.png b/static/158048ebfeeb80ac9314a6beda41e5d6/6bdcf/toot.png new file mode 100644 index 0000000..9069c2a Binary files /dev/null and b/static/158048ebfeeb80ac9314a6beda41e5d6/6bdcf/toot.png differ diff --git a/static/158048ebfeeb80ac9314a6beda41e5d6/c26ae/toot.png b/static/158048ebfeeb80ac9314a6beda41e5d6/c26ae/toot.png new file mode 100644 index 0000000..65fd5b4 Binary files /dev/null and b/static/158048ebfeeb80ac9314a6beda41e5d6/c26ae/toot.png differ diff --git a/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png b/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png new file mode 100644 index 0000000..e1f4ffe Binary files /dev/null and b/static/15d14a94c2569955b4f41228f46ab1ec/0b533/skohub-ssg-filter.png differ diff --git a/static/15d14a94c2569955b4f41228f46ab1ec/6bdcf/skohub-ssg-filter.png b/static/15d14a94c2569955b4f41228f46ab1ec/6bdcf/skohub-ssg-filter.png new file mode 100644 index 0000000..da6b133 Binary files /dev/null and b/static/15d14a94c2569955b4f41228f46ab1ec/6bdcf/skohub-ssg-filter.png differ diff --git a/static/15d14a94c2569955b4f41228f46ab1ec/c26ae/skohub-ssg-filter.png b/static/15d14a94c2569955b4f41228f46ab1ec/c26ae/skohub-ssg-filter.png new file mode 100644 index 0000000..cd73520 Binary files /dev/null and b/static/15d14a94c2569955b4f41228f46ab1ec/c26ae/skohub-ssg-filter.png differ diff --git a/static/1ba989cdd764d0e20d0886cbee808596/47ff6/or2.png b/static/1ba989cdd764d0e20d0886cbee808596/47ff6/or2.png new file mode 100644 index 0000000..ffacca6 Binary files /dev/null and b/static/1ba989cdd764d0e20d0886cbee808596/47ff6/or2.png differ diff --git a/static/1ba989cdd764d0e20d0886cbee808596/6bdcf/or2.png b/static/1ba989cdd764d0e20d0886cbee808596/6bdcf/or2.png new file mode 100644 index 0000000..2598089 Binary files /dev/null and b/static/1ba989cdd764d0e20d0886cbee808596/6bdcf/or2.png differ diff --git a/static/1ba989cdd764d0e20d0886cbee808596/c26ae/or2.png b/static/1ba989cdd764d0e20d0886cbee808596/c26ae/or2.png new file mode 100644 index 0000000..3da027f Binary files /dev/null and b/static/1ba989cdd764d0e20d0886cbee808596/c26ae/or2.png differ diff --git a/static/1ba989cdd764d0e20d0886cbee808596/f058b/or2.png b/static/1ba989cdd764d0e20d0886cbee808596/f058b/or2.png new file mode 100644 index 0000000..54a4041 Binary files /dev/null and b/static/1ba989cdd764d0e20d0886cbee808596/f058b/or2.png differ diff --git a/static/1f4f72b3e6e880fe043b2587a7b99a98/6bdcf/pushing-notification.png b/static/1f4f72b3e6e880fe043b2587a7b99a98/6bdcf/pushing-notification.png new file mode 100644 index 0000000..7911fba Binary files /dev/null and b/static/1f4f72b3e6e880fe043b2587a7b99a98/6bdcf/pushing-notification.png differ diff --git a/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png b/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png new file mode 100644 index 0000000..e42af9b Binary files /dev/null and b/static/1f4f72b3e6e880fe043b2587a7b99a98/a9b70/pushing-notification.png differ diff --git a/static/1f4f72b3e6e880fe043b2587a7b99a98/c26ae/pushing-notification.png b/static/1f4f72b3e6e880fe043b2587a7b99a98/c26ae/pushing-notification.png new file mode 100644 index 0000000..dc4a738 Binary files /dev/null and b/static/1f4f72b3e6e880fe043b2587a7b99a98/c26ae/pushing-notification.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/29114/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/29114/slides.png new file mode 100644 index 0000000..1465778 Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/29114/slides.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/40601/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/40601/slides.png new file mode 100644 index 0000000..c4e0e91 Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/40601/slides.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/6bdcf/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/6bdcf/slides.png new file mode 100644 index 0000000..fb1aa29 Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/6bdcf/slides.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/78612/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/78612/slides.png new file mode 100644 index 0000000..d375b5b Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/78612/slides.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/c26ae/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/c26ae/slides.png new file mode 100644 index 0000000..6b3f3e3 Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/c26ae/slides.png differ diff --git a/static/23e9cd5c100418dc7d1c27eed6901f62/f058b/slides.png b/static/23e9cd5c100418dc7d1c27eed6901f62/f058b/slides.png new file mode 100644 index 0000000..3871cd3 Binary files /dev/null and b/static/23e9cd5c100418dc7d1c27eed6901f62/f058b/slides.png differ diff --git a/static/2b8d11bca715d365580506508d352f7a/63ec5/extension-icon.png b/static/2b8d11bca715d365580506508d352f7a/63ec5/extension-icon.png new file mode 100644 index 0000000..9f595a1 Binary files /dev/null and b/static/2b8d11bca715d365580506508d352f7a/63ec5/extension-icon.png differ diff --git a/static/2b8d11bca715d365580506508d352f7a/6bdcf/extension-icon.png b/static/2b8d11bca715d365580506508d352f7a/6bdcf/extension-icon.png new file mode 100644 index 0000000..be54bb3 Binary files /dev/null and b/static/2b8d11bca715d365580506508d352f7a/6bdcf/extension-icon.png differ diff --git a/static/2b8d11bca715d365580506508d352f7a/c26ae/extension-icon.png b/static/2b8d11bca715d365580506508d352f7a/c26ae/extension-icon.png new file mode 100644 index 0000000..474c7b0 Binary files /dev/null and b/static/2b8d11bca715d365580506508d352f7a/c26ae/extension-icon.png differ diff --git a/static/2b8d11bca715d365580506508d352f7a/f058b/extension-icon.png b/static/2b8d11bca715d365580506508d352f7a/f058b/extension-icon.png new file mode 100644 index 0000000..e3651ac Binary files /dev/null and b/static/2b8d11bca715d365580506508d352f7a/f058b/extension-icon.png differ diff --git a/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png b/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png new file mode 100644 index 0000000..5bfaeda Binary files /dev/null and b/static/3180b8faaa30763f57cf0aeda0f8a2e3/6f3f2/shacl-logo.png differ diff --git a/static/3180b8faaa30763f57cf0aeda0f8a2e3/c26ae/shacl-logo.png b/static/3180b8faaa30763f57cf0aeda0f8a2e3/c26ae/shacl-logo.png new file mode 100644 index 0000000..293e44e Binary files /dev/null and b/static/3180b8faaa30763f57cf0aeda0f8a2e3/c26ae/shacl-logo.png differ diff --git a/static/3400dd15c8f9dd3db28fa4ee867fedff/42d54/or5.png b/static/3400dd15c8f9dd3db28fa4ee867fedff/42d54/or5.png new file mode 100644 index 0000000..b6ee4db Binary files /dev/null and b/static/3400dd15c8f9dd3db28fa4ee867fedff/42d54/or5.png differ diff --git a/static/3400dd15c8f9dd3db28fa4ee867fedff/6bdcf/or5.png b/static/3400dd15c8f9dd3db28fa4ee867fedff/6bdcf/or5.png new file mode 100644 index 0000000..c17fdcb Binary files /dev/null and b/static/3400dd15c8f9dd3db28fa4ee867fedff/6bdcf/or5.png differ diff --git a/static/3400dd15c8f9dd3db28fa4ee867fedff/c26ae/or5.png b/static/3400dd15c8f9dd3db28fa4ee867fedff/c26ae/or5.png new file mode 100644 index 0000000..bbab16a Binary files /dev/null and b/static/3400dd15c8f9dd3db28fa4ee867fedff/c26ae/or5.png differ diff --git a/static/3400dd15c8f9dd3db28fa4ee867fedff/f058b/or5.png b/static/3400dd15c8f9dd3db28fa4ee867fedff/f058b/or5.png new file mode 100644 index 0000000..f7269d8 Binary files /dev/null and b/static/3400dd15c8f9dd3db28fa4ee867fedff/f058b/or5.png differ diff --git a/static/34c8419d626f86c2e8a6f15ce75998a4/6bdcf/use_gh_pages_website.png b/static/34c8419d626f86c2e8a6f15ce75998a4/6bdcf/use_gh_pages_website.png new file mode 100644 index 0000000..ecb7fc1 Binary files /dev/null and b/static/34c8419d626f86c2e8a6f15ce75998a4/6bdcf/use_gh_pages_website.png differ diff --git a/static/34c8419d626f86c2e8a6f15ce75998a4/c26ae/use_gh_pages_website.png b/static/34c8419d626f86c2e8a6f15ce75998a4/c26ae/use_gh_pages_website.png new file mode 100644 index 0000000..f20d463 Binary files /dev/null and b/static/34c8419d626f86c2e8a6f15ce75998a4/c26ae/use_gh_pages_website.png differ diff --git a/static/34c8419d626f86c2e8a6f15ce75998a4/f058b/use_gh_pages_website.png b/static/34c8419d626f86c2e8a6f15ce75998a4/f058b/use_gh_pages_website.png new file mode 100644 index 0000000..9ff3472 Binary files /dev/null and b/static/34c8419d626f86c2e8a6f15ce75998a4/f058b/use_gh_pages_website.png differ diff --git a/static/34c8419d626f86c2e8a6f15ce75998a4/f0685/use_gh_pages_website.png b/static/34c8419d626f86c2e8a6f15ce75998a4/f0685/use_gh_pages_website.png new file mode 100644 index 0000000..0187427 Binary files /dev/null and b/static/34c8419d626f86c2e8a6f15ce75998a4/f0685/use_gh_pages_website.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/40601/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/40601/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..bd951fd Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/40601/skohub-vocabs-screenshot.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/6bdcf/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/6bdcf/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..42d6528 Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/6bdcf/skohub-vocabs-screenshot.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/78612/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/78612/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..54598d8 Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/78612/skohub-vocabs-screenshot.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/b880f/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/b880f/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..43b288b Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/b880f/skohub-vocabs-screenshot.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/c26ae/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/c26ae/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..fedee64 Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/c26ae/skohub-vocabs-screenshot.png differ diff --git a/static/384b141891ff0a44d576e0792c5562e3/f058b/skohub-vocabs-screenshot.png b/static/384b141891ff0a44d576e0792c5562e3/f058b/skohub-vocabs-screenshot.png new file mode 100644 index 0000000..a6654f5 Binary files /dev/null and b/static/384b141891ff0a44d576e0792c5562e3/f058b/skohub-vocabs-screenshot.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/29114/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/29114/describing.png new file mode 100644 index 0000000..974a4ed Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/29114/describing.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/40601/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/40601/describing.png new file mode 100644 index 0000000..6e7f381 Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/40601/describing.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/6bdcf/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/6bdcf/describing.png new file mode 100644 index 0000000..df4bfd8 Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/6bdcf/describing.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/78612/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/78612/describing.png new file mode 100644 index 0000000..3a7f650 Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/78612/describing.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/c26ae/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/c26ae/describing.png new file mode 100644 index 0000000..730a47d Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/c26ae/describing.png differ diff --git a/static/492b5e6e95c98c3719cf62258f6ff200/f058b/describing.png b/static/492b5e6e95c98c3719cf62258f6ff200/f058b/describing.png new file mode 100644 index 0000000..3bbf1d5 Binary files /dev/null and b/static/492b5e6e95c98c3719cf62258f6ff200/f058b/describing.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/3c492/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/3c492/upload-success.png new file mode 100644 index 0000000..239c788 Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/3c492/upload-success.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/40601/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/40601/upload-success.png new file mode 100644 index 0000000..fa02189 Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/40601/upload-success.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/6bdcf/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/6bdcf/upload-success.png new file mode 100644 index 0000000..85ee36a Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/6bdcf/upload-success.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/78612/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/78612/upload-success.png new file mode 100644 index 0000000..8083746 Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/78612/upload-success.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/c26ae/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/c26ae/upload-success.png new file mode 100644 index 0000000..382adc9 Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/c26ae/upload-success.png differ diff --git a/static/4972457dc61a693775b415a5d0d30d8b/f058b/upload-success.png b/static/4972457dc61a693775b415a5d0d30d8b/f058b/upload-success.png new file mode 100644 index 0000000..98e5823 Binary files /dev/null and b/static/4972457dc61a693775b415a5d0d30d8b/f058b/upload-success.png differ diff --git a/static/4bae802167f80dcb59a36f4d3ec553ed/40601/activate_action.png b/static/4bae802167f80dcb59a36f4d3ec553ed/40601/activate_action.png new file mode 100644 index 0000000..5dfd30c Binary files /dev/null and b/static/4bae802167f80dcb59a36f4d3ec553ed/40601/activate_action.png differ diff --git a/static/4bae802167f80dcb59a36f4d3ec553ed/6bdcf/activate_action.png b/static/4bae802167f80dcb59a36f4d3ec553ed/6bdcf/activate_action.png new file mode 100644 index 0000000..1361668 Binary files /dev/null and b/static/4bae802167f80dcb59a36f4d3ec553ed/6bdcf/activate_action.png differ diff --git a/static/4bae802167f80dcb59a36f4d3ec553ed/c26ae/activate_action.png b/static/4bae802167f80dcb59a36f4d3ec553ed/c26ae/activate_action.png new file mode 100644 index 0000000..fc38aba Binary files /dev/null and b/static/4bae802167f80dcb59a36f4d3ec553ed/c26ae/activate_action.png differ diff --git a/static/4bae802167f80dcb59a36f4d3ec553ed/ecf19/activate_action.png b/static/4bae802167f80dcb59a36f4d3ec553ed/ecf19/activate_action.png new file mode 100644 index 0000000..6a422aa Binary files /dev/null and b/static/4bae802167f80dcb59a36f4d3ec553ed/ecf19/activate_action.png differ diff --git a/static/4bae802167f80dcb59a36f4d3ec553ed/f058b/activate_action.png b/static/4bae802167f80dcb59a36f4d3ec553ed/f058b/activate_action.png new file mode 100644 index 0000000..26e14b9 Binary files /dev/null and b/static/4bae802167f80dcb59a36f4d3ec553ed/f058b/activate_action.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/29114/slides.png b/static/5617f981b723e476e73f28ec316dd720/29114/slides.png new file mode 100644 index 0000000..61ea9ab Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/29114/slides.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/40601/slides.png b/static/5617f981b723e476e73f28ec316dd720/40601/slides.png new file mode 100644 index 0000000..a55a849 Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/40601/slides.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/6bdcf/slides.png b/static/5617f981b723e476e73f28ec316dd720/6bdcf/slides.png new file mode 100644 index 0000000..3596648 Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/6bdcf/slides.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/78612/slides.png b/static/5617f981b723e476e73f28ec316dd720/78612/slides.png new file mode 100644 index 0000000..caf9e52 Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/78612/slides.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/c26ae/slides.png b/static/5617f981b723e476e73f28ec316dd720/c26ae/slides.png new file mode 100644 index 0000000..be603ac Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/c26ae/slides.png differ diff --git a/static/5617f981b723e476e73f28ec316dd720/f058b/slides.png b/static/5617f981b723e476e73f28ec316dd720/f058b/slides.png new file mode 100644 index 0000000..7d85a8e Binary files /dev/null and b/static/5617f981b723e476e73f28ec316dd720/f058b/slides.png differ diff --git a/static/5d638e5a214e95beb550c5ddf028b8fa/01dae/check-webhook-response.png b/static/5d638e5a214e95beb550c5ddf028b8fa/01dae/check-webhook-response.png new file mode 100644 index 0000000..70592e1 Binary files /dev/null and b/static/5d638e5a214e95beb550c5ddf028b8fa/01dae/check-webhook-response.png differ diff --git a/static/5d638e5a214e95beb550c5ddf028b8fa/6bdcf/check-webhook-response.png b/static/5d638e5a214e95beb550c5ddf028b8fa/6bdcf/check-webhook-response.png new file mode 100644 index 0000000..e35b5fe Binary files /dev/null and b/static/5d638e5a214e95beb550c5ddf028b8fa/6bdcf/check-webhook-response.png differ diff --git a/static/5d638e5a214e95beb550c5ddf028b8fa/c26ae/check-webhook-response.png b/static/5d638e5a214e95beb550c5ddf028b8fa/c26ae/check-webhook-response.png new file mode 100644 index 0000000..7ac8039 Binary files /dev/null and b/static/5d638e5a214e95beb550c5ddf028b8fa/c26ae/check-webhook-response.png differ diff --git a/static/5d638e5a214e95beb550c5ddf028b8fa/f058b/check-webhook-response.png b/static/5d638e5a214e95beb550c5ddf028b8fa/f058b/check-webhook-response.png new file mode 100644 index 0000000..5186108 Binary files /dev/null and b/static/5d638e5a214e95beb550c5ddf028b8fa/f058b/check-webhook-response.png differ diff --git a/static/6417112bfbd5cb40999e9ce1d97b7b82/6bdcf/auto-suggestion-from-skos-vocab.png b/static/6417112bfbd5cb40999e9ce1d97b7b82/6bdcf/auto-suggestion-from-skos-vocab.png new file mode 100644 index 0000000..5a4b78a Binary files /dev/null and b/static/6417112bfbd5cb40999e9ce1d97b7b82/6bdcf/auto-suggestion-from-skos-vocab.png differ diff --git a/static/6417112bfbd5cb40999e9ce1d97b7b82/c26ae/auto-suggestion-from-skos-vocab.png b/static/6417112bfbd5cb40999e9ce1d97b7b82/c26ae/auto-suggestion-from-skos-vocab.png new file mode 100644 index 0000000..093a4ea Binary files /dev/null and b/static/6417112bfbd5cb40999e9ce1d97b7b82/c26ae/auto-suggestion-from-skos-vocab.png differ diff --git a/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png b/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png new file mode 100644 index 0000000..c1a2f2c Binary files /dev/null and b/static/6417112bfbd5cb40999e9ce1d97b7b82/f7a31/auto-suggestion-from-skos-vocab.png differ diff --git a/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png b/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png new file mode 100644 index 0000000..9e8e657 Binary files /dev/null and b/static/70707507ae9efdd0f829cba5b111f2fd/4ee7f/json-preview.png differ diff --git a/static/70707507ae9efdd0f829cba5b111f2fd/6bdcf/json-preview.png b/static/70707507ae9efdd0f829cba5b111f2fd/6bdcf/json-preview.png new file mode 100644 index 0000000..e7ad270 Binary files /dev/null and b/static/70707507ae9efdd0f829cba5b111f2fd/6bdcf/json-preview.png differ diff --git a/static/70707507ae9efdd0f829cba5b111f2fd/c26ae/json-preview.png b/static/70707507ae9efdd0f829cba5b111f2fd/c26ae/json-preview.png new file mode 100644 index 0000000..566656d Binary files /dev/null and b/static/70707507ae9efdd0f829cba5b111f2fd/c26ae/json-preview.png differ diff --git a/static/7348d68aaa1145cecf691f6ae17749ca/6bdcf/subject-indexing-with-uris-and-inbox.png b/static/7348d68aaa1145cecf691f6ae17749ca/6bdcf/subject-indexing-with-uris-and-inbox.png new file mode 100644 index 0000000..b9000a0 Binary files /dev/null and b/static/7348d68aaa1145cecf691f6ae17749ca/6bdcf/subject-indexing-with-uris-and-inbox.png differ diff --git a/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png b/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png new file mode 100644 index 0000000..ef3b750 Binary files /dev/null and b/static/7348d68aaa1145cecf691f6ae17749ca/a9b70/subject-indexing-with-uris-and-inbox.png differ diff --git a/static/7348d68aaa1145cecf691f6ae17749ca/c26ae/subject-indexing-with-uris-and-inbox.png b/static/7348d68aaa1145cecf691f6ae17749ca/c26ae/subject-indexing-with-uris-and-inbox.png new file mode 100644 index 0000000..a784630 Binary files /dev/null and b/static/7348d68aaa1145cecf691f6ae17749ca/c26ae/subject-indexing-with-uris-and-inbox.png differ diff --git a/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png b/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png new file mode 100644 index 0000000..466f423 Binary files /dev/null and b/static/7ac0ab406412da9d354db3ca10b81ac9/b1a44/subscribe.png differ diff --git a/static/7ac0ab406412da9d354db3ca10b81ac9/c26ae/subscribe.png b/static/7ac0ab406412da9d354db3ca10b81ac9/c26ae/subscribe.png new file mode 100644 index 0000000..153d211 Binary files /dev/null and b/static/7ac0ab406412da9d354db3ca10b81ac9/c26ae/subscribe.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/40601/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/40601/or3.png new file mode 100644 index 0000000..4e0cceb Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/40601/or3.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/6bdcf/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/6bdcf/or3.png new file mode 100644 index 0000000..a886867 Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/6bdcf/or3.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/78612/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/78612/or3.png new file mode 100644 index 0000000..8d028e6 Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/78612/or3.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/c26ae/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/c26ae/or3.png new file mode 100644 index 0000000..9cb5080 Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/c26ae/or3.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/e8e04/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/e8e04/or3.png new file mode 100644 index 0000000..37f34f4 Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/e8e04/or3.png differ diff --git a/static/83b34368b33ec5c1c18d5da66e80c322/f058b/or3.png b/static/83b34368b33ec5c1c18d5da66e80c322/f058b/or3.png new file mode 100644 index 0000000..a786154 Binary files /dev/null and b/static/83b34368b33ec5c1c18d5da66e80c322/f058b/or3.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/1e1c3/concept.png b/static/85426ef69485c8c526778217db5f24f5/1e1c3/concept.png new file mode 100644 index 0000000..7154538 Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/1e1c3/concept.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/40601/concept.png b/static/85426ef69485c8c526778217db5f24f5/40601/concept.png new file mode 100644 index 0000000..59ffe43 Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/40601/concept.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/6bdcf/concept.png b/static/85426ef69485c8c526778217db5f24f5/6bdcf/concept.png new file mode 100644 index 0000000..fdb039e Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/6bdcf/concept.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/78612/concept.png b/static/85426ef69485c8c526778217db5f24f5/78612/concept.png new file mode 100644 index 0000000..f52606f Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/78612/concept.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/c26ae/concept.png b/static/85426ef69485c8c526778217db5f24f5/c26ae/concept.png new file mode 100644 index 0000000..f224740 Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/c26ae/concept.png differ diff --git a/static/85426ef69485c8c526778217db5f24f5/f058b/concept.png b/static/85426ef69485c8c526778217db5f24f5/f058b/concept.png new file mode 100644 index 0000000..66f2831 Binary files /dev/null and b/static/85426ef69485c8c526778217db5f24f5/f058b/concept.png differ diff --git a/static/8650d807e6599370e6b3819a46654b15/38124/add-webhook2.png b/static/8650d807e6599370e6b3819a46654b15/38124/add-webhook2.png new file mode 100644 index 0000000..e45399c Binary files /dev/null and b/static/8650d807e6599370e6b3819a46654b15/38124/add-webhook2.png differ diff --git a/static/8650d807e6599370e6b3819a46654b15/40601/add-webhook2.png b/static/8650d807e6599370e6b3819a46654b15/40601/add-webhook2.png new file mode 100644 index 0000000..45aabf0 Binary files /dev/null and b/static/8650d807e6599370e6b3819a46654b15/40601/add-webhook2.png differ diff --git a/static/8650d807e6599370e6b3819a46654b15/6bdcf/add-webhook2.png b/static/8650d807e6599370e6b3819a46654b15/6bdcf/add-webhook2.png new file mode 100644 index 0000000..17afd20 Binary files /dev/null and b/static/8650d807e6599370e6b3819a46654b15/6bdcf/add-webhook2.png differ diff --git a/static/8650d807e6599370e6b3819a46654b15/c26ae/add-webhook2.png b/static/8650d807e6599370e6b3819a46654b15/c26ae/add-webhook2.png new file mode 100644 index 0000000..0f661e3 Binary files /dev/null and b/static/8650d807e6599370e6b3819a46654b15/c26ae/add-webhook2.png differ diff --git a/static/8650d807e6599370e6b3819a46654b15/f058b/add-webhook2.png b/static/8650d807e6599370e6b3819a46654b15/f058b/add-webhook2.png new file mode 100644 index 0000000..5875998 Binary files /dev/null and b/static/8650d807e6599370e6b3819a46654b15/f058b/add-webhook2.png differ diff --git a/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png b/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png new file mode 100644 index 0000000..4ee065b Binary files /dev/null and b/static/8ee81921b4fd54654268bbb82e704459/0acb4/or1.png differ diff --git a/static/8ee81921b4fd54654268bbb82e704459/6bdcf/or1.png b/static/8ee81921b4fd54654268bbb82e704459/6bdcf/or1.png new file mode 100644 index 0000000..881faf6 Binary files /dev/null and b/static/8ee81921b4fd54654268bbb82e704459/6bdcf/or1.png differ diff --git a/static/8ee81921b4fd54654268bbb82e704459/c26ae/or1.png b/static/8ee81921b4fd54654268bbb82e704459/c26ae/or1.png new file mode 100644 index 0000000..6138c50 Binary files /dev/null and b/static/8ee81921b4fd54654268bbb82e704459/c26ae/or1.png differ diff --git a/static/91c27021f2bed77637541330d58cb36b/c26ae/subject-indexing-with-uris.png b/static/91c27021f2bed77637541330d58cb36b/c26ae/subject-indexing-with-uris.png new file mode 100644 index 0000000..53f6069 Binary files /dev/null and b/static/91c27021f2bed77637541330d58cb36b/c26ae/subject-indexing-with-uris.png differ diff --git a/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png b/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png new file mode 100644 index 0000000..7853050 Binary files /dev/null and b/static/91c27021f2bed77637541330d58cb36b/cccdc/subject-indexing-with-uris.png differ diff --git a/static/a0ad657099e495b1977b78ba0e9879f4/3f3b9/test_coverage.png b/static/a0ad657099e495b1977b78ba0e9879f4/3f3b9/test_coverage.png new file mode 100644 index 0000000..0d9fc56 Binary files /dev/null and b/static/a0ad657099e495b1977b78ba0e9879f4/3f3b9/test_coverage.png differ diff --git a/static/a0ad657099e495b1977b78ba0e9879f4/6bdcf/test_coverage.png b/static/a0ad657099e495b1977b78ba0e9879f4/6bdcf/test_coverage.png new file mode 100644 index 0000000..7310625 Binary files /dev/null and b/static/a0ad657099e495b1977b78ba0e9879f4/6bdcf/test_coverage.png differ diff --git a/static/a0ad657099e495b1977b78ba0e9879f4/c26ae/test_coverage.png b/static/a0ad657099e495b1977b78ba0e9879f4/c26ae/test_coverage.png new file mode 100644 index 0000000..d08e523 Binary files /dev/null and b/static/a0ad657099e495b1977b78ba0e9879f4/c26ae/test_coverage.png differ diff --git a/static/a0ad657099e495b1977b78ba0e9879f4/f058b/test_coverage.png b/static/a0ad657099e495b1977b78ba0e9879f4/f058b/test_coverage.png new file mode 100644 index 0000000..07857da Binary files /dev/null and b/static/a0ad657099e495b1977b78ba0e9879f4/f058b/test_coverage.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/29114/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/29114/fix-error.png new file mode 100644 index 0000000..d1875dd Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/29114/fix-error.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/40601/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/40601/fix-error.png new file mode 100644 index 0000000..e711e4d Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/40601/fix-error.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/6bdcf/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/6bdcf/fix-error.png new file mode 100644 index 0000000..b2cb56a Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/6bdcf/fix-error.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/78612/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/78612/fix-error.png new file mode 100644 index 0000000..c35e893 Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/78612/fix-error.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/c26ae/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/c26ae/fix-error.png new file mode 100644 index 0000000..1135be0 Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/c26ae/fix-error.png differ diff --git a/static/a295ec74a05afd3b5175ce477988c1fb/f058b/fix-error.png b/static/a295ec74a05afd3b5175ce477988c1fb/f058b/fix-error.png new file mode 100644 index 0000000..c739aff Binary files /dev/null and b/static/a295ec74a05afd3b5175ce477988c1fb/f058b/fix-error.png differ diff --git a/static/a2a343d6e0b18eb6e55f81fc6f505d25/40601/kanban.png b/static/a2a343d6e0b18eb6e55f81fc6f505d25/40601/kanban.png new file mode 100644 index 0000000..bce1051 Binary files /dev/null and b/static/a2a343d6e0b18eb6e55f81fc6f505d25/40601/kanban.png differ diff --git a/static/a2a343d6e0b18eb6e55f81fc6f505d25/6bdcf/kanban.png b/static/a2a343d6e0b18eb6e55f81fc6f505d25/6bdcf/kanban.png new file mode 100644 index 0000000..3e80ac7 Binary files /dev/null and b/static/a2a343d6e0b18eb6e55f81fc6f505d25/6bdcf/kanban.png differ diff --git a/static/a2a343d6e0b18eb6e55f81fc6f505d25/c26ae/kanban.png b/static/a2a343d6e0b18eb6e55f81fc6f505d25/c26ae/kanban.png new file mode 100644 index 0000000..d0bf680 Binary files /dev/null and b/static/a2a343d6e0b18eb6e55f81fc6f505d25/c26ae/kanban.png differ diff --git a/static/a2a343d6e0b18eb6e55f81fc6f505d25/d56b5/kanban.png b/static/a2a343d6e0b18eb6e55f81fc6f505d25/d56b5/kanban.png new file mode 100644 index 0000000..00b1ce1 Binary files /dev/null and b/static/a2a343d6e0b18eb6e55f81fc6f505d25/d56b5/kanban.png differ diff --git a/static/a2a343d6e0b18eb6e55f81fc6f505d25/f058b/kanban.png b/static/a2a343d6e0b18eb6e55f81fc6f505d25/f058b/kanban.png new file mode 100644 index 0000000..11a10b8 Binary files /dev/null and b/static/a2a343d6e0b18eb6e55f81fc6f505d25/f058b/kanban.png differ diff --git a/static/a30562938e313d345071b4f50e905510/40601/add-webhook.png b/static/a30562938e313d345071b4f50e905510/40601/add-webhook.png new file mode 100644 index 0000000..f8b15b7 Binary files /dev/null and b/static/a30562938e313d345071b4f50e905510/40601/add-webhook.png differ diff --git a/static/a30562938e313d345071b4f50e905510/6bdcf/add-webhook.png b/static/a30562938e313d345071b4f50e905510/6bdcf/add-webhook.png new file mode 100644 index 0000000..70f0460 Binary files /dev/null and b/static/a30562938e313d345071b4f50e905510/6bdcf/add-webhook.png differ diff --git a/static/a30562938e313d345071b4f50e905510/78597/add-webhook.png b/static/a30562938e313d345071b4f50e905510/78597/add-webhook.png new file mode 100644 index 0000000..3eba4e3 Binary files /dev/null and b/static/a30562938e313d345071b4f50e905510/78597/add-webhook.png differ diff --git a/static/a30562938e313d345071b4f50e905510/c26ae/add-webhook.png b/static/a30562938e313d345071b4f50e905510/c26ae/add-webhook.png new file mode 100644 index 0000000..a4b4278 Binary files /dev/null and b/static/a30562938e313d345071b4f50e905510/c26ae/add-webhook.png differ diff --git a/static/a30562938e313d345071b4f50e905510/f058b/add-webhook.png b/static/a30562938e313d345071b4f50e905510/f058b/add-webhook.png new file mode 100644 index 0000000..70fea8e Binary files /dev/null and b/static/a30562938e313d345071b4f50e905510/f058b/add-webhook.png differ diff --git a/static/b5beefdabbe43f74578e4af6474e861c/6bdcf/create_fork.png b/static/b5beefdabbe43f74578e4af6474e861c/6bdcf/create_fork.png new file mode 100644 index 0000000..710968c Binary files /dev/null and b/static/b5beefdabbe43f74578e4af6474e861c/6bdcf/create_fork.png differ diff --git a/static/b5beefdabbe43f74578e4af6474e861c/c26ae/create_fork.png b/static/b5beefdabbe43f74578e4af6474e861c/c26ae/create_fork.png new file mode 100644 index 0000000..40fac53 Binary files /dev/null and b/static/b5beefdabbe43f74578e4af6474e861c/c26ae/create_fork.png differ diff --git a/static/b5beefdabbe43f74578e4af6474e861c/eb390/create_fork.png b/static/b5beefdabbe43f74578e4af6474e861c/eb390/create_fork.png new file mode 100644 index 0000000..161989e Binary files /dev/null and b/static/b5beefdabbe43f74578e4af6474e861c/eb390/create_fork.png differ diff --git a/static/b5beefdabbe43f74578e4af6474e861c/f058b/create_fork.png b/static/b5beefdabbe43f74578e4af6474e861c/f058b/create_fork.png new file mode 100644 index 0000000..5592187 Binary files /dev/null and b/static/b5beefdabbe43f74578e4af6474e861c/f058b/create_fork.png differ diff --git a/static/b6a6a99907ce6e939473565adc2a5be3/0098c/click_gear_icon.png b/static/b6a6a99907ce6e939473565adc2a5be3/0098c/click_gear_icon.png new file mode 100644 index 0000000..4ab136b Binary files /dev/null and b/static/b6a6a99907ce6e939473565adc2a5be3/0098c/click_gear_icon.png differ diff --git a/static/b6a6a99907ce6e939473565adc2a5be3/6bdcf/click_gear_icon.png b/static/b6a6a99907ce6e939473565adc2a5be3/6bdcf/click_gear_icon.png new file mode 100644 index 0000000..b3ce0c8 Binary files /dev/null and b/static/b6a6a99907ce6e939473565adc2a5be3/6bdcf/click_gear_icon.png differ diff --git a/static/b6a6a99907ce6e939473565adc2a5be3/c26ae/click_gear_icon.png b/static/b6a6a99907ce6e939473565adc2a5be3/c26ae/click_gear_icon.png new file mode 100644 index 0000000..c86d177 Binary files /dev/null and b/static/b6a6a99907ce6e939473565adc2a5be3/c26ae/click_gear_icon.png differ diff --git a/static/b6a6a99907ce6e939473565adc2a5be3/f058b/click_gear_icon.png b/static/b6a6a99907ce6e939473565adc2a5be3/f058b/click_gear_icon.png new file mode 100644 index 0000000..40321e0 Binary files /dev/null and b/static/b6a6a99907ce6e939473565adc2a5be3/f058b/click_gear_icon.png differ diff --git a/static/bab82f631204dc5c42b2e30c8705c217/6bdcf/sending-notification.png b/static/bab82f631204dc5c42b2e30c8705c217/6bdcf/sending-notification.png new file mode 100644 index 0000000..9f98da4 Binary files /dev/null and b/static/bab82f631204dc5c42b2e30c8705c217/6bdcf/sending-notification.png differ diff --git a/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png b/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png new file mode 100644 index 0000000..7794353 Binary files /dev/null and b/static/bab82f631204dc5c42b2e30c8705c217/a9b70/sending-notification.png differ diff --git a/static/bab82f631204dc5c42b2e30c8705c217/c26ae/sending-notification.png b/static/bab82f631204dc5c42b2e30c8705c217/c26ae/sending-notification.png new file mode 100644 index 0000000..753fa13 Binary files /dev/null and b/static/bab82f631204dc5c42b2e30c8705c217/c26ae/sending-notification.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/40601/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/40601/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..a15aaa4 Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/40601/TDD_Global_Lifecycle.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/6bdcf/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/6bdcf/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..18b41be Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/6bdcf/TDD_Global_Lifecycle.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/78612/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/78612/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..89eeaf5 Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/78612/TDD_Global_Lifecycle.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/c26ae/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/c26ae/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..edd1c75 Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/c26ae/TDD_Global_Lifecycle.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/c8551/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/c8551/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..199256b Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/c8551/TDD_Global_Lifecycle.png differ diff --git a/static/bb776e8e9127b9f8b7db84ec085e8e24/f058b/TDD_Global_Lifecycle.png b/static/bb776e8e9127b9f8b7db84ec085e8e24/f058b/TDD_Global_Lifecycle.png new file mode 100644 index 0000000..1d197a4 Binary files /dev/null and b/static/bb776e8e9127b9f8b7db84ec085e8e24/f058b/TDD_Global_Lifecycle.png differ diff --git a/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/6bdcf/or7.png b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/6bdcf/or7.png new file mode 100644 index 0000000..3c0b86b Binary files /dev/null and b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/6bdcf/or7.png differ diff --git a/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png new file mode 100644 index 0000000..edc207d Binary files /dev/null and b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/9f933/or7.png differ diff --git a/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/c26ae/or7.png b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/c26ae/or7.png new file mode 100644 index 0000000..2ea0be1 Binary files /dev/null and b/static/bebfcfbdf5c6b5e0dcff2da7d6a615d4/c26ae/or7.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/29114/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/29114/error-in-build-log.png new file mode 100644 index 0000000..d6c1557 Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/29114/error-in-build-log.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/40601/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/40601/error-in-build-log.png new file mode 100644 index 0000000..98117b7 Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/40601/error-in-build-log.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/6bdcf/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/6bdcf/error-in-build-log.png new file mode 100644 index 0000000..f9ac1c7 Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/6bdcf/error-in-build-log.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/78612/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/78612/error-in-build-log.png new file mode 100644 index 0000000..1dd161b Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/78612/error-in-build-log.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/c26ae/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/c26ae/error-in-build-log.png new file mode 100644 index 0000000..bd3fae2 Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/c26ae/error-in-build-log.png differ diff --git a/static/c0afbbe39292d1e772cf87dc2ac2b4f5/f058b/error-in-build-log.png b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/f058b/error-in-build-log.png new file mode 100644 index 0000000..dbff087 Binary files /dev/null and b/static/c0afbbe39292d1e772cf87dc2ac2b4f5/f058b/error-in-build-log.png differ diff --git a/static/cd12abcd7fdd02842fd5225eab7ceaf2/40601/or6.png b/static/cd12abcd7fdd02842fd5225eab7ceaf2/40601/or6.png new file mode 100644 index 0000000..658116c Binary files /dev/null and b/static/cd12abcd7fdd02842fd5225eab7ceaf2/40601/or6.png differ diff --git a/static/cd12abcd7fdd02842fd5225eab7ceaf2/6bdcf/or6.png b/static/cd12abcd7fdd02842fd5225eab7ceaf2/6bdcf/or6.png new file mode 100644 index 0000000..d4e2ae6 Binary files /dev/null and b/static/cd12abcd7fdd02842fd5225eab7ceaf2/6bdcf/or6.png differ diff --git a/static/cd12abcd7fdd02842fd5225eab7ceaf2/c26ae/or6.png b/static/cd12abcd7fdd02842fd5225eab7ceaf2/c26ae/or6.png new file mode 100644 index 0000000..79b28a3 Binary files /dev/null and b/static/cd12abcd7fdd02842fd5225eab7ceaf2/c26ae/or6.png differ diff --git a/static/cd12abcd7fdd02842fd5225eab7ceaf2/f058b/or6.png b/static/cd12abcd7fdd02842fd5225eab7ceaf2/f058b/or6.png new file mode 100644 index 0000000..70d3d20 Binary files /dev/null and b/static/cd12abcd7fdd02842fd5225eab7ceaf2/f058b/or6.png differ diff --git a/static/cd12abcd7fdd02842fd5225eab7ceaf2/f5209/or6.png b/static/cd12abcd7fdd02842fd5225eab7ceaf2/f5209/or6.png new file mode 100644 index 0000000..5fb7c50 Binary files /dev/null and b/static/cd12abcd7fdd02842fd5225eab7ceaf2/f5209/or6.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/40601/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/40601/reconcile-publish.png new file mode 100644 index 0000000..149b39e Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/40601/reconcile-publish.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/5d942/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/5d942/reconcile-publish.png new file mode 100644 index 0000000..954f676 Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/5d942/reconcile-publish.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/6bdcf/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/6bdcf/reconcile-publish.png new file mode 100644 index 0000000..8030dfd Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/6bdcf/reconcile-publish.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/78612/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/78612/reconcile-publish.png new file mode 100644 index 0000000..e111ce8 Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/78612/reconcile-publish.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/c26ae/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/c26ae/reconcile-publish.png new file mode 100644 index 0000000..1f65364 Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/c26ae/reconcile-publish.png differ diff --git a/static/d272074553e0a809343b4bf35fa04f09/f058b/reconcile-publish.png b/static/d272074553e0a809343b4bf35fa04f09/f058b/reconcile-publish.png new file mode 100644 index 0000000..382bd05 Binary files /dev/null and b/static/d272074553e0a809343b4bf35fa04f09/f058b/reconcile-publish.png differ diff --git a/static/d4191f055b104445a4c283e09a9ebec8/40601/or4.png b/static/d4191f055b104445a4c283e09a9ebec8/40601/or4.png new file mode 100644 index 0000000..d81835b Binary files /dev/null and b/static/d4191f055b104445a4c283e09a9ebec8/40601/or4.png differ diff --git a/static/d4191f055b104445a4c283e09a9ebec8/6bdcf/or4.png b/static/d4191f055b104445a4c283e09a9ebec8/6bdcf/or4.png new file mode 100644 index 0000000..7230c0f Binary files /dev/null and b/static/d4191f055b104445a4c283e09a9ebec8/6bdcf/or4.png differ diff --git a/static/d4191f055b104445a4c283e09a9ebec8/ad997/or4.png b/static/d4191f055b104445a4c283e09a9ebec8/ad997/or4.png new file mode 100644 index 0000000..e216c93 Binary files /dev/null and b/static/d4191f055b104445a4c283e09a9ebec8/ad997/or4.png differ diff --git a/static/d4191f055b104445a4c283e09a9ebec8/c26ae/or4.png b/static/d4191f055b104445a4c283e09a9ebec8/c26ae/or4.png new file mode 100644 index 0000000..12de177 Binary files /dev/null and b/static/d4191f055b104445a4c283e09a9ebec8/c26ae/or4.png differ diff --git a/static/d4191f055b104445a4c283e09a9ebec8/f058b/or4.png b/static/d4191f055b104445a4c283e09a9ebec8/f058b/or4.png new file mode 100644 index 0000000..877b13a Binary files /dev/null and b/static/d4191f055b104445a4c283e09a9ebec8/f058b/or4.png differ diff --git a/static/dcbc73109ed2edf14419bc87466a5342/40601/open-pr-at-w3id.png b/static/dcbc73109ed2edf14419bc87466a5342/40601/open-pr-at-w3id.png new file mode 100644 index 0000000..eab6ea6 Binary files /dev/null and b/static/dcbc73109ed2edf14419bc87466a5342/40601/open-pr-at-w3id.png differ diff --git a/static/dcbc73109ed2edf14419bc87466a5342/6bdcf/open-pr-at-w3id.png b/static/dcbc73109ed2edf14419bc87466a5342/6bdcf/open-pr-at-w3id.png new file mode 100644 index 0000000..918ac9b Binary files /dev/null and b/static/dcbc73109ed2edf14419bc87466a5342/6bdcf/open-pr-at-w3id.png differ diff --git a/static/dcbc73109ed2edf14419bc87466a5342/c26ae/open-pr-at-w3id.png b/static/dcbc73109ed2edf14419bc87466a5342/c26ae/open-pr-at-w3id.png new file mode 100644 index 0000000..e4e5533 Binary files /dev/null and b/static/dcbc73109ed2edf14419bc87466a5342/c26ae/open-pr-at-w3id.png differ diff --git a/static/dcbc73109ed2edf14419bc87466a5342/eb2af/open-pr-at-w3id.png b/static/dcbc73109ed2edf14419bc87466a5342/eb2af/open-pr-at-w3id.png new file mode 100644 index 0000000..872d544 Binary files /dev/null and b/static/dcbc73109ed2edf14419bc87466a5342/eb2af/open-pr-at-w3id.png differ diff --git a/static/dcbc73109ed2edf14419bc87466a5342/f058b/open-pr-at-w3id.png b/static/dcbc73109ed2edf14419bc87466a5342/f058b/open-pr-at-w3id.png new file mode 100644 index 0000000..afe6051 Binary files /dev/null and b/static/dcbc73109ed2edf14419bc87466a5342/f058b/open-pr-at-w3id.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/29114/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/29114/published-vocab.png new file mode 100644 index 0000000..9bc52ef Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/29114/published-vocab.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/40601/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/40601/published-vocab.png new file mode 100644 index 0000000..03cbe95 Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/40601/published-vocab.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/6bdcf/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/6bdcf/published-vocab.png new file mode 100644 index 0000000..e94b58f Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/6bdcf/published-vocab.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/78612/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/78612/published-vocab.png new file mode 100644 index 0000000..ad95c46 Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/78612/published-vocab.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/c26ae/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/c26ae/published-vocab.png new file mode 100644 index 0000000..855c894 Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/c26ae/published-vocab.png differ diff --git a/static/e5a580cc6f532f9f98c427ff90a06429/f058b/published-vocab.png b/static/e5a580cc6f532f9f98c427ff90a06429/f058b/published-vocab.png new file mode 100644 index 0000000..23bff1a Binary files /dev/null and b/static/e5a580cc6f532f9f98c427ff90a06429/f058b/published-vocab.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/3c492/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/3c492/upload.png new file mode 100644 index 0000000..06e6bdb Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/3c492/upload.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/40601/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/40601/upload.png new file mode 100644 index 0000000..e0420a1 Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/40601/upload.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/6bdcf/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/6bdcf/upload.png new file mode 100644 index 0000000..283c7d2 Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/6bdcf/upload.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/78612/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/78612/upload.png new file mode 100644 index 0000000..8354fa7 Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/78612/upload.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/c26ae/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/c26ae/upload.png new file mode 100644 index 0000000..8dfedf2 Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/c26ae/upload.png differ diff --git a/static/e5af98f7ca69f0c23efe94e8e10c44c3/f058b/upload.png b/static/e5af98f7ca69f0c23efe94e8e10c44c3/f058b/upload.png new file mode 100644 index 0000000..400a96b Binary files /dev/null and b/static/e5af98f7ca69f0c23efe94e8e10c44c3/f058b/upload.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/058d6/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/058d6/cypress.png new file mode 100644 index 0000000..adbebf9 Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/058d6/cypress.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/40601/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/40601/cypress.png new file mode 100644 index 0000000..2ab1e6b Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/40601/cypress.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/6bdcf/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/6bdcf/cypress.png new file mode 100644 index 0000000..2ec9e06 Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/6bdcf/cypress.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/78612/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/78612/cypress.png new file mode 100644 index 0000000..220451e Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/78612/cypress.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/c26ae/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/c26ae/cypress.png new file mode 100644 index 0000000..73f7726 Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/c26ae/cypress.png differ diff --git a/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/f058b/cypress.png b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/f058b/cypress.png new file mode 100644 index 0000000..6f9858b Binary files /dev/null and b/static/e91ebe3f4fb4ad6ce6b58ae82f8e00b7/f058b/cypress.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/29114/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/29114/prepopulated-webform.png new file mode 100644 index 0000000..1a6f0b3 Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/29114/prepopulated-webform.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/40601/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/40601/prepopulated-webform.png new file mode 100644 index 0000000..d392410 Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/40601/prepopulated-webform.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/6bdcf/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/6bdcf/prepopulated-webform.png new file mode 100644 index 0000000..3fb8606 Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/6bdcf/prepopulated-webform.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/78612/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/78612/prepopulated-webform.png new file mode 100644 index 0000000..9898c39 Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/78612/prepopulated-webform.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/c26ae/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/c26ae/prepopulated-webform.png new file mode 100644 index 0000000..98b7d0a Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/c26ae/prepopulated-webform.png differ diff --git a/static/ec0c8783a270bd477ef034281c1c4796/f058b/prepopulated-webform.png b/static/ec0c8783a270bd477ef034281c1c4796/f058b/prepopulated-webform.png new file mode 100644 index 0000000..276e2b7 Binary files /dev/null and b/static/ec0c8783a270bd477ef034281c1c4796/f058b/prepopulated-webform.png differ diff --git a/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/302a4/set_gh_pages.png b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/302a4/set_gh_pages.png new file mode 100644 index 0000000..09b8928 Binary files /dev/null and b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/302a4/set_gh_pages.png differ diff --git a/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/40601/set_gh_pages.png b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/40601/set_gh_pages.png new file mode 100644 index 0000000..70cc2d4 Binary files /dev/null and b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/40601/set_gh_pages.png differ diff --git a/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/6bdcf/set_gh_pages.png b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/6bdcf/set_gh_pages.png new file mode 100644 index 0000000..9accd32 Binary files /dev/null and b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/6bdcf/set_gh_pages.png differ diff --git a/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/c26ae/set_gh_pages.png b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/c26ae/set_gh_pages.png new file mode 100644 index 0000000..bbd06b0 Binary files /dev/null and b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/c26ae/set_gh_pages.png differ diff --git a/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/f058b/set_gh_pages.png b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/f058b/set_gh_pages.png new file mode 100644 index 0000000..434fc13 Binary files /dev/null and b/static/ffc58a76b23bb9ae2b5cd91d14bfe5e6/f058b/set_gh_pages.png differ diff --git a/static/merriweather-latin-300-58b18067ebbd21fda77b67e73c241d3b.woff b/static/merriweather-latin-300-58b18067ebbd21fda77b67e73c241d3b.woff new file mode 100644 index 0000000..7c8fa9a Binary files /dev/null and b/static/merriweather-latin-300-58b18067ebbd21fda77b67e73c241d3b.woff differ diff --git a/static/merriweather-latin-300-fc117160c69a8ea0851b26dd14748ee4.woff2 b/static/merriweather-latin-300-fc117160c69a8ea0851b26dd14748ee4.woff2 new file mode 100644 index 0000000..fdf59df Binary files /dev/null and b/static/merriweather-latin-300-fc117160c69a8ea0851b26dd14748ee4.woff2 differ diff --git a/static/merriweather-latin-300italic-23c3f1f88683618a4fb8d265d33d383a.woff b/static/merriweather-latin-300italic-23c3f1f88683618a4fb8d265d33d383a.woff new file mode 100644 index 0000000..0955afa Binary files /dev/null and b/static/merriweather-latin-300italic-23c3f1f88683618a4fb8d265d33d383a.woff differ diff --git a/static/merriweather-latin-300italic-fe29961474f8dbf77c0aa7b9a629e4bc.woff2 b/static/merriweather-latin-300italic-fe29961474f8dbf77c0aa7b9a629e4bc.woff2 new file mode 100644 index 0000000..d07054a Binary files /dev/null and b/static/merriweather-latin-300italic-fe29961474f8dbf77c0aa7b9a629e4bc.woff2 differ diff --git a/static/merriweather-latin-400-040426f99ff6e00b86506452e0d1f10b.woff b/static/merriweather-latin-400-040426f99ff6e00b86506452e0d1f10b.woff new file mode 100644 index 0000000..2f2ab42 Binary files /dev/null and b/static/merriweather-latin-400-040426f99ff6e00b86506452e0d1f10b.woff differ diff --git a/static/merriweather-latin-400-d9479e8023bef9cbd9bf8d6eabd6bf36.woff2 b/static/merriweather-latin-400-d9479e8023bef9cbd9bf8d6eabd6bf36.woff2 new file mode 100644 index 0000000..0998409 Binary files /dev/null and b/static/merriweather-latin-400-d9479e8023bef9cbd9bf8d6eabd6bf36.woff2 differ diff --git a/static/merriweather-latin-400italic-2de7bfeaf08fb03d4315d49947f062f7.woff2 b/static/merriweather-latin-400italic-2de7bfeaf08fb03d4315d49947f062f7.woff2 new file mode 100644 index 0000000..3c26191 Binary files /dev/null and b/static/merriweather-latin-400italic-2de7bfeaf08fb03d4315d49947f062f7.woff2 differ diff --git a/static/merriweather-latin-400italic-79db67aca65f5285964ab332bd65f451.woff b/static/merriweather-latin-400italic-79db67aca65f5285964ab332bd65f451.woff new file mode 100644 index 0000000..fe2e3dc Binary files /dev/null and b/static/merriweather-latin-400italic-79db67aca65f5285964ab332bd65f451.woff differ diff --git a/static/merriweather-latin-700-22fb8afba4ab1f093b6ef9e28a9b6e92.woff b/static/merriweather-latin-700-22fb8afba4ab1f093b6ef9e28a9b6e92.woff new file mode 100644 index 0000000..afd6fec Binary files /dev/null and b/static/merriweather-latin-700-22fb8afba4ab1f093b6ef9e28a9b6e92.woff differ diff --git a/static/merriweather-latin-700-4b08e01d805fa35d7bf777f1b24314ae.woff2 b/static/merriweather-latin-700-4b08e01d805fa35d7bf777f1b24314ae.woff2 new file mode 100644 index 0000000..ead7c09 Binary files /dev/null and b/static/merriweather-latin-700-4b08e01d805fa35d7bf777f1b24314ae.woff2 differ diff --git a/static/merriweather-latin-700italic-cd92541b177652fffb6e3b952f1c33f1.woff2 b/static/merriweather-latin-700italic-cd92541b177652fffb6e3b952f1c33f1.woff2 new file mode 100644 index 0000000..051450d Binary files /dev/null and b/static/merriweather-latin-700italic-cd92541b177652fffb6e3b952f1c33f1.woff2 differ diff --git a/static/merriweather-latin-700italic-f87f3d87cea0dd0979bfc8ac9ea90243.woff b/static/merriweather-latin-700italic-f87f3d87cea0dd0979bfc8ac9ea90243.woff new file mode 100644 index 0000000..a572cca Binary files /dev/null and b/static/merriweather-latin-700italic-f87f3d87cea0dd0979bfc8ac9ea90243.woff differ diff --git a/static/merriweather-latin-900-5d4e42cb44410674acd99153d57df032.woff b/static/merriweather-latin-900-5d4e42cb44410674acd99153d57df032.woff new file mode 100644 index 0000000..51ffedd Binary files /dev/null and b/static/merriweather-latin-900-5d4e42cb44410674acd99153d57df032.woff differ diff --git a/static/merriweather-latin-900-f813fc6a4bee46eda5224ac7ebf1b7be.woff2 b/static/merriweather-latin-900-f813fc6a4bee46eda5224ac7ebf1b7be.woff2 new file mode 100644 index 0000000..a671a48 Binary files /dev/null and b/static/merriweather-latin-900-f813fc6a4bee46eda5224ac7ebf1b7be.woff2 differ diff --git a/static/merriweather-latin-900italic-9647f9fdab98756989a8a5550eb205c3.woff b/static/merriweather-latin-900italic-9647f9fdab98756989a8a5550eb205c3.woff new file mode 100644 index 0000000..9d086ab Binary files /dev/null and b/static/merriweather-latin-900italic-9647f9fdab98756989a8a5550eb205c3.woff differ diff --git a/static/merriweather-latin-900italic-b7901d85486871c1779c0e93ddd85656.woff2 b/static/merriweather-latin-900italic-b7901d85486871c1779c0e93ddd85656.woff2 new file mode 100644 index 0000000..1771fd9 Binary files /dev/null and b/static/merriweather-latin-900italic-b7901d85486871c1779c0e93ddd85656.woff2 differ diff --git a/static/montserrat-latin-100-8d7d79679b70dbe27172b6460e7a7910.woff2 b/static/montserrat-latin-100-8d7d79679b70dbe27172b6460e7a7910.woff2 new file mode 100644 index 0000000..ea9b882 Binary files /dev/null and b/static/montserrat-latin-100-8d7d79679b70dbe27172b6460e7a7910.woff2 differ diff --git a/static/montserrat-latin-100-ec38980a9e0119a379e2a9b3dbb1901a.woff b/static/montserrat-latin-100-ec38980a9e0119a379e2a9b3dbb1901a.woff new file mode 100644 index 0000000..0860eed Binary files /dev/null and b/static/montserrat-latin-100-ec38980a9e0119a379e2a9b3dbb1901a.woff differ diff --git a/static/montserrat-latin-100italic-3b325a3173c8207435cd1b76e19bf501.woff b/static/montserrat-latin-100italic-3b325a3173c8207435cd1b76e19bf501.woff new file mode 100644 index 0000000..8081773 Binary files /dev/null and b/static/montserrat-latin-100italic-3b325a3173c8207435cd1b76e19bf501.woff differ diff --git a/static/montserrat-latin-100italic-e279051046ba1286706adc886cf1c96b.woff2 b/static/montserrat-latin-100italic-e279051046ba1286706adc886cf1c96b.woff2 new file mode 100644 index 0000000..703efd2 Binary files /dev/null and b/static/montserrat-latin-100italic-e279051046ba1286706adc886cf1c96b.woff2 differ diff --git a/static/montserrat-latin-200-2d8ba08717110d27122e54c34b8a5798.woff b/static/montserrat-latin-200-2d8ba08717110d27122e54c34b8a5798.woff new file mode 100644 index 0000000..52c02a8 Binary files /dev/null and b/static/montserrat-latin-200-2d8ba08717110d27122e54c34b8a5798.woff differ diff --git a/static/montserrat-latin-200-9d266fbbfa6cab7009bd56003b1eeb67.woff2 b/static/montserrat-latin-200-9d266fbbfa6cab7009bd56003b1eeb67.woff2 new file mode 100644 index 0000000..74cce9e Binary files /dev/null and b/static/montserrat-latin-200-9d266fbbfa6cab7009bd56003b1eeb67.woff2 differ diff --git a/static/montserrat-latin-200italic-6e5b3756583bb2263eb062eae992735e.woff2 b/static/montserrat-latin-200italic-6e5b3756583bb2263eb062eae992735e.woff2 new file mode 100644 index 0000000..3e4081b Binary files /dev/null and b/static/montserrat-latin-200italic-6e5b3756583bb2263eb062eae992735e.woff2 differ diff --git a/static/montserrat-latin-200italic-a0d6f343e4b536c582926255367a57da.woff b/static/montserrat-latin-200italic-a0d6f343e4b536c582926255367a57da.woff new file mode 100644 index 0000000..271af27 Binary files /dev/null and b/static/montserrat-latin-200italic-a0d6f343e4b536c582926255367a57da.woff differ diff --git a/static/montserrat-latin-300-00b3e893aab5a8fd632d6342eb72551a.woff2 b/static/montserrat-latin-300-00b3e893aab5a8fd632d6342eb72551a.woff2 new file mode 100644 index 0000000..6b1bddc Binary files /dev/null and b/static/montserrat-latin-300-00b3e893aab5a8fd632d6342eb72551a.woff2 differ diff --git a/static/montserrat-latin-300-ea303695ceab35f17e7d062f30e0173b.woff b/static/montserrat-latin-300-ea303695ceab35f17e7d062f30e0173b.woff new file mode 100644 index 0000000..dfa5a04 Binary files /dev/null and b/static/montserrat-latin-300-ea303695ceab35f17e7d062f30e0173b.woff differ diff --git a/static/montserrat-latin-300italic-54b0bf2c8c4c12ffafd803be2466a790.woff b/static/montserrat-latin-300italic-54b0bf2c8c4c12ffafd803be2466a790.woff new file mode 100644 index 0000000..9d0ca66 Binary files /dev/null and b/static/montserrat-latin-300italic-54b0bf2c8c4c12ffafd803be2466a790.woff differ diff --git a/static/montserrat-latin-300italic-56f34ea368f6aedf89583d444bbcb227.woff2 b/static/montserrat-latin-300italic-56f34ea368f6aedf89583d444bbcb227.woff2 new file mode 100644 index 0000000..1d0f3c5 Binary files /dev/null and b/static/montserrat-latin-300italic-56f34ea368f6aedf89583d444bbcb227.woff2 differ diff --git a/static/montserrat-latin-400-0659a9f4e90db5cf51b50d005bff1e41.woff b/static/montserrat-latin-400-0659a9f4e90db5cf51b50d005bff1e41.woff new file mode 100644 index 0000000..676a065 Binary files /dev/null and b/static/montserrat-latin-400-0659a9f4e90db5cf51b50d005bff1e41.woff differ diff --git a/static/montserrat-latin-400-b71748ae4f80ec8c014def4c5fa8688b.woff2 b/static/montserrat-latin-400-b71748ae4f80ec8c014def4c5fa8688b.woff2 new file mode 100644 index 0000000..70788c2 Binary files /dev/null and b/static/montserrat-latin-400-b71748ae4f80ec8c014def4c5fa8688b.woff2 differ diff --git a/static/montserrat-latin-400italic-6eed6b4cbb809c6efc7aa7ddad6dbe3e.woff2 b/static/montserrat-latin-400italic-6eed6b4cbb809c6efc7aa7ddad6dbe3e.woff2 new file mode 100644 index 0000000..469aede Binary files /dev/null and b/static/montserrat-latin-400italic-6eed6b4cbb809c6efc7aa7ddad6dbe3e.woff2 differ diff --git a/static/montserrat-latin-400italic-7583622cfde30ae49086d18447ab28e7.woff b/static/montserrat-latin-400italic-7583622cfde30ae49086d18447ab28e7.woff new file mode 100644 index 0000000..67f1e85 Binary files /dev/null and b/static/montserrat-latin-400italic-7583622cfde30ae49086d18447ab28e7.woff differ diff --git a/static/montserrat-latin-500-091b209546e16313fd4f4fc36090c757.woff2 b/static/montserrat-latin-500-091b209546e16313fd4f4fc36090c757.woff2 new file mode 100644 index 0000000..9dc5c7f Binary files /dev/null and b/static/montserrat-latin-500-091b209546e16313fd4f4fc36090c757.woff2 differ diff --git a/static/montserrat-latin-500-edd311588712a96bbf435fad264fff62.woff b/static/montserrat-latin-500-edd311588712a96bbf435fad264fff62.woff new file mode 100644 index 0000000..1c83d85 Binary files /dev/null and b/static/montserrat-latin-500-edd311588712a96bbf435fad264fff62.woff differ diff --git a/static/montserrat-latin-500italic-5146cbfe02b1deea5dffea27a5f2f998.woff b/static/montserrat-latin-500italic-5146cbfe02b1deea5dffea27a5f2f998.woff new file mode 100644 index 0000000..71476d8 Binary files /dev/null and b/static/montserrat-latin-500italic-5146cbfe02b1deea5dffea27a5f2f998.woff differ diff --git a/static/montserrat-latin-500italic-c90ced68b46050061d1a41842d6dfb43.woff2 b/static/montserrat-latin-500italic-c90ced68b46050061d1a41842d6dfb43.woff2 new file mode 100644 index 0000000..0fb9838 Binary files /dev/null and b/static/montserrat-latin-500italic-c90ced68b46050061d1a41842d6dfb43.woff2 differ diff --git a/static/montserrat-latin-600-0480d2f8a71f38db8633b84d8722e0c2.woff2 b/static/montserrat-latin-600-0480d2f8a71f38db8633b84d8722e0c2.woff2 new file mode 100644 index 0000000..29cc1a9 Binary files /dev/null and b/static/montserrat-latin-600-0480d2f8a71f38db8633b84d8722e0c2.woff2 differ diff --git a/static/montserrat-latin-600-b77863a375260a05dd13f86a1cee598f.woff b/static/montserrat-latin-600-b77863a375260a05dd13f86a1cee598f.woff new file mode 100644 index 0000000..e7f8a31 Binary files /dev/null and b/static/montserrat-latin-600-b77863a375260a05dd13f86a1cee598f.woff differ diff --git a/static/montserrat-latin-600italic-c4fcfeeb057724724097167e57bd7801.woff b/static/montserrat-latin-600italic-c4fcfeeb057724724097167e57bd7801.woff new file mode 100644 index 0000000..e00bd8b Binary files /dev/null and b/static/montserrat-latin-600italic-c4fcfeeb057724724097167e57bd7801.woff differ diff --git a/static/montserrat-latin-600italic-cf46ffb11f3a60d7df0567f8851a1d00.woff2 b/static/montserrat-latin-600italic-cf46ffb11f3a60d7df0567f8851a1d00.woff2 new file mode 100644 index 0000000..08f3960 Binary files /dev/null and b/static/montserrat-latin-600italic-cf46ffb11f3a60d7df0567f8851a1d00.woff2 differ diff --git a/static/montserrat-latin-700-7dbcc8a5ea2289d83f657c25b4be6193.woff2 b/static/montserrat-latin-700-7dbcc8a5ea2289d83f657c25b4be6193.woff2 new file mode 100644 index 0000000..3d0b409 Binary files /dev/null and b/static/montserrat-latin-700-7dbcc8a5ea2289d83f657c25b4be6193.woff2 differ diff --git a/static/montserrat-latin-700-99271a835e1cae8c76ef8bba99a8cc4e.woff b/static/montserrat-latin-700-99271a835e1cae8c76ef8bba99a8cc4e.woff new file mode 100644 index 0000000..8573760 Binary files /dev/null and b/static/montserrat-latin-700-99271a835e1cae8c76ef8bba99a8cc4e.woff differ diff --git a/static/montserrat-latin-700italic-6779372f04095051c62ed36bc1dcc142.woff b/static/montserrat-latin-700italic-6779372f04095051c62ed36bc1dcc142.woff new file mode 100644 index 0000000..e9f1940 Binary files /dev/null and b/static/montserrat-latin-700italic-6779372f04095051c62ed36bc1dcc142.woff differ diff --git a/static/montserrat-latin-700italic-c41ad6bdb4bd504a843d546d0a47958d.woff2 b/static/montserrat-latin-700italic-c41ad6bdb4bd504a843d546d0a47958d.woff2 new file mode 100644 index 0000000..0997e79 Binary files /dev/null and b/static/montserrat-latin-700italic-c41ad6bdb4bd504a843d546d0a47958d.woff2 differ diff --git a/static/montserrat-latin-800-4e3c615967a2360f5db87d2f0fd2456f.woff b/static/montserrat-latin-800-4e3c615967a2360f5db87d2f0fd2456f.woff new file mode 100644 index 0000000..79203dd Binary files /dev/null and b/static/montserrat-latin-800-4e3c615967a2360f5db87d2f0fd2456f.woff differ diff --git a/static/montserrat-latin-800-db9a3e0ba7eaea32e5f55328ace6cf23.woff2 b/static/montserrat-latin-800-db9a3e0ba7eaea32e5f55328ace6cf23.woff2 new file mode 100644 index 0000000..0abb707 Binary files /dev/null and b/static/montserrat-latin-800-db9a3e0ba7eaea32e5f55328ace6cf23.woff2 differ diff --git a/static/montserrat-latin-800italic-bf45bfa14805969eda318973947bc42b.woff2 b/static/montserrat-latin-800italic-bf45bfa14805969eda318973947bc42b.woff2 new file mode 100644 index 0000000..674e6ea Binary files /dev/null and b/static/montserrat-latin-800italic-bf45bfa14805969eda318973947bc42b.woff2 differ diff --git a/static/montserrat-latin-800italic-fe82abb0bcede51bf724254878e0c374.woff b/static/montserrat-latin-800italic-fe82abb0bcede51bf724254878e0c374.woff new file mode 100644 index 0000000..6541557 Binary files /dev/null and b/static/montserrat-latin-800italic-fe82abb0bcede51bf724254878e0c374.woff differ diff --git a/static/montserrat-latin-900-8211f418baeb8ec880b80ba3c682f957.woff b/static/montserrat-latin-900-8211f418baeb8ec880b80ba3c682f957.woff new file mode 100644 index 0000000..e5f4347 Binary files /dev/null and b/static/montserrat-latin-900-8211f418baeb8ec880b80ba3c682f957.woff differ diff --git a/static/montserrat-latin-900-e66c7edc609e24bacbb705175669d814.woff2 b/static/montserrat-latin-900-e66c7edc609e24bacbb705175669d814.woff2 new file mode 100644 index 0000000..d3cfc4a Binary files /dev/null and b/static/montserrat-latin-900-e66c7edc609e24bacbb705175669d814.woff2 differ diff --git a/static/montserrat-latin-900italic-4454c775e48152c1a72510ceed3603e2.woff2 b/static/montserrat-latin-900italic-4454c775e48152c1a72510ceed3603e2.woff2 new file mode 100644 index 0000000..ad217a8 Binary files /dev/null and b/static/montserrat-latin-900italic-4454c775e48152c1a72510ceed3603e2.woff2 differ diff --git a/static/montserrat-latin-900italic-efcaa0f6a82ee0640b83a0916e6e8d68.woff b/static/montserrat-latin-900italic-efcaa0f6a82ee0640b83a0916e6e8d68.woff new file mode 100644 index 0000000..d7da403 Binary files /dev/null and b/static/montserrat-latin-900italic-efcaa0f6a82ee0640b83a0916e6e8d68.woff differ diff --git a/static/ubuntu-v20-latin-700-6788e6ed863a8e559ef28b3913554383.woff b/static/ubuntu-v20-latin-700-6788e6ed863a8e559ef28b3913554383.woff new file mode 100644 index 0000000..e58e9da Binary files /dev/null and b/static/ubuntu-v20-latin-700-6788e6ed863a8e559ef28b3913554383.woff differ diff --git a/static/ubuntu-v20-latin-700-7ceec6fd3e7d00630b2568986c915532.woff2 b/static/ubuntu-v20-latin-700-7ceec6fd3e7d00630b2568986c915532.woff2 new file mode 100644 index 0000000..2c08bc6 Binary files /dev/null and b/static/ubuntu-v20-latin-700-7ceec6fd3e7d00630b2568986c915532.woff2 differ diff --git a/static/ubuntu-v20-latin-700-b0c73ddaf0479ad915d9ad30e1f4a5a7.svg b/static/ubuntu-v20-latin-700-b0c73ddaf0479ad915d9ad30e1f4a5a7.svg new file mode 100644 index 0000000..7aa9c38 --- /dev/null +++ b/static/ubuntu-v20-latin-700-b0c73ddaf0479ad915d9ad30e1f4a5a7.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/ubuntu-v20-latin-700-e7cf86fbe61557f0dcd34f4489f86840.eot b/static/ubuntu-v20-latin-700-e7cf86fbe61557f0dcd34f4489f86840.eot new file mode 100644 index 0000000..84c5e77 Binary files /dev/null and b/static/ubuntu-v20-latin-700-e7cf86fbe61557f0dcd34f4489f86840.eot differ diff --git a/static/ubuntu-v20-latin-700-fc38f31d636ef7ea94b75741b6d493c8.ttf b/static/ubuntu-v20-latin-700-fc38f31d636ef7ea94b75741b6d493c8.ttf new file mode 100644 index 0000000..d04bb45 Binary files /dev/null and b/static/ubuntu-v20-latin-700-fc38f31d636ef7ea94b75741b6d493c8.ttf differ diff --git a/static/ubuntu-v20-latin-regular-254e551b53a2ccebe384cd3af3a50c22.ttf b/static/ubuntu-v20-latin-regular-254e551b53a2ccebe384cd3af3a50c22.ttf new file mode 100644 index 0000000..46c113f Binary files /dev/null and b/static/ubuntu-v20-latin-regular-254e551b53a2ccebe384cd3af3a50c22.ttf differ diff --git a/static/ubuntu-v20-latin-regular-2f02effe392a63dc07a5cdf187b2ef09.woff2 b/static/ubuntu-v20-latin-regular-2f02effe392a63dc07a5cdf187b2ef09.woff2 new file mode 100644 index 0000000..8070e4f Binary files /dev/null and b/static/ubuntu-v20-latin-regular-2f02effe392a63dc07a5cdf187b2ef09.woff2 differ diff --git a/static/ubuntu-v20-latin-regular-5fa0d860656d0e40c0861657b07f82e0.eot b/static/ubuntu-v20-latin-regular-5fa0d860656d0e40c0861657b07f82e0.eot new file mode 100644 index 0000000..a483e2e Binary files /dev/null and b/static/ubuntu-v20-latin-regular-5fa0d860656d0e40c0861657b07f82e0.eot differ diff --git a/static/ubuntu-v20-latin-regular-6a317272decf6d2470386df117732fa6.woff b/static/ubuntu-v20-latin-regular-6a317272decf6d2470386df117732fa6.woff new file mode 100644 index 0000000..24cf9ae Binary files /dev/null and b/static/ubuntu-v20-latin-regular-6a317272decf6d2470386df117732fa6.woff differ diff --git a/static/ubuntu-v20-latin-regular-f00252d5cc9aed7459bd59a61c740eba.svg b/static/ubuntu-v20-latin-regular-f00252d5cc9aed7459bd59a61c740eba.svg new file mode 100644 index 0000000..66a4f6b --- /dev/null +++ b/static/ubuntu-v20-latin-regular-f00252d5cc9aed7459bd59a61c740eba.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/styles.7d6cd8f07fdbd498b042.css b/styles.7d6cd8f07fdbd498b042.css new file mode 100644 index 0000000..33f1980 --- /dev/null +++ b/styles.7d6cd8f07fdbd498b042.css @@ -0,0 +1,4 @@ +@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:100;src:local("Montserrat Thin "),local("Montserrat-Thin"),url(/static/montserrat-latin-100-8d7d79679b70dbe27172b6460e7a7910.woff2) format("woff2"),url(/static/montserrat-latin-100-ec38980a9e0119a379e2a9b3dbb1901a.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:100;src:local("Montserrat Thin italic"),local("Montserrat-Thinitalic"),url(/static/montserrat-latin-100italic-e279051046ba1286706adc886cf1c96b.woff2) format("woff2"),url(/static/montserrat-latin-100italic-3b325a3173c8207435cd1b76e19bf501.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:200;src:local("Montserrat Extra Light "),local("Montserrat-Extra Light"),url(/static/montserrat-latin-200-9d266fbbfa6cab7009bd56003b1eeb67.woff2) format("woff2"),url(/static/montserrat-latin-200-2d8ba08717110d27122e54c34b8a5798.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:200;src:local("Montserrat Extra Light italic"),local("Montserrat-Extra Lightitalic"),url(/static/montserrat-latin-200italic-6e5b3756583bb2263eb062eae992735e.woff2) format("woff2"),url(/static/montserrat-latin-200italic-a0d6f343e4b536c582926255367a57da.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:300;src:local("Montserrat Light "),local("Montserrat-Light"),url(/static/montserrat-latin-300-00b3e893aab5a8fd632d6342eb72551a.woff2) format("woff2"),url(/static/montserrat-latin-300-ea303695ceab35f17e7d062f30e0173b.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:300;src:local("Montserrat Light italic"),local("Montserrat-Lightitalic"),url(/static/montserrat-latin-300italic-56f34ea368f6aedf89583d444bbcb227.woff2) format("woff2"),url(/static/montserrat-latin-300italic-54b0bf2c8c4c12ffafd803be2466a790.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:400;src:local("Montserrat Regular "),local("Montserrat-Regular"),url(/static/montserrat-latin-400-b71748ae4f80ec8c014def4c5fa8688b.woff2) format("woff2"),url(/static/montserrat-latin-400-0659a9f4e90db5cf51b50d005bff1e41.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:400;src:local("Montserrat Regular italic"),local("Montserrat-Regularitalic"),url(/static/montserrat-latin-400italic-6eed6b4cbb809c6efc7aa7ddad6dbe3e.woff2) format("woff2"),url(/static/montserrat-latin-400italic-7583622cfde30ae49086d18447ab28e7.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:500;src:local("Montserrat Medium "),local("Montserrat-Medium"),url(/static/montserrat-latin-500-091b209546e16313fd4f4fc36090c757.woff2) format("woff2"),url(/static/montserrat-latin-500-edd311588712a96bbf435fad264fff62.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:500;src:local("Montserrat Medium italic"),local("Montserrat-Mediumitalic"),url(/static/montserrat-latin-500italic-c90ced68b46050061d1a41842d6dfb43.woff2) format("woff2"),url(/static/montserrat-latin-500italic-5146cbfe02b1deea5dffea27a5f2f998.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:600;src:local("Montserrat SemiBold "),local("Montserrat-SemiBold"),url(/static/montserrat-latin-600-0480d2f8a71f38db8633b84d8722e0c2.woff2) format("woff2"),url(/static/montserrat-latin-600-b77863a375260a05dd13f86a1cee598f.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:600;src:local("Montserrat SemiBold italic"),local("Montserrat-SemiBolditalic"),url(/static/montserrat-latin-600italic-cf46ffb11f3a60d7df0567f8851a1d00.woff2) format("woff2"),url(/static/montserrat-latin-600italic-c4fcfeeb057724724097167e57bd7801.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:700;src:local("Montserrat Bold "),local("Montserrat-Bold"),url(/static/montserrat-latin-700-7dbcc8a5ea2289d83f657c25b4be6193.woff2) format("woff2"),url(/static/montserrat-latin-700-99271a835e1cae8c76ef8bba99a8cc4e.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:700;src:local("Montserrat Bold italic"),local("Montserrat-Bolditalic"),url(/static/montserrat-latin-700italic-c41ad6bdb4bd504a843d546d0a47958d.woff2) format("woff2"),url(/static/montserrat-latin-700italic-6779372f04095051c62ed36bc1dcc142.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:800;src:local("Montserrat ExtraBold "),local("Montserrat-ExtraBold"),url(/static/montserrat-latin-800-db9a3e0ba7eaea32e5f55328ace6cf23.woff2) format("woff2"),url(/static/montserrat-latin-800-4e3c615967a2360f5db87d2f0fd2456f.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:800;src:local("Montserrat ExtraBold italic"),local("Montserrat-ExtraBolditalic"),url(/static/montserrat-latin-800italic-bf45bfa14805969eda318973947bc42b.woff2) format("woff2"),url(/static/montserrat-latin-800italic-fe82abb0bcede51bf724254878e0c374.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:900;src:local("Montserrat Black "),local("Montserrat-Black"),url(/static/montserrat-latin-900-e66c7edc609e24bacbb705175669d814.woff2) format("woff2"),url(/static/montserrat-latin-900-8211f418baeb8ec880b80ba3c682f957.woff) format("woff")}@font-face{font-display:swap;font-family:Montserrat;font-style:italic;font-weight:900;src:local("Montserrat Black italic"),local("Montserrat-Blackitalic"),url(/static/montserrat-latin-900italic-4454c775e48152c1a72510ceed3603e2.woff2) format("woff2"),url(/static/montserrat-latin-900italic-efcaa0f6a82ee0640b83a0916e6e8d68.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:300;src:local("Merriweather Light "),local("Merriweather-Light"),url(/static/merriweather-latin-300-fc117160c69a8ea0851b26dd14748ee4.woff2) format("woff2"),url(/static/merriweather-latin-300-58b18067ebbd21fda77b67e73c241d3b.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:300;src:local("Merriweather Light italic"),local("Merriweather-Lightitalic"),url(/static/merriweather-latin-300italic-fe29961474f8dbf77c0aa7b9a629e4bc.woff2) format("woff2"),url(/static/merriweather-latin-300italic-23c3f1f88683618a4fb8d265d33d383a.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:400;src:local("Merriweather Regular "),local("Merriweather-Regular"),url(/static/merriweather-latin-400-d9479e8023bef9cbd9bf8d6eabd6bf36.woff2) format("woff2"),url(/static/merriweather-latin-400-040426f99ff6e00b86506452e0d1f10b.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:400;src:local("Merriweather Regular italic"),local("Merriweather-Regularitalic"),url(/static/merriweather-latin-400italic-2de7bfeaf08fb03d4315d49947f062f7.woff2) format("woff2"),url(/static/merriweather-latin-400italic-79db67aca65f5285964ab332bd65f451.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:700;src:local("Merriweather Bold "),local("Merriweather-Bold"),url(/static/merriweather-latin-700-4b08e01d805fa35d7bf777f1b24314ae.woff2) format("woff2"),url(/static/merriweather-latin-700-22fb8afba4ab1f093b6ef9e28a9b6e92.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:700;src:local("Merriweather Bold italic"),local("Merriweather-Bolditalic"),url(/static/merriweather-latin-700italic-cd92541b177652fffb6e3b952f1c33f1.woff2) format("woff2"),url(/static/merriweather-latin-700italic-f87f3d87cea0dd0979bfc8ac9ea90243.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:900;src:local("Merriweather Black "),local("Merriweather-Black"),url(/static/merriweather-latin-900-f813fc6a4bee46eda5224ac7ebf1b7be.woff2) format("woff2"),url(/static/merriweather-latin-900-5d4e42cb44410674acd99153d57df032.woff) format("woff")}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:900;src:local("Merriweather Black italic"),local("Merriweather-Blackitalic"),url(/static/merriweather-latin-900italic-b7901d85486871c1779c0e93ddd85656.woff2) format("woff2"),url(/static/merriweather-latin-900italic-9647f9fdab98756989a8a5550eb205c3.woff) format("woff")} + + +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden]{display:none}:root{--maxWidth-none:"none";--maxWidth-xl:52rem;--maxWidth-wrapper:var(--maxWidth-xl);--spacing-px:"1px";--spacing-0:0;--spacing-1:0.25rem;--spacing-2:0.5rem;--spacing-3:0.75rem;--spacing-4:1rem;--spacing-5:1.25rem;--spacing-6:1.5rem;--spacing-8:2rem;--spacing-10:2.5rem;--spacing-12:3rem;--spacing-16:4rem;--spacing-20:5rem;--spacing-24:6rem;--spacing-32:8rem;--fontWeight-normal:300;--fontWeight-bold:700;--fontSize-root:16px;--lineHeight-none:1;--lineHeight-tight:1.1;--lineHeight-normal:1.5;--lineHeight-relaxed:1.625;--fontSize-1:1rem;--fontSize-2:1.2rem;--fontSize-3:1.44rem;--fontSize-4:1.728rem;--fontSize-5:2.074rem;--fontSize-6:2.488rem;--fontSize-7:2.986rem;--color-primary:#e6007d;--color-hover:#14968c;--color-text:#0f554b;--color-text-light:#14968c;--color-heading:#0f554b;--color-accent:#c8c8c8;--color-white:#fff}@font-face{font-family:Ubuntu;font-style:normal;font-weight:400;src:url(/static/ubuntu-v20-latin-regular-5fa0d860656d0e40c0861657b07f82e0.eot);src:local(""),url(/static/ubuntu-v20-latin-regular-5fa0d860656d0e40c0861657b07f82e0.eot?#iefix) format("embedded-opentype"),url(/static/ubuntu-v20-latin-regular-2f02effe392a63dc07a5cdf187b2ef09.woff2) format("woff2"),url(/static/ubuntu-v20-latin-regular-6a317272decf6d2470386df117732fa6.woff) format("woff"),url(/static/ubuntu-v20-latin-regular-254e551b53a2ccebe384cd3af3a50c22.ttf) format("truetype"),url(/static/ubuntu-v20-latin-regular-f00252d5cc9aed7459bd59a61c740eba.svg#Ubuntu) format("svg")}@font-face{font-family:Ubuntu;font-style:normal;font-weight:700;src:url(/static/ubuntu-v20-latin-700-e7cf86fbe61557f0dcd34f4489f86840.eot);src:local(""),url(/static/ubuntu-v20-latin-700-e7cf86fbe61557f0dcd34f4489f86840.eot?#iefix) format("embedded-opentype"),url(/static/ubuntu-v20-latin-700-7ceec6fd3e7d00630b2568986c915532.woff2) format("woff2"),url(/static/ubuntu-v20-latin-700-6788e6ed863a8e559ef28b3913554383.woff) format("woff"),url(/static/ubuntu-v20-latin-700-fc38f31d636ef7ea94b75741b6d493c8.ttf) format("truetype"),url(/static/ubuntu-v20-latin-700-b0c73ddaf0479ad915d9ad30e1f4a5a7.svg#Ubuntu) format("svg")}*,:after,:before{box-sizing:border-box}html{font-size:var(--fontSize-root);line-height:var(--lineHeight-normal)}body,html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{color:var(--color-text);counter-reset:figcaption;font-family:Ubuntu,sans-serif;font-size:var(--fontSize-1)}hr{background:var(--color-accent);border:0;height:1px}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading);letter-spacing:-.025em;line-height:var(--lineHeight-tight);margin-bottom:var(--spacing-6);margin-top:var(--spacing-12)}h2,h3,h4,h5,h6{color:var(--color-heading)}h1,h2,h3,h4,h5,h6{font-weight:var(--fontWeight-bold)}h1{font-size:var(--fontSize-6)}h2{font-size:var(--fontSize-5)}h3{font-size:var(--fontSize-4)}h4{font-size:var(--fontSize-3)}h5{font-size:var(--fontSize-2)}h6{font-size:var(--fontSize-1)}h1>a,h2>a,h3>a,h4>a,h5>a,h6>a{color:inherit;text-decoration:none}figcaption{text-align:center}figcaption:before{content:"Figure " counter(figcaption) ": ";counter-increment:figcaption}p{--baseline-multiplier:0.179;--x-height-multiplier:0.35;line-height:var(--lineHeight-relaxed);margin:var(--spacing-0) var(--spacing-0) var(--spacing-8) var(--spacing-0)}ol,p,ul{padding:var(--spacing-0)}ol,ul{list-style-image:none;margin-bottom:var(--spacing-8);margin-left:var(--spacing-4);margin-right:var(--spacing-0)}ol li,ul li{padding-left:var(--spacing-0)}li>p,ol li,ul li{margin-bottom:calc(var(--spacing-8)/2)}li :last-child{margin-bottom:var(--spacing-0)}li>ul{margin-left:var(--spacing-8);margin-top:calc(var(--spacing-8)/2)}blockquote{border-left:var(--spacing-1) solid var(--color-primary);color:var(--color-text-light);font-size:var(--fontSize-2);font-style:italic;margin-bottom:var(--spacing-8);margin-left:var(--spacing-4);margin-right:var(--spacing-8);padding:var(--spacing-0) var(--spacing-0) var(--spacing-0) var(--spacing-6)}blockquote>:last-child{margin-bottom:var(--spacing-0)}blockquote>ol,blockquote>ul{list-style-position:inside}table{border-collapse:collapse;border-spacing:.25rem;margin-bottom:var(--spacing-8);width:100%}table thead tr th{border-bottom:1px solid var(--color-accent)}a{color:var(--color-primary)}a:focus,a:hover{color:var(--color-hover);text-decoration:underline}.skohub-logo{display:inline-block;margin:0 0 var(--spacing-3) 0;width:100%}.skohub-logo a{color:var(--color-text);text-decoration:none}.skohub-img{height:50px;width:50px}.skohub-img,.skohub-title{display:inline-block;vertical-align:middle}.skohub-title{font-size:var(--fontSize-6);font-weight:var(--fontWeight-bold);padding:0 0 0 var(--spacing-3)}.skohub-nav{list-style:none;margin:var(--spacing-0);padding:var(--spacing-3) 0 0 0}.skohub-nav li{display:inline-block;margin:0 var(--spacing-2) 0 0}.skohub-nav li a{border:1px solid var(--color-text);border-radius:30px;color:var(--color-text);display:block;font-weight:var(--fontWeight-bold);padding:var(--spacing-2) var(--spacing-4);text-decoration:none}.skohub-nav li a:hover{border:1px solid var(--color-text-light);color:var(--color-text-light)}.global-wrapper{margin:var(--spacing-0) auto;max-width:var(--maxWidth-wrapper);padding:var(--spacing-10) var(--spacing-5) var(--spacing-0) var(--spacing-5)}.global-wrapper[data-is-root-path=true] .bio{margin-bottom:var(--spacing-12)}.global-header{margin-bottom:var(--spacing-3)}.main-heading{font-size:var(--fontSize-7);margin:0}.blog-posts{list-style:none;margin:var(--spacing-0) var(--spacing-0) var(--spacing-32) var(--spacing-0)}.is-blog-post{background:linear-gradient(180deg,#ebebeb,#fff 70%);border-radius:30px;padding:var(--spacing-8)}.post-list-item{margin-bottom:var(--spacing-8)}.post-list-item p{margin-bottom:var(--spacing-0)}.post-list-item h2{color:var(--color-primary);font-size:var(--fontSize-4);margin-bottom:var(--spacing-2);margin-top:var(--spacing-0)}.post-list-item header{margin-bottom:var(--spacing-4)}.header-link{font-family:var(--font-heading);font-size:var(--fontSize-2);font-weight:var(--fontWeight-bold);text-decoration:none}.bio{display:flex;margin-bottom:var(--spacing-8)}.bio p,.bio-avatar{margin-bottom:var(--spacing-0)}.bio-avatar{border-radius:100%;margin-right:var(--spacing-4);min-width:50px}.blog-post{margin:var(--spacing-12) var(--spacing-0) var(--spacing-0) var(--spacing-0)}.blog-post,.main-content{background:linear-gradient(180deg,#ebebeb,#fff 70%);border-radius:30px;padding:var(--spacing-8)}.main-content{margin:var(--spacing-12) var(--spacing-0) var(--spacing-32) var(--spacing-0)}.blog-post header h1,.main-content h1{margin:var(--spacing-0) var(--spacing-0) var(--spacing-4) var(--spacing-0)}.blog-post header p{font-family:var(--font-heading);font-size:var(--fontSize-2)}.blog-post-nav ul{margin:var(--spacing-0)}.gatsby-highlight{margin-bottom:var(--spacing-8)}.blog-post-nav{margin:var(--spacing-0) var(--spacing-0) var(--spacing-32) var(--spacing-0)}.blog-post-nav a{border:1px solid var(--color-primary);border-radius:30px;color:var(--color-primary);display:block;font-weight:var(--fontWeight-bold);padding:var(--spacing-2) var(--spacing-4);text-decoration:none}.blog-post-nav a:hover{border:1px solid var(--color-text-light);color:var(--color-text-light)}.wrapper-footer{bottom:0;left:50%;margin:var(--spacing-0) auto;max-width:var(--maxWidth-wrapper);padding:var(--spacing-10) var(--spacing-5) var(--spacing-0) var(--spacing-5);position:fixed;transform:translate(-50%);width:100%}.footer-navigation{background:var(--color-text-light);border-top-left-radius:30px;border-top-right-radius:30px}.footer-navigation ul{list-style:none;margin:var(--spacing-0);padding:var(--spacing-8) var(--spacing-0);text-align:center}.footer-navigation li{display:inline-block;margin:var(--spacing-2)}.footer-navigation li a{border-bottom:1px solid transparent;color:var(--color-white);text-decoration:none}.footer-navigation li a:hover{border-bottom:1px solid var(--color-white)}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}@media (max-width:42rem){blockquote{margin-left:var(--spacing-0);padding:var(--spacing-0) var(--spacing-0) var(--spacing-0) var(--spacing-4)}.skohub-title{font-size:var(--fontSize-5)}.footer-navigation ul{padding:var(--spacing-2) var(--spacing-0)}ol,ul{list-style-position:inside}}code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#000;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#b3d4fc;text-shadow:none}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:hsla(0,0%,100%,.5);color:#9a6e3a}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} \ No newline at end of file diff --git a/using-typescript/index.html b/using-typescript/index.html new file mode 100644 index 0000000..f3447d0 --- /dev/null +++ b/using-typescript/index.html @@ -0,0 +1,10 @@ +Using TypeScript | Skohub Blog

Gatsby supports TypeScript by default!

This means that you can create and write .ts/.tsx files for your pages, components etc. Please note that the gatsby-*.js files (like gatsby-node.js) currently don't support TypeScript yet.

For type checking you'll want to install typescript via npm and run tsc --init to create a .tsconfig file.

You're currently on the page "/*" which was built on 2024-03-27 07:26 am UTC.

To learn more, head over to our documentation about TypeScript.

Go back to the homepage
+ + \ No newline at end of file diff --git a/webpack-runtime-8c179305cae52ad85711.js b/webpack-runtime-8c179305cae52ad85711.js new file mode 100644 index 0000000..3525d3c --- /dev/null +++ b/webpack-runtime-8c179305cae52ad85711.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e,t,n,r,o,u={},c={};function i(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={exports:{}};return u[e](n,n.exports,i),n.exports}i.m=u,e=[],i.O=function(t,n,r,o){if(!n){var u=1/0;for(s=0;s=o)&&Object.keys(i.O).every((function(e){return i.O[e](n[a])}))?n.splice(a--,1):(c=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var u={};t=t||[null,n({}),n([]),n(n)];for(var c=2&r&&e;"object"==typeof c&&!~t.indexOf(c);c=n(c))Object.getOwnPropertyNames(c).forEach((function(t){u[t]=function(){return e[t]}}));return u.default=function(){return e},i.d(o,u),o},i.d=function(e,t){for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.f={},i.e=function(e){return Promise.all(Object.keys(i.f).reduce((function(t,n){return i.f[n](e,t),t}),[]))},i.u=function(e){return{351:"commons",501:"component---src-pages-contact-js",678:"component---src-pages-index-js",682:"component---src-pages-about-js",883:"component---src-pages-404-js",948:"2cca2479",970:"component---src-pages-using-typescript-tsx",989:"component---src-templates-blog-post-js"}[e]+"-"+{351:"d49ee9efd1044c30a9da",501:"5c21a365d688463f3898",678:"39a1a0f79cf5786e617b",682:"3f600f2fd850bd382202",883:"46780dec3ea827d4d8e6",948:"adaf2bdc94643feadca8",970:"0e780893e2657d08bb50",989:"6602a7d8cfc7be2778f4"}[e]+".js"},i.miniCssF=function(e){return"styles.7d6cd8f07fdbd498b042.css"},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="skohub-blog:",i.l=function(e,t,n,u){if(r[e])r[e].push(t);else{var c,a;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"skohub-blog:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"351\":\"commons\",\"501\":\"component---src-pages-contact-js\",\"678\":\"component---src-pages-index-js\",\"682\":\"component---src-pages-about-js\",\"883\":\"component---src-pages-404-js\",\"948\":\"2cca2479\",\"970\":\"component---src-pages-using-typescript-tsx\",\"989\":\"component---src-templates-blog-post-js\"}[chunkId] + \"-\" + {\"351\":\"d49ee9efd1044c30a9da\",\"501\":\"5c21a365d688463f3898\",\"678\":\"39a1a0f79cf5786e617b\",\"682\":\"3f600f2fd850bd382202\",\"883\":\"46780dec3ea827d4d8e6\",\"948\":\"adaf2bdc94643feadca8\",\"970\":\"0e780893e2657d08bb50\",\"989\":\"6602a7d8cfc7be2778f4\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"7d6cd8f07fdbd498b042\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkskohub_blog\"] = self[\"webpackChunkskohub_blog\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json new file mode 100644 index 0000000..c39143a --- /dev/null +++ b/webpack.stats.json @@ -0,0 +1 @@ +{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-8c179305cae52ad85711.js","size":4121},{"name":"framework-f5cf36c7d70977c4e569.js","size":140725},{"name":"styles.7d6cd8f07fdbd498b042.css","size":20399},{"name":"app-fe620b60292e32d725ed.js","size":69591}],"filteredAssets":0,"assetsSize":234836,"filteredAuxiliaryAssets":65,"auxiliaryAssetsSize":2206125},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-pages-404-js-46780dec3ea827d4d8e6.js","size":565}],"filteredAssets":0,"assetsSize":89568,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":795546},"component---src-pages-about-js":{"name":"component---src-pages-about-js","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-pages-about-js-3f600f2fd850bd382202.js","size":2179}],"filteredAssets":0,"assetsSize":91182,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":797585},"component---src-pages-contact-js":{"name":"component---src-pages-contact-js","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-pages-contact-js-5c21a365d688463f3898.js","size":1372}],"filteredAssets":0,"assetsSize":90375,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":796921},"component---src-pages-index-js":{"name":"component---src-pages-index-js","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-pages-index-js-39a1a0f79cf5786e617b.js","size":2162}],"filteredAssets":0,"assetsSize":91165,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":800386},"component---src-pages-using-typescript-tsx":{"name":"component---src-pages-using-typescript-tsx","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-pages-using-typescript-tsx-0e780893e2657d08bb50.js","size":1346}],"filteredAssets":0,"assetsSize":90349,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":796768},"component---src-templates-blog-post-js":{"name":"component---src-templates-blog-post-js","assets":[{"name":"2cca2479-adaf2bdc94643feadca8.js","size":2637},{"name":"commons-d49ee9efd1044c30a9da.js","size":86366},{"name":"component---src-templates-blog-post-js-6602a7d8cfc7be2778f4.js","size":2065}],"filteredAssets":0,"assetsSize":91068,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":800597}},"assetsByChunkName":{"app":["webpack-runtime-8c179305cae52ad85711.js","framework-f5cf36c7d70977c4e569.js","styles.7d6cd8f07fdbd498b042.css","app-fe620b60292e32d725ed.js"],"component---src-pages-404-js":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-pages-404-js-46780dec3ea827d4d8e6.js"],"component---src-pages-about-js":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-pages-about-js-3f600f2fd850bd382202.js"],"component---src-pages-contact-js":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-pages-contact-js-5c21a365d688463f3898.js"],"component---src-pages-index-js":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-pages-index-js-39a1a0f79cf5786e617b.js"],"component---src-pages-using-typescript-tsx":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-pages-using-typescript-tsx-0e780893e2657d08bb50.js"],"component---src-templates-blog-post-js":["2cca2479-adaf2bdc94643feadca8.js","commons-d49ee9efd1044c30a9da.js","component---src-templates-blog-post-js-6602a7d8cfc7be2778f4.js"]},"childAssetsByChunkName":{}} \ No newline at end of file diff --git a/~partytown/debug/partytown-atomics.js b/~partytown/debug/partytown-atomics.js new file mode 100644 index 0000000..307e3b9 --- /dev/null +++ b/~partytown/debug/partytown-atomics.js @@ -0,0 +1,572 @@ +/* Partytown 0.7.5 - MIT builder.io */ +(window => { + const isPromise = v => "object" == typeof v && v && v.then; + const noop = () => {}; + const len = obj => obj.length; + const getConstructorName = obj => { + var _a, _b, _c; + try { + const constructorName = null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a ? void 0 : _a.name; + if (constructorName) { + return constructorName; + } + } catch (e) {} + try { + const zoneJsConstructorName = null === (_c = null === (_b = null == obj ? void 0 : obj.__zone_symbol__originalInstance) || void 0 === _b ? void 0 : _b.constructor) || void 0 === _c ? void 0 : _c.name; + if (zoneJsConstructorName) { + return zoneJsConstructorName; + } + } catch (e) {} + return ""; + }; + const startsWith = (str, val) => str.startsWith(val); + const isValidMemberName = memberName => !(startsWith(memberName, "webkit") || startsWith(memberName, "toJSON") || startsWith(memberName, "constructor") || startsWith(memberName, "toString") || startsWith(memberName, "_")); + const getNodeName = node => 11 === node.nodeType && node.host ? "#s" : node.nodeName; + const randomId = () => Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36); + const defineConstructorName = (Cstr, value) => ((obj, memberName, descriptor) => Object.defineProperty(obj, memberName, { + ...descriptor, + configurable: true + }))(Cstr, "name", { + value: value + }); + const htmlConstructorTags = { + Anchor: "a", + DList: "dl", + Image: "img", + OList: "ol", + Paragraph: "p", + Quote: "q", + TableCaption: "caption", + TableCell: "td", + TableCol: "colgroup", + TableRow: "tr", + TableSection: "tbody", + UList: "ul" + }; + const svgConstructorTags = { + Graphics: "g", + SVG: "svg" + }; + const InstanceIdKey = Symbol(); + const CreatedKey = Symbol(); + const instances = new Map; + const mainRefs = new Map; + const winCtxs = {}; + const windowIds = new WeakMap; + const getAndSetInstanceId = (instance, instanceId) => { + if (instance) { + if (instanceId = windowIds.get(instance)) { + return instanceId; + } + (instanceId = instance[InstanceIdKey]) || setInstanceId(instance, instanceId = randomId()); + return instanceId; + } + }; + const getInstance = (winId, instanceId, win, doc, docId) => { + if ((win = winCtxs[winId]) && win.$window$) { + if (winId === instanceId) { + return win.$window$; + } + doc = win.$window$.document; + docId = instanceId.split(".").pop(); + if ("d" === docId) { + return doc; + } + if ("e" === docId) { + return doc.documentElement; + } + if ("h" === docId) { + return doc.head; + } + if ("b" === docId) { + return doc.body; + } + } + return instances.get(instanceId); + }; + const setInstanceId = (instance, instanceId, now) => { + if (instance) { + instances.set(instanceId, instance); + instance[InstanceIdKey] = instanceId; + instance[CreatedKey] = now = Date.now(); + if (now > lastCleanup + 5e3) { + instances.forEach(((storedInstance, instanceId) => { + storedInstance[CreatedKey] < lastCleanup && storedInstance.nodeType && !storedInstance.isConnected && instances.delete(instanceId); + })); + lastCleanup = now; + } + } + }; + let lastCleanup = 0; + const mainWindow = window.parent; + const docImpl = document.implementation.createHTMLDocument(); + const config = mainWindow.partytown || {}; + const libPath = (config.lib || "/~partytown/") + "debug/"; + const logMain = msg => { + console.debug.apply(console, [ "%cMain 🌎", "background: #717171; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;", msg ]); + }; + const winIds = []; + const normalizedWinId = winId => { + winIds.includes(winId) || winIds.push(winId); + return winIds.indexOf(winId) + 1; + }; + const defineCustomElement = (winId, worker, ceData) => { + const Cstr = defineConstructorName(class extends winCtxs[winId].$window$.HTMLElement {}, ceData[0]); + const ceCallbackMethods = "connectedCallback,disconnectedCallback,attributeChangedCallback,adoptedCallback".split(","); + ceCallbackMethods.map((callbackMethodName => Cstr.prototype[callbackMethodName] = function(...args) { + worker.postMessage([ 15, winId, getAndSetInstanceId(this), callbackMethodName, args ]); + })); + Cstr.observedAttributes = ceData[1]; + return Cstr; + }; + const serializeForWorker = ($winId$, value, added, type, cstrName) => void 0 !== value && (type = typeof value) ? "string" === type || "number" === type || "boolean" === type || null == value ? [ 0, value ] : "function" === type ? [ 6 ] : (added = added || new Set) && Array.isArray(value) ? added.has(value) ? [ 1, [] ] : added.add(value) && [ 1, value.map((v => serializeForWorker($winId$, v, added))) ] : "object" === type ? serializedValueIsError(value) ? [ 14, { + name: value.name, + message: value.message, + stack: value.stack + } ] : "" === (cstrName = getConstructorName(value)) ? [ 2, {} ] : "Window" === cstrName ? [ 3, [ $winId$, $winId$ ] ] : "HTMLCollection" === cstrName || "NodeList" === cstrName ? [ 7, Array.from(value).map((v => serializeForWorker($winId$, v, added)[1])) ] : cstrName.endsWith("Event") ? [ 5, serializeObjectForWorker($winId$, value, added) ] : "CSSRuleList" === cstrName ? [ 12, Array.from(value).map(serializeCssRuleForWorker) ] : startsWith(cstrName, "CSS") && cstrName.endsWith("Rule") ? [ 11, serializeCssRuleForWorker(value) ] : "CSSStyleDeclaration" === cstrName ? [ 13, serializeObjectForWorker($winId$, value, added) ] : "Attr" === cstrName ? [ 10, [ value.name, value.value ] ] : value.nodeType ? [ 3, [ $winId$, getAndSetInstanceId(value), getNodeName(value) ] ] : [ 2, serializeObjectForWorker($winId$, value, added, true, true) ] : void 0 : value; + const serializeObjectForWorker = (winId, obj, added, includeFunctions, includeEmptyStrings, serializedObj, propName, propValue) => { + serializedObj = {}; + if (!added.has(obj)) { + added.add(obj); + for (propName in obj) { + if (isValidMemberName(propName)) { + propValue = "path" === propName && getConstructorName(obj).endsWith("Event") ? obj.composedPath() : obj[propName]; + (includeFunctions || "function" != typeof propValue) && (includeEmptyStrings || "" !== propValue) && (serializedObj[propName] = serializeForWorker(winId, propValue, added)); + } + } + } + return serializedObj; + }; + const serializeCssRuleForWorker = cssRule => { + let obj = {}; + let key; + for (key in cssRule) { + validCssRuleProps.includes(key) && (obj[key] = String(cssRule[key])); + } + return obj; + }; + const serializedValueIsError = value => value instanceof window.top.Error; + const deserializeFromWorker = (worker, serializedTransfer, serializedType, serializedValue) => { + if (serializedTransfer) { + serializedType = serializedTransfer[0]; + serializedValue = serializedTransfer[1]; + return 0 === serializedType ? serializedValue : 4 === serializedType ? deserializeRefFromWorker(worker, serializedValue) : 1 === serializedType ? serializedValue.map((v => deserializeFromWorker(worker, v))) : 3 === serializedType ? getInstance(serializedValue[0], serializedValue[1]) : 5 === serializedType ? constructEvent(deserializeObjectFromWorker(worker, serializedValue)) : 2 === serializedType ? deserializeObjectFromWorker(worker, serializedValue) : 8 === serializedType ? serializedValue : 9 === serializedType ? new window[serializedTransfer[2]](serializedValue) : void 0; + } + }; + const deserializeRefFromWorker = (worker, {$winId$: $winId$, $instanceId$: $instanceId$, $refId$: $refId$}, ref) => { + ref = mainRefs.get($refId$); + if (!ref) { + ref = function(...args) { + worker.postMessage([ 9, { + $winId$: $winId$, + $instanceId$: $instanceId$, + $refId$: $refId$, + $thisArg$: serializeForWorker($winId$, this), + $args$: serializeForWorker($winId$, args) + } ]); + }; + mainRefs.set($refId$, ref); + } + return ref; + }; + const constructEvent = eventProps => new ("detail" in eventProps ? CustomEvent : Event)(eventProps.type, eventProps); + const deserializeObjectFromWorker = (worker, serializedValue, obj, key) => { + obj = {}; + for (key in serializedValue) { + obj[key] = deserializeFromWorker(worker, serializedValue[key]); + } + return obj; + }; + const validCssRuleProps = "cssText,selectorText,href,media,namespaceURI,prefix,name,conditionText".split(","); + const mainAccessHandler = async (worker, accessReq) => { + let accessRsp = { + $msgId$: accessReq.$msgId$ + }; + let totalTasks = len(accessReq.$tasks$); + let i = 0; + let task; + let winId; + let applyPath; + let instance; + let rtnValue; + let isLast; + for (;i < totalTasks; i++) { + try { + isLast = i === totalTasks - 1; + task = accessReq.$tasks$[i]; + winId = task.$winId$; + applyPath = task.$applyPath$; + !winCtxs[winId] && winId.startsWith("f_") && await new Promise((resolve => { + let check = 0; + let callback = () => { + winCtxs[winId] || check++ > 1e3 ? resolve() : requestAnimationFrame(callback); + }; + callback(); + })); + if (1 === applyPath[0] && applyPath[1] in winCtxs[winId].$window$) { + setInstanceId(new winCtxs[winId].$window$[applyPath[1]](...deserializeFromWorker(worker, applyPath[2])), task.$instanceId$); + } else { + instance = getInstance(winId, task.$instanceId$); + if (instance) { + rtnValue = applyToInstance(worker, winId, instance, applyPath, isLast, task.$groupedGetters$); + task.$assignInstanceId$ && ("string" == typeof task.$assignInstanceId$ ? setInstanceId(rtnValue, task.$assignInstanceId$) : winCtxs[task.$assignInstanceId$.$winId$] = { + $winId$: task.$assignInstanceId$.$winId$, + $window$: { + document: rtnValue + } + }); + if (isPromise(rtnValue)) { + rtnValue = await rtnValue; + isLast && (accessRsp.$isPromise$ = true); + } + isLast && (accessRsp.$rtnValue$ = serializeForWorker(winId, rtnValue)); + } else { + accessRsp.$error$ = `Error finding instance "${task.$instanceId$}" on window ${normalizedWinId(winId)}`; + console.error(accessRsp.$error$, task); + } + } + } catch (e) { + isLast ? accessRsp.$error$ = String(e.stack || e) : console.error(e); + } + } + return accessRsp; + }; + const applyToInstance = (worker, winId, instance, applyPath, isLast, groupedGetters) => { + let i = 0; + let l = len(applyPath); + let next; + let current; + let previous; + let args; + let groupedRtnValues; + for (;i < l; i++) { + current = applyPath[i]; + next = applyPath[i + 1]; + previous = applyPath[i - 1]; + try { + if (!Array.isArray(next)) { + if ("string" == typeof current || "number" == typeof current) { + if (i + 1 === l && groupedGetters) { + groupedRtnValues = {}; + groupedGetters.map((propName => groupedRtnValues[propName] = instance[propName])); + return groupedRtnValues; + } + instance = instance[current]; + } else { + if (0 === next) { + instance[previous] = deserializeFromWorker(worker, current); + return; + } + if ("function" == typeof instance[previous]) { + args = deserializeFromWorker(worker, current); + "define" === previous && "CustomElementRegistry" === getConstructorName(instance) && (args[1] = defineCustomElement(winId, worker, args[1])); + "insertRule" === previous && args[1] > len(instance.cssRules) && (args[1] = len(instance.cssRules)); + instance = instance[previous].apply(instance, args); + if ("play" === previous) { + return Promise.resolve(); + } + } + } + } + } catch (err) { + if (isLast) { + throw err; + } + console.debug("Non-blocking setter error:", err); + } + } + return instance; + }; + const readNextScript = (worker, winCtx) => { + let $winId$ = winCtx.$winId$; + let win = winCtx.$window$; + let doc = win.document; + let scriptSelector = 'script[type="text/partytown"]:not([data-ptid]):not([data-pterror])'; + let scriptElm; + let $instanceId$; + let scriptData; + if (doc && doc.body) { + scriptElm = doc.querySelector('script[type="text/partytown"]:not([data-ptid]):not([data-pterror]):not([async]):not([defer])'); + scriptElm || (scriptElm = doc.querySelector(scriptSelector)); + if (scriptElm) { + scriptElm.dataset.ptid = $instanceId$ = getAndSetInstanceId(scriptElm, $winId$); + scriptData = { + $winId$: $winId$, + $instanceId$: $instanceId$ + }; + if (scriptElm.src) { + scriptData.$url$ = scriptElm.src; + scriptData.$orgUrl$ = scriptElm.dataset.ptsrc || scriptElm.src; + } else { + scriptData.$content$ = scriptElm.innerHTML; + } + worker.postMessage([ 7, scriptData ]); + } else { + if (!winCtx.$isInitialized$) { + winCtx.$isInitialized$ = 1; + ((worker, $winId$, win) => { + let queuedForwardCalls = win._ptf; + let forwards = (win.partytown || {}).forward || []; + let i; + let mainForwardFn; + let forwardCall = ($forward$, args) => worker.postMessage([ 10, { + $winId$: $winId$, + $forward$: $forward$, + $args$: serializeForWorker($winId$, Array.from(args)) + } ]); + win._ptf = void 0; + forwards.map((forwardProps => { + mainForwardFn = win; + forwardProps.split(".").map(((_, i, arr) => { + mainForwardFn = mainForwardFn[arr[i]] = i + 1 < len(arr) ? mainForwardFn[arr[i]] || ("push" === arr[i + 1] ? [] : {}) : (...args) => forwardCall(arr, args); + })); + })); + if (queuedForwardCalls) { + for (i = 0; i < len(queuedForwardCalls); i += 2) { + forwardCall(queuedForwardCalls[i], queuedForwardCalls[i + 1]); + } + } + })(worker, $winId$, win); + doc.dispatchEvent(new CustomEvent("pt0")); + { + const winType = win === win.top ? "top" : "iframe"; + logMain(`Executed ${winType} window ${normalizedWinId($winId$)} environment scripts in ${(performance.now() - winCtx.$startTime$).toFixed(1)}ms`); + } + } + worker.postMessage([ 8, $winId$ ]); + } + } else { + requestAnimationFrame((() => readNextScript(worker, winCtx))); + } + }; + const registerWindow = (worker, $winId$, $window$) => { + if (!windowIds.has($window$)) { + windowIds.set($window$, $winId$); + const doc = $window$.document; + const history = $window$.history; + const $parentWinId$ = windowIds.get($window$.parent); + let initialised = false; + const onInitialisedQueue = []; + const onInitialised = callback => { + initialised ? callback() : onInitialisedQueue.push(callback); + }; + const sendInitEnvData = () => { + worker.postMessage([ 5, { + $winId$: $winId$, + $parentWinId$: $parentWinId$, + $url$: doc.baseURI, + $visibilityState$: doc.visibilityState + } ]); + setTimeout((() => { + initialised = true; + onInitialisedQueue.forEach((callback => { + callback(); + })); + })); + }; + const pushState = history.pushState.bind(history); + const replaceState = history.replaceState.bind(history); + const onLocationChange = (type, state, newUrl, oldUrl) => () => { + setTimeout((() => { + worker.postMessage([ 13, { + $winId$: $winId$, + type: type, + state: state, + url: doc.baseURI, + newUrl: newUrl, + oldUrl: oldUrl + } ]); + })); + }; + history.pushState = (state, _, newUrl) => { + pushState(state, _, newUrl); + onInitialised(onLocationChange(0, state, null == newUrl ? void 0 : newUrl.toString())); + }; + history.replaceState = (state, _, newUrl) => { + replaceState(state, _, newUrl); + onInitialised(onLocationChange(1, state, null == newUrl ? void 0 : newUrl.toString())); + }; + $window$.addEventListener("popstate", (event => { + onInitialised(onLocationChange(2, event.state)); + })); + $window$.addEventListener("hashchange", (event => { + onInitialised(onLocationChange(3, {}, event.newURL, event.oldURL)); + })); + $window$.addEventListener("ptupdate", (() => { + readNextScript(worker, winCtxs[$winId$]); + })); + doc.addEventListener("visibilitychange", (() => worker.postMessage([ 14, $winId$, doc.visibilityState ]))); + winCtxs[$winId$] = { + $winId$: $winId$, + $window$: $window$ + }; + winCtxs[$winId$].$startTime$ = performance.now(); + { + const winType = $winId$ === $parentWinId$ ? "top" : "iframe"; + logMain(`Registered ${winType} window ${normalizedWinId($winId$)}`); + } + "complete" === doc.readyState ? sendInitEnvData() : $window$.addEventListener("load", sendInitEnvData); + } + }; + const onMessageFromWebWorker = (worker, msg, winCtx) => { + if (4 === msg[0]) { + registerWindow(worker, randomId(), mainWindow); + } else { + winCtx = winCtxs[msg[1]]; + winCtx && (7 === msg[0] ? requestAnimationFrame((() => readNextScript(worker, winCtx))) : 6 === msg[0] && ((worker, winCtx, instanceId, errorMsg, scriptElm) => { + scriptElm = winCtx.$window$.document.querySelector(`[data-ptid="${instanceId}"]`); + if (scriptElm) { + errorMsg ? scriptElm.dataset.pterror = errorMsg : scriptElm.type += "-x"; + delete scriptElm.dataset.ptid; + } + readNextScript(worker, winCtx); + })(worker, winCtx, msg[2], msg[3])); + } + }; + const readMainInterfaces = () => { + const elms = Object.getOwnPropertyNames(mainWindow).map((interfaceName => ((doc, interfaceName, r, tag) => { + r = interfaceName.match(/^(HTML|SVG)(.+)Element$/); + if (r) { + tag = r[2]; + return "S" == interfaceName[0] ? doc.createElementNS("http://www.w3.org/2000/svg", svgConstructorTags[tag] || tag.slice(0, 2).toLowerCase() + tag.slice(2)) : doc.createElement(htmlConstructorTags[tag] || tag); + } + })(docImpl, interfaceName))).filter((elm => elm)).map((elm => [ elm ])); + return readImplementations(elms, []); + }; + const cstrs = new Set([ "Object" ]); + const readImplementations = (impls, interfaces) => { + const cstrImpls = impls.filter((implData => implData[0])).map((implData => { + const impl = implData[0]; + const interfaceType = implData[1]; + const cstrName = getConstructorName(impl); + const CstrPrototype = mainWindow[cstrName].prototype; + return [ cstrName, CstrPrototype, impl, interfaceType ]; + })); + cstrImpls.map((([cstrName, CstrPrototype, impl, intefaceType]) => readOwnImplementation(cstrs, interfaces, cstrName, CstrPrototype, impl, intefaceType))); + return interfaces; + }; + const readImplementation = (cstrName, impl, memberName) => { + let interfaceMembers = []; + let interfaceInfo = [ cstrName, "Object", interfaceMembers ]; + for (memberName in impl) { + readImplementationMember(interfaceMembers, impl, memberName); + } + return interfaceInfo; + }; + const readOwnImplementation = (cstrs, interfaces, cstrName, CstrPrototype, impl, interfaceType) => { + if (!cstrs.has(cstrName)) { + cstrs.add(cstrName); + const SuperCstr = Object.getPrototypeOf(CstrPrototype); + const superCstrName = getConstructorName(SuperCstr); + const interfaceMembers = []; + const propDescriptors = Object.getOwnPropertyDescriptors(CstrPrototype); + readOwnImplementation(cstrs, interfaces, superCstrName, SuperCstr, impl, interfaceType); + for (const memberName in propDescriptors) { + readImplementationMember(interfaceMembers, impl, memberName); + } + interfaces.push([ cstrName, superCstrName, interfaceMembers, interfaceType, getNodeName(impl) ]); + } + }; + const readImplementationMember = (interfaceMembers, implementation, memberName, value, memberType, cstrName) => { + try { + if (isValidMemberName(memberName) && isNaN(memberName[0]) && "all" !== memberName) { + value = implementation[memberName]; + memberType = typeof value; + if ("function" === memberType) { + (String(value).includes("[native") || Object.getPrototypeOf(implementation)[memberName]) && interfaceMembers.push([ memberName, 5 ]); + } else if ("object" === memberType && null != value) { + cstrName = getConstructorName(value); + "Object" !== cstrName && self[cstrName] && interfaceMembers.push([ memberName, value.nodeType || cstrName ]); + } else { + "symbol" !== memberType && (memberName.toUpperCase() === memberName ? interfaceMembers.push([ memberName, 6, value ]) : interfaceMembers.push([ memberName, 6 ])); + } + } + } catch (e) { + console.warn(e); + } + }; + const readStorage = storageName => { + let items = []; + let i = 0; + let l = len(mainWindow[storageName]); + let key; + for (;i < l; i++) { + key = mainWindow[storageName].key(i); + items.push([ key, mainWindow[storageName].getItem(key) ]); + } + return items; + }; + const getGlobalConstructor = (mainWindow, cstrName) => void 0 !== mainWindow[cstrName] ? new mainWindow[cstrName](noop) : 0; + const addGlobalConstructorUsingPrototype = ($interfaces$, mainWindow, cstrName) => { + void 0 !== mainWindow[cstrName] && $interfaces$.push([ cstrName, "Object", Object.keys(mainWindow[cstrName].prototype).map((propName => [ propName, 6 ])), 12 ]); + }; + let worker; + (async receiveMessage => { + const sharedDataBuffer = new SharedArrayBuffer(1073741824); + const sharedData = new Int32Array(sharedDataBuffer); + return (worker, msg) => { + const msgType = msg[0]; + const accessReq = msg[1]; + if (0 === msgType) { + const initData = (() => { + const elm = docImpl.createElement("i"); + const textNode = docImpl.createTextNode(""); + const comment = docImpl.createComment(""); + const frag = docImpl.createDocumentFragment(); + const shadowRoot = docImpl.createElement("p").attachShadow({ + mode: "open" + }); + const intersectionObserver = getGlobalConstructor(mainWindow, "IntersectionObserver"); + const mutationObserver = getGlobalConstructor(mainWindow, "MutationObserver"); + const resizeObserver = getGlobalConstructor(mainWindow, "ResizeObserver"); + const perf = mainWindow.performance; + const screen = mainWindow.screen; + const impls = [ [ mainWindow.history ], [ perf ], [ perf.navigation ], [ perf.timing ], [ screen ], [ screen.orientation ], [ mainWindow.visualViewport ], [ intersectionObserver, 12 ], [ mutationObserver, 12 ], [ resizeObserver, 12 ], [ textNode ], [ comment ], [ frag ], [ shadowRoot ], [ elm ], [ elm.attributes ], [ elm.classList ], [ elm.dataset ], [ elm.style ], [ docImpl ], [ docImpl.doctype ] ]; + const initialInterfaces = [ readImplementation("Window", mainWindow), readImplementation("Node", textNode) ]; + const $config$ = JSON.stringify(config, ((k, v) => { + if ("function" == typeof v) { + v = String(v); + v.startsWith(k + "(") && (v = "function " + v); + } + return v; + })); + const initWebWorkerData = { + $config$: $config$, + $interfaces$: readImplementations(impls, initialInterfaces), + $libPath$: new URL(libPath, mainWindow.location) + "", + $origin$: origin, + $localStorage$: readStorage("localStorage"), + $sessionStorage$: readStorage("sessionStorage") + }; + addGlobalConstructorUsingPrototype(initWebWorkerData.$interfaces$, mainWindow, "IntersectionObserverEntry"); + return initWebWorkerData; + })(); + initData.$sharedDataBuffer$ = sharedDataBuffer; + worker.postMessage([ 1, initData ]); + } else { + 2 === msg[0] ? worker.postMessage([ 3, readMainInterfaces() ]) : 11 === msgType ? receiveMessage(accessReq, (accessRsp => { + const stringifiedData = JSON.stringify(accessRsp); + const stringifiedDataLength = stringifiedData.length; + for (let i = 0; i < stringifiedDataLength; i++) { + sharedData[i + 1] = stringifiedData.charCodeAt(i); + } + sharedData[0] = stringifiedDataLength; + Atomics.notify(sharedData, 0); + })) : onMessageFromWebWorker(worker, msg); + } + }; + })(((accessReq, responseCallback) => mainAccessHandler(worker, accessReq).then(responseCallback))).then((onMessageHandler => { + if (onMessageHandler) { + worker = new Worker(libPath + "partytown-ww-atomics.js?v=0.7.5", { + name: "Partytown 🎉" + }); + worker.onmessage = ev => { + const msg = ev.data; + 12 === msg[0] ? mainAccessHandler(worker, msg[1]) : onMessageHandler(worker, msg); + }; + logMain("Created Partytown web worker (0.7.5)"); + worker.onerror = ev => console.error("Web Worker Error", ev); + mainWindow.addEventListener("pt1", (ev => registerWindow(worker, getAndSetInstanceId(ev.detail.frameElement), ev.detail))); + } + })); +})(window); diff --git a/~partytown/debug/partytown-media.js b/~partytown/debug/partytown-media.js new file mode 100644 index 0000000..5c43065 --- /dev/null +++ b/~partytown/debug/partytown-media.js @@ -0,0 +1,374 @@ +/* Partytown 0.7.5 - MIT builder.io */ +(self => { + const [getter, setter, callMethod, constructGlobal, definePrototypePropertyDescriptor, randomId, WinIdKey, InstanceIdKey, ApplyPathKey] = self.$bridgeToMedia$; + delete self.$bridgeToMedia$; + const ContextKey = Symbol(); + const MediaSourceKey = Symbol(); + const ReadyStateKey = Symbol(); + const SourceBuffersKey = Symbol(); + const SourceBufferTasksKey = Symbol(); + const TimeRangesKey = Symbol(); + const EMPTY_ARRAY = []; + const defineCstr = (win, cstrName, Cstr) => win[cstrName] = defineCstrName(cstrName, Cstr); + const defineCstrName = (cstrName, Cstr) => Object.defineProperty(Cstr, "name", { + value: cstrName + }); + const initCanvas = (WorkerBase, win) => { + const HTMLCanvasDescriptorMap = { + getContext: { + value(contextType, contextAttributes) { + this[ContextKey] || (this[ContextKey] = (contextType.includes("webgl") ? createContextWebGL : createContext2D)(this, contextType, contextAttributes)); + return this[ContextKey]; + } + } + }; + const WorkerCanvasGradient = defineCstr(win, "CanvasGradient", class extends WorkerBase { + addColorStop(...args) { + callMethod(this, [ "addColorStop" ], args, 2); + } + }); + const WorkerCanvasPattern = defineCstr(win, "CanvasPattern", class extends WorkerBase { + setTransform(...args) { + callMethod(this, [ "setTransform" ], args, 2); + } + }); + const createContext2D = (canvasInstance, contextType, contextAttributes) => { + const winId = canvasInstance[WinIdKey]; + const ctxInstanceId = randomId(); + const ctxInstance = { + [WinIdKey]: winId, + [InstanceIdKey]: ctxInstanceId, + [ApplyPathKey]: [] + }; + const ctx = callMethod(canvasInstance, [ "getContext" ], [ contextType, contextAttributes ], 1, ctxInstanceId); + const ctx2dGetterMethods = "getContextAttributes,getImageData,getLineDash,getTransform,isPointInPath,isPointInStroke,measureText".split(","); + const CanvasRenderingContext2D = { + get: (target, propName) => "string" == typeof propName && propName in ctx ? "function" == typeof ctx[propName] ? (...args) => { + if (propName.startsWith("create")) { + const instanceId = randomId(); + callMethod(ctxInstance, [ propName ], args, 2, instanceId); + if ("createImageData" === propName || "createPattern" === propName) { + (api => { + console.warn(`${api} not implemented`); + })(`${propName}()`); + return { + setTransform: () => {} + }; + } + return new WorkerCanvasGradient(winId, instanceId); + } + const methodCallType = ctx2dGetterMethods.includes(propName) ? 1 : 2; + return callMethod(ctxInstance, [ propName ], args, methodCallType); + } : ctx[propName] : target[propName], + set(target, propName, value) { + if ("string" == typeof propName && propName in ctx) { + ctx[propName] !== value && "function" != typeof value && setter(ctxInstance, [ propName ], value); + ctx[propName] = value; + } else { + target[propName] = value; + } + return true; + } + }; + return new Proxy(ctx, CanvasRenderingContext2D); + }; + const createContextWebGL = (canvasInstance, contextType, contextAttributes) => { + const winId = canvasInstance[WinIdKey]; + const ctxInstanceId = randomId(); + const ctxInstance = { + [WinIdKey]: winId, + [InstanceIdKey]: ctxInstanceId, + [ApplyPathKey]: [] + }; + const ctx = callMethod(canvasInstance, [ "getContext" ], [ contextType, contextAttributes ], 1, ctxInstanceId); + const WebGLRenderingContextHandler = { + get: (target, propName) => "string" == typeof propName ? "function" != typeof ctx[propName] ? ctx[propName] : (...args) => callMethod(ctxInstance, [ propName ], args, getWebGlMethodCallType(propName)) : target[propName], + set(target, propName, value) { + if ("string" == typeof propName && propName in ctx) { + ctx[propName] !== value && "function" != typeof value && setter(ctxInstance, [ propName ], value); + ctx[propName] = value; + } else { + target[propName] = value; + } + return true; + } + }; + return new Proxy(ctx, WebGLRenderingContextHandler); + }; + const ctxWebGLGetterMethods = "checkFramebufferStatus,makeXRCompatible".split(","); + const getWebGlMethodCallType = methodName => methodName.startsWith("create") || methodName.startsWith("get") || methodName.startsWith("is") || ctxWebGLGetterMethods.includes(methodName) ? 1 : 2; + defineCstr(win, "CanvasGradient", WorkerCanvasGradient); + defineCstr(win, "CanvasPattern", WorkerCanvasPattern); + definePrototypePropertyDescriptor(win.HTMLCanvasElement, HTMLCanvasDescriptorMap); + }; + const initMedia = (WorkerBase, WorkerEventTargetProxy, env, win) => { + var _a, _b; + win.Audio = defineCstrName("HTMLAudioElement", class { + constructor(src) { + const audio = env.$createNode$("audio", randomId()); + audio.src = src; + return audio; + } + }); + const WorkerAudioTrack = class extends WorkerBase { + get enabled() { + return getter(this, [ "enabled" ]); + } + set enabled(value) { + setter(this, [ "enabled" ], value); + } + get id() { + return getter(this, [ "id" ]); + } + get kind() { + return getter(this, [ "kind" ]); + } + get label() { + return getter(this, [ "label" ]); + } + get language() { + return getter(this, [ "language" ]); + } + get sourceBuffer() { + return new WorkerSourceBuffer(this); + } + }; + const WorkerAudioTrackList = class { + constructor(mediaElm) { + const winId = mediaElm[WinIdKey]; + const instanceId = mediaElm[InstanceIdKey]; + const instance = { + addEventListener(...args) { + callMethod(mediaElm, [ "audioTracks", "addEventListener" ], args, 3); + }, + getTrackById: (...args) => callMethod(mediaElm, [ "audioTracks", "getTrackById" ], args), + get length() { + return getter(mediaElm, [ "audioTracks", "length" ]); + }, + removeEventListener(...args) { + callMethod(mediaElm, [ "audioTracks", "removeEventListener" ], args, 3); + } + }; + return new Proxy(instance, { + get: (target, propName) => "number" == typeof propName ? new WorkerAudioTrack(winId, instanceId, [ "audioTracks", propName ]) : target[propName] + }); + } + }; + const WorkerSourceBufferList = defineCstr(win, "SourceBufferList", class extends Array { + constructor(mediaSource) { + super(); + this[MediaSourceKey] = mediaSource; + } + addEventListener(...args) { + callMethod(this[MediaSourceKey], [ "sourceBuffers", "addEventListener" ], args, 3); + } + removeEventListener(...args) { + callMethod(this[MediaSourceKey], [ "sourceBuffers", "removeEventListener" ], args, 3); + } + }); + const WorkerSourceBuffer = defineCstr(win, "SourceBuffer", (_b = class extends WorkerEventTargetProxy { + constructor(mediaSource) { + super(mediaSource[WinIdKey], mediaSource[InstanceIdKey], [ "sourceBuffers" ]); + this[_a] = []; + this[MediaSourceKey] = mediaSource; + } + abort() { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "appendWindowStart" ], EMPTY_ARRAY, 1); + } + addEventListener(...args) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "addEventListener" ], args, 3); + } + appendBuffer(buf) { + this[SourceBufferTasksKey].push([ "appendBuffer", [ buf ], buf ]); + drainSourceBufferQueue(this); + } + get appendWindowStart() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "appendWindowStart" ]); + } + set appendWindowStart(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "appendWindowStart" ], value); + } + get appendWindowEnd() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "appendWindowEnd" ]); + } + set appendWindowEnd(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "appendWindowEnd" ], value); + } + get buffered() { + const mediaSource = this[MediaSourceKey]; + const sbIndex = getSourceBufferIndex(this); + const timeRanges = new WorkerTimeRanges(mediaSource[WinIdKey], mediaSource[InstanceIdKey], [ "sourceBuffers", sbIndex, "buffered" ]); + return timeRanges; + } + changeType(mimeType) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "changeType" ], [ mimeType ], 2); + } + get mode() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "mode" ]); + } + set mode(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "mode" ], value); + } + remove(start, end) { + this[SourceBufferTasksKey].push([ "remove", [ start, end ] ]); + drainSourceBufferQueue(this); + } + removeEventListener(...args) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "removeEventListener" ], args, 3); + } + get timestampOffset() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "timestampOffset" ]); + } + set timestampOffset(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "timestampOffset" ], value); + } + get updating() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "updating" ]); + } + }, _a = SourceBufferTasksKey, _b)); + const WorkerTimeRanges = defineCstr(win, "TimeRanges", class extends WorkerBase { + start(...args) { + return callMethod(this, [ "start" ], args); + } + end(...args) { + return callMethod(this, [ "end" ], args); + } + get length() { + return getter(this, [ "length" ]); + } + }); + const getSourceBufferIndex = sourceBuffer => { + if (sourceBuffer) { + const mediaSource = sourceBuffer[MediaSourceKey]; + const sourceBufferList = mediaSource[SourceBuffersKey]; + return sourceBufferList.indexOf(sourceBuffer); + } + return -1; + }; + const drainSourceBufferQueue = sourceBuffer => { + if (sourceBuffer[SourceBufferTasksKey].length) { + if (!sourceBuffer.updating) { + const task = sourceBuffer[SourceBufferTasksKey].shift(); + if (task) { + const sbIndex = getSourceBufferIndex(sourceBuffer); + callMethod(sourceBuffer, [ sbIndex, task[0] ], task[1], 3, void 0, task[2]); + } + } + setTimeout((() => drainSourceBufferQueue(sourceBuffer)), 50); + } + }; + const HTMLMediaDescriptorMap = { + buffered: { + get() { + if (!this[TimeRangesKey]) { + this[TimeRangesKey] = new WorkerTimeRanges(this[WinIdKey], this[InstanceIdKey], [ "buffered" ]); + setTimeout((() => { + this[TimeRangesKey] = void 0; + }), 5e3); + } + return this[TimeRangesKey]; + } + }, + readyState: { + get() { + if (4 === this[ReadyStateKey]) { + return 4; + } + if ("number" != typeof this[ReadyStateKey]) { + this[ReadyStateKey] = getter(this, [ "readyState" ]); + setTimeout((() => { + this[ReadyStateKey] = void 0; + }), 1e3); + } + return this[ReadyStateKey]; + } + } + }; + defineCstr(win, "MediaSource", class extends WorkerEventTargetProxy { + constructor() { + super(env.$winId$); + this[SourceBuffersKey] = new WorkerSourceBufferList(this); + constructGlobal(this, "MediaSource", EMPTY_ARRAY); + } + get activeSourceBuffers() { + return []; + } + addSourceBuffer(mimeType) { + const sourceBuffer = new WorkerSourceBuffer(this); + this[SourceBuffersKey].push(sourceBuffer); + callMethod(this, [ "addSourceBuffer" ], [ mimeType ]); + return sourceBuffer; + } + clearLiveSeekableRange() { + callMethod(this, [ "clearLiveSeekableRange" ], EMPTY_ARRAY, 2); + } + get duration() { + return getter(this, [ "duration" ]); + } + set duration(value) { + setter(this, [ "duration" ], value); + } + endOfStream(endOfStreamError) { + callMethod(this, [ "endOfStream" ], [ endOfStreamError ], 3); + } + get readyState() { + return getter(this, [ "readyState" ]); + } + removeSourceBuffer(sourceBuffer) { + const index = getSourceBufferIndex(sourceBuffer); + if (index > -1) { + this[SourceBuffersKey].splice(index, 1); + callMethod(this, [ "removeSourceBuffer" ], [ index ], 1); + } + } + setLiveSeekableRange(start, end) { + callMethod(this, [ "setLiveSeekableRange" ], [ start, end ], 2); + } + get sourceBuffers() { + return this[SourceBuffersKey]; + } + static isTypeSupported(mimeType) { + if (!isStaticTypeSupported.has(mimeType)) { + const isSupported = callMethod(win, [ "MediaSource", "isTypeSupported" ], [ mimeType ]); + isStaticTypeSupported.set(mimeType, isSupported); + } + return isStaticTypeSupported.get(mimeType); + } + }); + const winURL = win.URL = defineCstrName("URL", class extends URL {}); + const hasAudioTracks = "audioTracks" in win.HTMLMediaElement.prototype; + if (hasAudioTracks) { + defineCstr(win, "AudioTrackList", WorkerAudioTrackList); + defineCstr(win, "AudioTrack", WorkerAudioTrack); + HTMLMediaDescriptorMap.audioTracks = { + get() { + return new WorkerAudioTrackList(this); + } + }; + } + definePrototypePropertyDescriptor(win.HTMLMediaElement, HTMLMediaDescriptorMap); + winURL.createObjectURL = obj => callMethod(win, [ "URL", "createObjectURL" ], [ obj ]); + winURL.revokeObjectURL = obj => callMethod(win, [ "URL", "revokeObjectURL" ], [ obj ]); + }; + const isStaticTypeSupported = new Map; + self.$bridgeFromMedia$ = (WorkerBase, WorkerEventTargetProxy, env, win, windowMediaConstructors) => { + windowMediaConstructors.map((mediaCstrName => { + delete win[mediaCstrName]; + })); + initCanvas(WorkerBase, win); + initMedia(WorkerBase, WorkerEventTargetProxy, env, win); + }; +})(self); diff --git a/~partytown/debug/partytown-sandbox-sw.js b/~partytown/debug/partytown-sandbox-sw.js new file mode 100644 index 0000000..9cd875c --- /dev/null +++ b/~partytown/debug/partytown-sandbox-sw.js @@ -0,0 +1,559 @@ +/* Partytown 0.7.5 - MIT builder.io */ +(window => { + const isPromise = v => "object" == typeof v && v && v.then; + const noop = () => {}; + const len = obj => obj.length; + const getConstructorName = obj => { + var _a, _b, _c; + try { + const constructorName = null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a ? void 0 : _a.name; + if (constructorName) { + return constructorName; + } + } catch (e) {} + try { + const zoneJsConstructorName = null === (_c = null === (_b = null == obj ? void 0 : obj.__zone_symbol__originalInstance) || void 0 === _b ? void 0 : _b.constructor) || void 0 === _c ? void 0 : _c.name; + if (zoneJsConstructorName) { + return zoneJsConstructorName; + } + } catch (e) {} + return ""; + }; + const startsWith = (str, val) => str.startsWith(val); + const isValidMemberName = memberName => !(startsWith(memberName, "webkit") || startsWith(memberName, "toJSON") || startsWith(memberName, "constructor") || startsWith(memberName, "toString") || startsWith(memberName, "_")); + const getNodeName = node => 11 === node.nodeType && node.host ? "#s" : node.nodeName; + const randomId = () => Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36); + const defineConstructorName = (Cstr, value) => ((obj, memberName, descriptor) => Object.defineProperty(obj, memberName, { + ...descriptor, + configurable: true + }))(Cstr, "name", { + value: value + }); + const htmlConstructorTags = { + Anchor: "a", + DList: "dl", + Image: "img", + OList: "ol", + Paragraph: "p", + Quote: "q", + TableCaption: "caption", + TableCell: "td", + TableCol: "colgroup", + TableRow: "tr", + TableSection: "tbody", + UList: "ul" + }; + const svgConstructorTags = { + Graphics: "g", + SVG: "svg" + }; + const InstanceIdKey = Symbol(); + const CreatedKey = Symbol(); + const instances = new Map; + const mainRefs = new Map; + const winCtxs = {}; + const windowIds = new WeakMap; + const getAndSetInstanceId = (instance, instanceId) => { + if (instance) { + if (instanceId = windowIds.get(instance)) { + return instanceId; + } + (instanceId = instance[InstanceIdKey]) || setInstanceId(instance, instanceId = randomId()); + return instanceId; + } + }; + const getInstance = (winId, instanceId, win, doc, docId) => { + if ((win = winCtxs[winId]) && win.$window$) { + if (winId === instanceId) { + return win.$window$; + } + doc = win.$window$.document; + docId = instanceId.split(".").pop(); + if ("d" === docId) { + return doc; + } + if ("e" === docId) { + return doc.documentElement; + } + if ("h" === docId) { + return doc.head; + } + if ("b" === docId) { + return doc.body; + } + } + return instances.get(instanceId); + }; + const setInstanceId = (instance, instanceId, now) => { + if (instance) { + instances.set(instanceId, instance); + instance[InstanceIdKey] = instanceId; + instance[CreatedKey] = now = Date.now(); + if (now > lastCleanup + 5e3) { + instances.forEach(((storedInstance, instanceId) => { + storedInstance[CreatedKey] < lastCleanup && storedInstance.nodeType && !storedInstance.isConnected && instances.delete(instanceId); + })); + lastCleanup = now; + } + } + }; + let lastCleanup = 0; + const mainWindow = window.parent; + const docImpl = document.implementation.createHTMLDocument(); + const config = mainWindow.partytown || {}; + const libPath = (config.lib || "/~partytown/") + "debug/"; + const logMain = msg => { + console.debug.apply(console, [ "%cMain 🌎", "background: #717171; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;", msg ]); + }; + const winIds = []; + const normalizedWinId = winId => { + winIds.includes(winId) || winIds.push(winId); + return winIds.indexOf(winId) + 1; + }; + const defineCustomElement = (winId, worker, ceData) => { + const Cstr = defineConstructorName(class extends winCtxs[winId].$window$.HTMLElement {}, ceData[0]); + const ceCallbackMethods = "connectedCallback,disconnectedCallback,attributeChangedCallback,adoptedCallback".split(","); + ceCallbackMethods.map((callbackMethodName => Cstr.prototype[callbackMethodName] = function(...args) { + worker.postMessage([ 15, winId, getAndSetInstanceId(this), callbackMethodName, args ]); + })); + Cstr.observedAttributes = ceData[1]; + return Cstr; + }; + const serializeForWorker = ($winId$, value, added, type, cstrName) => void 0 !== value && (type = typeof value) ? "string" === type || "number" === type || "boolean" === type || null == value ? [ 0, value ] : "function" === type ? [ 6 ] : (added = added || new Set) && Array.isArray(value) ? added.has(value) ? [ 1, [] ] : added.add(value) && [ 1, value.map((v => serializeForWorker($winId$, v, added))) ] : "object" === type ? serializedValueIsError(value) ? [ 14, { + name: value.name, + message: value.message, + stack: value.stack + } ] : "" === (cstrName = getConstructorName(value)) ? [ 2, {} ] : "Window" === cstrName ? [ 3, [ $winId$, $winId$ ] ] : "HTMLCollection" === cstrName || "NodeList" === cstrName ? [ 7, Array.from(value).map((v => serializeForWorker($winId$, v, added)[1])) ] : cstrName.endsWith("Event") ? [ 5, serializeObjectForWorker($winId$, value, added) ] : "CSSRuleList" === cstrName ? [ 12, Array.from(value).map(serializeCssRuleForWorker) ] : startsWith(cstrName, "CSS") && cstrName.endsWith("Rule") ? [ 11, serializeCssRuleForWorker(value) ] : "CSSStyleDeclaration" === cstrName ? [ 13, serializeObjectForWorker($winId$, value, added) ] : "Attr" === cstrName ? [ 10, [ value.name, value.value ] ] : value.nodeType ? [ 3, [ $winId$, getAndSetInstanceId(value), getNodeName(value) ] ] : [ 2, serializeObjectForWorker($winId$, value, added, true, true) ] : void 0 : value; + const serializeObjectForWorker = (winId, obj, added, includeFunctions, includeEmptyStrings, serializedObj, propName, propValue) => { + serializedObj = {}; + if (!added.has(obj)) { + added.add(obj); + for (propName in obj) { + if (isValidMemberName(propName)) { + propValue = "path" === propName && getConstructorName(obj).endsWith("Event") ? obj.composedPath() : obj[propName]; + (includeFunctions || "function" != typeof propValue) && (includeEmptyStrings || "" !== propValue) && (serializedObj[propName] = serializeForWorker(winId, propValue, added)); + } + } + } + return serializedObj; + }; + const serializeCssRuleForWorker = cssRule => { + let obj = {}; + let key; + for (key in cssRule) { + validCssRuleProps.includes(key) && (obj[key] = String(cssRule[key])); + } + return obj; + }; + const serializedValueIsError = value => value instanceof window.top.Error; + const deserializeFromWorker = (worker, serializedTransfer, serializedType, serializedValue) => { + if (serializedTransfer) { + serializedType = serializedTransfer[0]; + serializedValue = serializedTransfer[1]; + return 0 === serializedType ? serializedValue : 4 === serializedType ? deserializeRefFromWorker(worker, serializedValue) : 1 === serializedType ? serializedValue.map((v => deserializeFromWorker(worker, v))) : 3 === serializedType ? getInstance(serializedValue[0], serializedValue[1]) : 5 === serializedType ? constructEvent(deserializeObjectFromWorker(worker, serializedValue)) : 2 === serializedType ? deserializeObjectFromWorker(worker, serializedValue) : 8 === serializedType ? serializedValue : 9 === serializedType ? new window[serializedTransfer[2]](serializedValue) : void 0; + } + }; + const deserializeRefFromWorker = (worker, {$winId$: $winId$, $instanceId$: $instanceId$, $refId$: $refId$}, ref) => { + ref = mainRefs.get($refId$); + if (!ref) { + ref = function(...args) { + worker.postMessage([ 9, { + $winId$: $winId$, + $instanceId$: $instanceId$, + $refId$: $refId$, + $thisArg$: serializeForWorker($winId$, this), + $args$: serializeForWorker($winId$, args) + } ]); + }; + mainRefs.set($refId$, ref); + } + return ref; + }; + const constructEvent = eventProps => new ("detail" in eventProps ? CustomEvent : Event)(eventProps.type, eventProps); + const deserializeObjectFromWorker = (worker, serializedValue, obj, key) => { + obj = {}; + for (key in serializedValue) { + obj[key] = deserializeFromWorker(worker, serializedValue[key]); + } + return obj; + }; + const validCssRuleProps = "cssText,selectorText,href,media,namespaceURI,prefix,name,conditionText".split(","); + const mainAccessHandler = async (worker, accessReq) => { + let accessRsp = { + $msgId$: accessReq.$msgId$ + }; + let totalTasks = len(accessReq.$tasks$); + let i = 0; + let task; + let winId; + let applyPath; + let instance; + let rtnValue; + let isLast; + for (;i < totalTasks; i++) { + try { + isLast = i === totalTasks - 1; + task = accessReq.$tasks$[i]; + winId = task.$winId$; + applyPath = task.$applyPath$; + !winCtxs[winId] && winId.startsWith("f_") && await new Promise((resolve => { + let check = 0; + let callback = () => { + winCtxs[winId] || check++ > 1e3 ? resolve() : requestAnimationFrame(callback); + }; + callback(); + })); + if (1 === applyPath[0] && applyPath[1] in winCtxs[winId].$window$) { + setInstanceId(new winCtxs[winId].$window$[applyPath[1]](...deserializeFromWorker(worker, applyPath[2])), task.$instanceId$); + } else { + instance = getInstance(winId, task.$instanceId$); + if (instance) { + rtnValue = applyToInstance(worker, winId, instance, applyPath, isLast, task.$groupedGetters$); + task.$assignInstanceId$ && ("string" == typeof task.$assignInstanceId$ ? setInstanceId(rtnValue, task.$assignInstanceId$) : winCtxs[task.$assignInstanceId$.$winId$] = { + $winId$: task.$assignInstanceId$.$winId$, + $window$: { + document: rtnValue + } + }); + if (isPromise(rtnValue)) { + rtnValue = await rtnValue; + isLast && (accessRsp.$isPromise$ = true); + } + isLast && (accessRsp.$rtnValue$ = serializeForWorker(winId, rtnValue)); + } else { + accessRsp.$error$ = `Error finding instance "${task.$instanceId$}" on window ${normalizedWinId(winId)}`; + console.error(accessRsp.$error$, task); + } + } + } catch (e) { + isLast ? accessRsp.$error$ = String(e.stack || e) : console.error(e); + } + } + return accessRsp; + }; + const applyToInstance = (worker, winId, instance, applyPath, isLast, groupedGetters) => { + let i = 0; + let l = len(applyPath); + let next; + let current; + let previous; + let args; + let groupedRtnValues; + for (;i < l; i++) { + current = applyPath[i]; + next = applyPath[i + 1]; + previous = applyPath[i - 1]; + try { + if (!Array.isArray(next)) { + if ("string" == typeof current || "number" == typeof current) { + if (i + 1 === l && groupedGetters) { + groupedRtnValues = {}; + groupedGetters.map((propName => groupedRtnValues[propName] = instance[propName])); + return groupedRtnValues; + } + instance = instance[current]; + } else { + if (0 === next) { + instance[previous] = deserializeFromWorker(worker, current); + return; + } + if ("function" == typeof instance[previous]) { + args = deserializeFromWorker(worker, current); + "define" === previous && "CustomElementRegistry" === getConstructorName(instance) && (args[1] = defineCustomElement(winId, worker, args[1])); + "insertRule" === previous && args[1] > len(instance.cssRules) && (args[1] = len(instance.cssRules)); + instance = instance[previous].apply(instance, args); + if ("play" === previous) { + return Promise.resolve(); + } + } + } + } + } catch (err) { + if (isLast) { + throw err; + } + console.debug("Non-blocking setter error:", err); + } + } + return instance; + }; + const readNextScript = (worker, winCtx) => { + let $winId$ = winCtx.$winId$; + let win = winCtx.$window$; + let doc = win.document; + let scriptSelector = 'script[type="text/partytown"]:not([data-ptid]):not([data-pterror])'; + let scriptElm; + let $instanceId$; + let scriptData; + if (doc && doc.body) { + scriptElm = doc.querySelector('script[type="text/partytown"]:not([data-ptid]):not([data-pterror]):not([async]):not([defer])'); + scriptElm || (scriptElm = doc.querySelector(scriptSelector)); + if (scriptElm) { + scriptElm.dataset.ptid = $instanceId$ = getAndSetInstanceId(scriptElm, $winId$); + scriptData = { + $winId$: $winId$, + $instanceId$: $instanceId$ + }; + if (scriptElm.src) { + scriptData.$url$ = scriptElm.src; + scriptData.$orgUrl$ = scriptElm.dataset.ptsrc || scriptElm.src; + } else { + scriptData.$content$ = scriptElm.innerHTML; + } + worker.postMessage([ 7, scriptData ]); + } else { + if (!winCtx.$isInitialized$) { + winCtx.$isInitialized$ = 1; + ((worker, $winId$, win) => { + let queuedForwardCalls = win._ptf; + let forwards = (win.partytown || {}).forward || []; + let i; + let mainForwardFn; + let forwardCall = ($forward$, args) => worker.postMessage([ 10, { + $winId$: $winId$, + $forward$: $forward$, + $args$: serializeForWorker($winId$, Array.from(args)) + } ]); + win._ptf = void 0; + forwards.map((forwardProps => { + mainForwardFn = win; + forwardProps.split(".").map(((_, i, arr) => { + mainForwardFn = mainForwardFn[arr[i]] = i + 1 < len(arr) ? mainForwardFn[arr[i]] || ("push" === arr[i + 1] ? [] : {}) : (...args) => forwardCall(arr, args); + })); + })); + if (queuedForwardCalls) { + for (i = 0; i < len(queuedForwardCalls); i += 2) { + forwardCall(queuedForwardCalls[i], queuedForwardCalls[i + 1]); + } + } + })(worker, $winId$, win); + doc.dispatchEvent(new CustomEvent("pt0")); + { + const winType = win === win.top ? "top" : "iframe"; + logMain(`Executed ${winType} window ${normalizedWinId($winId$)} environment scripts in ${(performance.now() - winCtx.$startTime$).toFixed(1)}ms`); + } + } + worker.postMessage([ 8, $winId$ ]); + } + } else { + requestAnimationFrame((() => readNextScript(worker, winCtx))); + } + }; + const registerWindow = (worker, $winId$, $window$) => { + if (!windowIds.has($window$)) { + windowIds.set($window$, $winId$); + const doc = $window$.document; + const history = $window$.history; + const $parentWinId$ = windowIds.get($window$.parent); + let initialised = false; + const onInitialisedQueue = []; + const onInitialised = callback => { + initialised ? callback() : onInitialisedQueue.push(callback); + }; + const sendInitEnvData = () => { + worker.postMessage([ 5, { + $winId$: $winId$, + $parentWinId$: $parentWinId$, + $url$: doc.baseURI, + $visibilityState$: doc.visibilityState + } ]); + setTimeout((() => { + initialised = true; + onInitialisedQueue.forEach((callback => { + callback(); + })); + })); + }; + const pushState = history.pushState.bind(history); + const replaceState = history.replaceState.bind(history); + const onLocationChange = (type, state, newUrl, oldUrl) => () => { + setTimeout((() => { + worker.postMessage([ 13, { + $winId$: $winId$, + type: type, + state: state, + url: doc.baseURI, + newUrl: newUrl, + oldUrl: oldUrl + } ]); + })); + }; + history.pushState = (state, _, newUrl) => { + pushState(state, _, newUrl); + onInitialised(onLocationChange(0, state, null == newUrl ? void 0 : newUrl.toString())); + }; + history.replaceState = (state, _, newUrl) => { + replaceState(state, _, newUrl); + onInitialised(onLocationChange(1, state, null == newUrl ? void 0 : newUrl.toString())); + }; + $window$.addEventListener("popstate", (event => { + onInitialised(onLocationChange(2, event.state)); + })); + $window$.addEventListener("hashchange", (event => { + onInitialised(onLocationChange(3, {}, event.newURL, event.oldURL)); + })); + $window$.addEventListener("ptupdate", (() => { + readNextScript(worker, winCtxs[$winId$]); + })); + doc.addEventListener("visibilitychange", (() => worker.postMessage([ 14, $winId$, doc.visibilityState ]))); + winCtxs[$winId$] = { + $winId$: $winId$, + $window$: $window$ + }; + winCtxs[$winId$].$startTime$ = performance.now(); + { + const winType = $winId$ === $parentWinId$ ? "top" : "iframe"; + logMain(`Registered ${winType} window ${normalizedWinId($winId$)}`); + } + "complete" === doc.readyState ? sendInitEnvData() : $window$.addEventListener("load", sendInitEnvData); + } + }; + const onMessageFromWebWorker = (worker, msg, winCtx) => { + if (4 === msg[0]) { + registerWindow(worker, randomId(), mainWindow); + } else { + winCtx = winCtxs[msg[1]]; + winCtx && (7 === msg[0] ? requestAnimationFrame((() => readNextScript(worker, winCtx))) : 6 === msg[0] && ((worker, winCtx, instanceId, errorMsg, scriptElm) => { + scriptElm = winCtx.$window$.document.querySelector(`[data-ptid="${instanceId}"]`); + if (scriptElm) { + errorMsg ? scriptElm.dataset.pterror = errorMsg : scriptElm.type += "-x"; + delete scriptElm.dataset.ptid; + } + readNextScript(worker, winCtx); + })(worker, winCtx, msg[2], msg[3])); + } + }; + const readMainPlatform = () => { + const elm = docImpl.createElement("i"); + const textNode = docImpl.createTextNode(""); + const comment = docImpl.createComment(""); + const frag = docImpl.createDocumentFragment(); + const shadowRoot = docImpl.createElement("p").attachShadow({ + mode: "open" + }); + const intersectionObserver = getGlobalConstructor(mainWindow, "IntersectionObserver"); + const mutationObserver = getGlobalConstructor(mainWindow, "MutationObserver"); + const resizeObserver = getGlobalConstructor(mainWindow, "ResizeObserver"); + const perf = mainWindow.performance; + const screen = mainWindow.screen; + const impls = [ [ mainWindow.history ], [ perf ], [ perf.navigation ], [ perf.timing ], [ screen ], [ screen.orientation ], [ mainWindow.visualViewport ], [ intersectionObserver, 12 ], [ mutationObserver, 12 ], [ resizeObserver, 12 ], [ textNode ], [ comment ], [ frag ], [ shadowRoot ], [ elm ], [ elm.attributes ], [ elm.classList ], [ elm.dataset ], [ elm.style ], [ docImpl ], [ docImpl.doctype ] ]; + const initialInterfaces = [ readImplementation("Window", mainWindow), readImplementation("Node", textNode) ]; + const $config$ = JSON.stringify(config, ((k, v) => { + if ("function" == typeof v) { + v = String(v); + v.startsWith(k + "(") && (v = "function " + v); + } + return v; + })); + const initWebWorkerData = { + $config$: $config$, + $interfaces$: readImplementations(impls, initialInterfaces), + $libPath$: new URL(libPath, mainWindow.location) + "", + $origin$: origin, + $localStorage$: readStorage("localStorage"), + $sessionStorage$: readStorage("sessionStorage") + }; + addGlobalConstructorUsingPrototype(initWebWorkerData.$interfaces$, mainWindow, "IntersectionObserverEntry"); + return initWebWorkerData; + }; + const readMainInterfaces = () => { + const elms = Object.getOwnPropertyNames(mainWindow).map((interfaceName => ((doc, interfaceName, r, tag) => { + r = interfaceName.match(/^(HTML|SVG)(.+)Element$/); + if (r) { + tag = r[2]; + return "S" == interfaceName[0] ? doc.createElementNS("http://www.w3.org/2000/svg", svgConstructorTags[tag] || tag.slice(0, 2).toLowerCase() + tag.slice(2)) : doc.createElement(htmlConstructorTags[tag] || tag); + } + })(docImpl, interfaceName))).filter((elm => elm)).map((elm => [ elm ])); + return readImplementations(elms, []); + }; + const cstrs = new Set([ "Object" ]); + const readImplementations = (impls, interfaces) => { + const cstrImpls = impls.filter((implData => implData[0])).map((implData => { + const impl = implData[0]; + const interfaceType = implData[1]; + const cstrName = getConstructorName(impl); + const CstrPrototype = mainWindow[cstrName].prototype; + return [ cstrName, CstrPrototype, impl, interfaceType ]; + })); + cstrImpls.map((([cstrName, CstrPrototype, impl, intefaceType]) => readOwnImplementation(cstrs, interfaces, cstrName, CstrPrototype, impl, intefaceType))); + return interfaces; + }; + const readImplementation = (cstrName, impl, memberName) => { + let interfaceMembers = []; + let interfaceInfo = [ cstrName, "Object", interfaceMembers ]; + for (memberName in impl) { + readImplementationMember(interfaceMembers, impl, memberName); + } + return interfaceInfo; + }; + const readOwnImplementation = (cstrs, interfaces, cstrName, CstrPrototype, impl, interfaceType) => { + if (!cstrs.has(cstrName)) { + cstrs.add(cstrName); + const SuperCstr = Object.getPrototypeOf(CstrPrototype); + const superCstrName = getConstructorName(SuperCstr); + const interfaceMembers = []; + const propDescriptors = Object.getOwnPropertyDescriptors(CstrPrototype); + readOwnImplementation(cstrs, interfaces, superCstrName, SuperCstr, impl, interfaceType); + for (const memberName in propDescriptors) { + readImplementationMember(interfaceMembers, impl, memberName); + } + interfaces.push([ cstrName, superCstrName, interfaceMembers, interfaceType, getNodeName(impl) ]); + } + }; + const readImplementationMember = (interfaceMembers, implementation, memberName, value, memberType, cstrName) => { + try { + if (isValidMemberName(memberName) && isNaN(memberName[0]) && "all" !== memberName) { + value = implementation[memberName]; + memberType = typeof value; + if ("function" === memberType) { + (String(value).includes("[native") || Object.getPrototypeOf(implementation)[memberName]) && interfaceMembers.push([ memberName, 5 ]); + } else if ("object" === memberType && null != value) { + cstrName = getConstructorName(value); + "Object" !== cstrName && self[cstrName] && interfaceMembers.push([ memberName, value.nodeType || cstrName ]); + } else { + "symbol" !== memberType && (memberName.toUpperCase() === memberName ? interfaceMembers.push([ memberName, 6, value ]) : interfaceMembers.push([ memberName, 6 ])); + } + } + } catch (e) { + console.warn(e); + } + }; + const readStorage = storageName => { + let items = []; + let i = 0; + let l = len(mainWindow[storageName]); + let key; + for (;i < l; i++) { + key = mainWindow[storageName].key(i); + items.push([ key, mainWindow[storageName].getItem(key) ]); + } + return items; + }; + const getGlobalConstructor = (mainWindow, cstrName) => void 0 !== mainWindow[cstrName] ? new mainWindow[cstrName](noop) : 0; + const addGlobalConstructorUsingPrototype = ($interfaces$, mainWindow, cstrName) => { + void 0 !== mainWindow[cstrName] && $interfaces$.push([ cstrName, "Object", Object.keys(mainWindow[cstrName].prototype).map((propName => [ propName, 6 ])), 12 ]); + }; + let worker; + (receiveMessage => { + const swContainer = window.navigator.serviceWorker; + return swContainer.getRegistration().then((swRegistration => { + swContainer.addEventListener("message", (ev => receiveMessage(ev.data, (accessRsp => swRegistration.active && swRegistration.active.postMessage(accessRsp))))); + return (worker, msg) => { + 0 === msg[0] ? worker.postMessage([ 1, readMainPlatform() ]) : 2 === msg[0] ? worker.postMessage([ 3, readMainInterfaces() ]) : onMessageFromWebWorker(worker, msg); + }; + })); + })(((accessReq, responseCallback) => mainAccessHandler(worker, accessReq).then(responseCallback))).then((onMessageHandler => { + if (onMessageHandler) { + worker = new Worker(libPath + "partytown-ww-sw.js?v=0.7.5", { + name: "Partytown 🎉" + }); + worker.onmessage = ev => { + const msg = ev.data; + 12 === msg[0] ? mainAccessHandler(worker, msg[1]) : onMessageHandler(worker, msg); + }; + logMain("Created Partytown web worker (0.7.5)"); + worker.onerror = ev => console.error("Web Worker Error", ev); + mainWindow.addEventListener("pt1", (ev => registerWindow(worker, getAndSetInstanceId(ev.detail.frameElement), ev.detail))); + } + })); +})(window); diff --git a/~partytown/debug/partytown-sw.js b/~partytown/debug/partytown-sw.js new file mode 100644 index 0000000..f6fdfb3 --- /dev/null +++ b/~partytown/debug/partytown-sw.js @@ -0,0 +1,59 @@ +/* Partytown 0.7.5 - MIT builder.io */ +const resolves = new Map; + +const swMessageError = (accessReq, $error$) => ({ + $msgId$: accessReq.$msgId$, + $error$: $error$ +}); + +const httpRequestFromWebWorker = req => new Promise((async resolve => { + const accessReq = await req.clone().json(); + const responseData = await (accessReq => new Promise((async resolve => { + const clients = await self.clients.matchAll(); + const client = [ ...clients ].sort(((a, b) => a.url > b.url ? -1 : a.url < b.url ? 1 : 0))[0]; + if (client) { + const timeout = 12e4; + const msgResolve = [ resolve, setTimeout((() => { + resolves.delete(accessReq.$msgId$); + resolve(swMessageError(accessReq, "Timeout")); + }), timeout) ]; + resolves.set(accessReq.$msgId$, msgResolve); + client.postMessage(accessReq); + } else { + resolve(swMessageError(accessReq, "NoParty")); + } + })))(accessReq); + resolve(response(JSON.stringify(responseData), "application/json")); +})); + +const response = (body, contentType) => new Response(body, { + headers: { + "content-type": contentType || "text/html", + "Cache-Control": "no-store" + } +}); + +self.oninstall = () => self.skipWaiting(); + +self.onactivate = () => self.clients.claim(); + +self.onmessage = ev => { + const accessRsp = ev.data; + const r = resolves.get(accessRsp.$msgId$); + if (r) { + resolves.delete(accessRsp.$msgId$); + clearTimeout(r[1]); + r[0](accessRsp); + } +}; + +self.onfetch = ev => { + const req = ev.request; + const url = new URL(req.url); + const pathname = url.pathname; + if (pathname.endsWith("sw.html")) { + ev.respondWith(response('