Found 97 repositories(showing 30)
pjborowiecki
Saasy Land is an open-source, opinionated, clean, elegant Next.js starter kit for production-grade SaaS. Engineered for scale with Bun, Vercel edge, Elysia APIs, Better Auth, Neon + Drizzle, and Shadcn UI. The robust, high-performance foundation for serious builders to ship modern, scalable full-stack applications without the boilerplate overhead.
sayantann11
Classification - Machine Learning This is ‘Classification’ tutorial which is a part of the Machine Learning course offered by Simplilearn. We will learn Classification algorithms, types of classification algorithms, support vector machines(SVM), Naive Bayes, Decision Tree and Random Forest Classifier in this tutorial. Objectives Let us look at some of the objectives covered under this section of Machine Learning tutorial. Define Classification and list its algorithms Describe Logistic Regression and Sigmoid Probability Explain K-Nearest Neighbors and KNN classification Understand Support Vector Machines, Polynomial Kernel, and Kernel Trick Analyze Kernel Support Vector Machines with an example Implement the Naïve Bayes Classifier Demonstrate Decision Tree Classifier Describe Random Forest Classifier Classification: Meaning Classification is a type of supervised learning. It specifies the class to which data elements belong to and is best used when the output has finite and discrete values. It predicts a class for an input variable as well. There are 2 types of Classification: Binomial Multi-Class Classification: Use Cases Some of the key areas where classification cases are being used: To find whether an email received is a spam or ham To identify customer segments To find if a bank loan is granted To identify if a kid will pass or fail in an examination Classification: Example Social media sentiment analysis has two potential outcomes, positive or negative, as displayed by the chart given below. https://www.simplilearn.com/ice9/free_resources_article_thumb/classification-example-machine-learning.JPG This chart shows the classification of the Iris flower dataset into its three sub-species indicated by codes 0, 1, and 2. https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-flower-dataset-graph.JPG The test set dots represent the assignment of new test data points to one class or the other based on the trained classifier model. Types of Classification Algorithms Let’s have a quick look into the types of Classification Algorithm below. Linear Models Logistic Regression Support Vector Machines Nonlinear models K-nearest Neighbors (KNN) Kernel Support Vector Machines (SVM) Naïve Bayes Decision Tree Classification Random Forest Classification Logistic Regression: Meaning Let us understand the Logistic Regression model below. This refers to a regression model that is used for classification. This method is widely used for binary classification problems. It can also be extended to multi-class classification problems. Here, the dependent variable is categorical: y ϵ {0, 1} A binary dependent variable can have only two values, like 0 or 1, win or lose, pass or fail, healthy or sick, etc In this case, you model the probability distribution of output y as 1 or 0. This is called the sigmoid probability (σ). If σ(θ Tx) > 0.5, set y = 1, else set y = 0 Unlike Linear Regression (and its Normal Equation solution), there is no closed form solution for finding optimal weights of Logistic Regression. Instead, you must solve this with maximum likelihood estimation (a probability model to detect the maximum likelihood of something happening). It can be used to calculate the probability of a given outcome in a binary model, like the probability of being classified as sick or passing an exam. https://www.simplilearn.com/ice9/free_resources_article_thumb/logistic-regression-example-graph.JPG Sigmoid Probability The probability in the logistic regression is often represented by the Sigmoid function (also called the logistic function or the S-curve): https://www.simplilearn.com/ice9/free_resources_article_thumb/sigmoid-function-machine-learning.JPG In this equation, t represents data values * the number of hours studied and S(t) represents the probability of passing the exam. Assume sigmoid function: https://www.simplilearn.com/ice9/free_resources_article_thumb/sigmoid-probability-machine-learning.JPG g(z) tends toward 1 as z -> infinity , and g(z) tends toward 0 as z -> infinity K-nearest Neighbors (KNN) K-nearest Neighbors algorithm is used to assign a data point to clusters based on similarity measurement. It uses a supervised method for classification. The steps to writing a k-means algorithm are as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/knn-distribution-graph-machine-learning.JPG Choose the number of k and a distance metric. (k = 5 is common) Find k-nearest neighbors of the sample that you want to classify Assign the class label by majority vote. KNN Classification A new input point is classified in the category such that it has the most number of neighbors from that category. For example: https://www.simplilearn.com/ice9/free_resources_article_thumb/knn-classification-machine-learning.JPG Classify a patient as high risk or low risk. Mark email as spam or ham. Keen on learning about Classification Algorithms in Machine Learning? Click here! Support Vector Machine (SVM) Let us understand Support Vector Machine (SVM) in detail below. SVMs are classification algorithms used to assign data to various classes. They involve detecting hyperplanes which segregate data into classes. SVMs are very versatile and are also capable of performing linear or nonlinear classification, regression, and outlier detection. Once ideal hyperplanes are discovered, new data points can be easily classified. https://www.simplilearn.com/ice9/free_resources_article_thumb/support-vector-machines-graph-machine-learning.JPG The optimization objective is to find “maximum margin hyperplane” that is farthest from the closest points in the two classes (these points are called support vectors). In the given figure, the middle line represents the hyperplane. SVM Example Let’s look at this image below and have an idea about SVM in general. Hyperplanes with larger margins have lower generalization error. The positive and negative hyperplanes are represented by: https://www.simplilearn.com/ice9/free_resources_article_thumb/positive-negative-hyperplanes-machine-learning.JPG Classification of any new input sample xtest : If w0 + wTxtest > 1, the sample xtest is said to be in the class toward the right of the positive hyperplane. If w0 + wTxtest < -1, the sample xtest is said to be in the class toward the left of the negative hyperplane. When you subtract the two equations, you get: https://www.simplilearn.com/ice9/free_resources_article_thumb/equation-subtraction-machine-learning.JPG Length of vector w is (L2 norm length): https://www.simplilearn.com/ice9/free_resources_article_thumb/length-of-vector-machine-learning.JPG You normalize with the length of w to arrive at: https://www.simplilearn.com/ice9/free_resources_article_thumb/normalize-equation-machine-learning.JPG SVM: Hard Margin Classification Given below are some points to understand Hard Margin Classification. The left side of equation SVM-1 given above can be interpreted as the distance between the positive (+ve) and negative (-ve) hyperplanes; in other words, it is the margin that can be maximized. Hence the objective of the function is to maximize with the constraint that the samples are classified correctly, which is represented as : https://www.simplilearn.com/ice9/free_resources_article_thumb/hard-margin-classification-machine-learning.JPG This means that you are minimizing ‖w‖. This also means that all positive samples are on one side of the positive hyperplane and all negative samples are on the other side of the negative hyperplane. This can be written concisely as : https://www.simplilearn.com/ice9/free_resources_article_thumb/hard-margin-classification-formula.JPG Minimizing ‖w‖ is the same as minimizing. This figure is better as it is differentiable even at w = 0. The approach listed above is called “hard margin linear SVM classifier.” SVM: Soft Margin Classification Given below are some points to understand Soft Margin Classification. To allow for linear constraints to be relaxed for nonlinearly separable data, a slack variable is introduced. (i) measures how much ith instance is allowed to violate the margin. The slack variable is simply added to the linear constraints. https://www.simplilearn.com/ice9/free_resources_article_thumb/soft-margin-calculation-machine-learning.JPG Subject to the above constraints, the new objective to be minimized becomes: https://www.simplilearn.com/ice9/free_resources_article_thumb/soft-margin-calculation-formula.JPG You have two conflicting objectives now—minimizing slack variable to reduce margin violations and minimizing to increase the margin. The hyperparameter C allows us to define this trade-off. Large values of C correspond to larger error penalties (so smaller margins), whereas smaller values of C allow for higher misclassification errors and larger margins. https://www.simplilearn.com/ice9/free_resources_article_thumb/machine-learning-certification-video-preview.jpg SVM: Regularization The concept of C is the reverse of regularization. Higher C means lower regularization, which increases bias and lowers the variance (causing overfitting). https://www.simplilearn.com/ice9/free_resources_article_thumb/concept-of-c-graph-machine-learning.JPG IRIS Data Set The Iris dataset contains measurements of 150 IRIS flowers from three different species: Setosa Versicolor Viriginica Each row represents one sample. Flower measurements in centimeters are stored as columns. These are called features. IRIS Data Set: SVM Let’s train an SVM model using sci-kit-learn for the Iris dataset: https://www.simplilearn.com/ice9/free_resources_article_thumb/svm-model-graph-machine-learning.JPG Nonlinear SVM Classification There are two ways to solve nonlinear SVMs: by adding polynomial features by adding similarity features Polynomial features can be added to datasets; in some cases, this can create a linearly separable dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/nonlinear-classification-svm-machine-learning.JPG In the figure on the left, there is only 1 feature x1. This dataset is not linearly separable. If you add x2 = (x1)2 (figure on the right), the data becomes linearly separable. Polynomial Kernel In sci-kit-learn, one can use a Pipeline class for creating polynomial features. Classification results for the Moons dataset are shown in the figure. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-machine-learning.JPG Polynomial Kernel with Kernel Trick Let us look at the image below and understand Kernel Trick in detail. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-with-kernel-trick.JPG For large dimensional datasets, adding too many polynomial features can slow down the model. You can apply a kernel trick with the effect of polynomial features without actually adding them. The code is shown (SVC class) below trains an SVM classifier using a 3rd-degree polynomial kernel but with a kernel trick. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-equation-machine-learning.JPG The hyperparameter coefθ controls the influence of high-degree polynomials. Kernel SVM Let us understand in detail about Kernel SVM. Kernel SVMs are used for classification of nonlinear data. In the chart, nonlinear data is projected into a higher dimensional space via a mapping function where it becomes linearly separable. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-machine-learning.JPG In the higher dimension, a linear separating hyperplane can be derived and used for classification. A reverse projection of the higher dimension back to original feature space takes it back to nonlinear shape. As mentioned previously, SVMs can be kernelized to solve nonlinear classification problems. You can create a sample dataset for XOR gate (nonlinear problem) from NumPy. 100 samples will be assigned the class sample 1, and 100 samples will be assigned the class label -1. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-graph-machine-learning.JPG As you can see, this data is not linearly separable. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-non-separable.JPG You now use the kernel trick to classify XOR dataset created earlier. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-xor-machine-learning.JPG Naïve Bayes Classifier What is Naive Bayes Classifier? Have you ever wondered how your mail provider implements spam filtering or how online news channels perform news text classification or even how companies perform sentiment analysis of their audience on social media? All of this and more are done through a machine learning algorithm called Naive Bayes Classifier. Naive Bayes Named after Thomas Bayes from the 1700s who first coined this in the Western literature. Naive Bayes classifier works on the principle of conditional probability as given by the Bayes theorem. Advantages of Naive Bayes Classifier Listed below are six benefits of Naive Bayes Classifier. Very simple and easy to implement Needs less training data Handles both continuous and discrete data Highly scalable with the number of predictors and data points As it is fast, it can be used in real-time predictions Not sensitive to irrelevant features Bayes Theorem We will understand Bayes Theorem in detail from the points mentioned below. According to the Bayes model, the conditional probability P(Y|X) can be calculated as: P(Y|X) = P(X|Y)P(Y) / P(X) This means you have to estimate a very large number of P(X|Y) probabilities for a relatively small vector space X. For example, for a Boolean Y and 30 possible Boolean attributes in the X vector, you will have to estimate 3 billion probabilities P(X|Y). To make it practical, a Naïve Bayes classifier is used, which assumes conditional independence of P(X) to each other, with a given value of Y. This reduces the number of probability estimates to 2*30=60 in the above example. Naïve Bayes Classifier for SMS Spam Detection Consider a labeled SMS database having 5574 messages. It has messages as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/naive-bayes-spam-machine-learning.JPG Each message is marked as spam or ham in the data set. Let’s train a model with Naïve Bayes algorithm to detect spam from ham. The message lengths and their frequency (in the training dataset) are as shown below: https://www.simplilearn.com/ice9/free_resources_article_thumb/naive-bayes-spam-spam-detection.JPG Analyze the logic you use to train an algorithm to detect spam: Split each message into individual words/tokens (bag of words). Lemmatize the data (each word takes its base form, like “walking” or “walked” is replaced with “walk”). Convert data to vectors using scikit-learn module CountVectorizer. Run TFIDF to remove common words like “is,” “are,” “and.” Now apply scikit-learn module for Naïve Bayes MultinomialNB to get the Spam Detector. This spam detector can then be used to classify a random new message as spam or ham. Next, the accuracy of the spam detector is checked using the Confusion Matrix. For the SMS spam example above, the confusion matrix is shown on the right. Accuracy Rate = Correct / Total = (4827 + 592)/5574 = 97.21% Error Rate = Wrong / Total = (155 + 0)/5574 = 2.78% https://www.simplilearn.com/ice9/free_resources_article_thumb/confusion-matrix-machine-learning.JPG Although confusion Matrix is useful, some more precise metrics are provided by Precision and Recall. https://www.simplilearn.com/ice9/free_resources_article_thumb/precision-recall-matrix-machine-learning.JPG Precision refers to the accuracy of positive predictions. https://www.simplilearn.com/ice9/free_resources_article_thumb/precision-formula-machine-learning.JPG Recall refers to the ratio of positive instances that are correctly detected by the classifier (also known as True positive rate or TPR). https://www.simplilearn.com/ice9/free_resources_article_thumb/recall-formula-machine-learning.JPG Precision/Recall Trade-off To detect age-appropriate videos for kids, you need high precision (low recall) to ensure that only safe videos make the cut (even though a few safe videos may be left out). The high recall is needed (low precision is acceptable) in-store surveillance to catch shoplifters; a few false alarms are acceptable, but all shoplifters must be caught. Learn about Naive Bayes in detail. Click here! Decision Tree Classifier Some aspects of the Decision Tree Classifier mentioned below are. Decision Trees (DT) can be used both for classification and regression. The advantage of decision trees is that they require very little data preparation. They do not require feature scaling or centering at all. They are also the fundamental components of Random Forests, one of the most powerful ML algorithms. Unlike Random Forests and Neural Networks (which do black-box modeling), Decision Trees are white box models, which means that inner workings of these models are clearly understood. In the case of classification, the data is segregated based on a series of questions. Any new data point is assigned to the selected leaf node. https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-classifier-machine-learning.JPG Start at the tree root and split the data on the feature using the decision algorithm, resulting in the largest information gain (IG). This splitting procedure is then repeated in an iterative process at each child node until the leaves are pure. This means that the samples at each node belonging to the same class. In practice, you can set a limit on the depth of the tree to prevent overfitting. The purity is compromised here as the final leaves may still have some impurity. The figure shows the classification of the Iris dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-classifier-graph.JPG IRIS Decision Tree Let’s build a Decision Tree using scikit-learn for the Iris flower dataset and also visualize it using export_graphviz API. https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-machine-learning.JPG The output of export_graphviz can be converted into png format: https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-output.JPG Sample attribute stands for the number of training instances the node applies to. Value attribute stands for the number of training instances of each class the node applies to. Gini impurity measures the node’s impurity. A node is “pure” (gini=0) if all training instances it applies to belong to the same class. https://www.simplilearn.com/ice9/free_resources_article_thumb/impurity-formula-machine-learning.JPG For example, for Versicolor (green color node), the Gini is 1-(0/54)2 -(49/54)2 -(5/54) 2 ≈ 0.168 https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-sample.JPG Decision Boundaries Let us learn to create decision boundaries below. For the first node (depth 0), the solid line splits the data (Iris-Setosa on left). Gini is 0 for Setosa node, so no further split is possible. The second node (depth 1) splits the data into Versicolor and Virginica. If max_depth were set as 3, a third split would happen (vertical dotted line). https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-boundaries.JPG For a sample with petal length 5 cm and petal width 1.5 cm, the tree traverses to depth 2 left node, so the probability predictions for this sample are 0% for Iris-Setosa (0/54), 90.7% for Iris-Versicolor (49/54), and 9.3% for Iris-Virginica (5/54) CART Training Algorithm Scikit-learn uses Classification and Regression Trees (CART) algorithm to train Decision Trees. CART algorithm: Split the data into two subsets using a single feature k and threshold tk (example, petal length < “2.45 cm”). This is done recursively for each node. k and tk are chosen such that they produce the purest subsets (weighted by their size). The objective is to minimize the cost function as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/cart-training-algorithm-machine-learning.JPG The algorithm stops executing if one of the following situations occurs: max_depth is reached No further splits are found for each node Other hyperparameters may be used to stop the tree: min_samples_split min_samples_leaf min_weight_fraction_leaf max_leaf_nodes Gini Impurity or Entropy Entropy is one more measure of impurity and can be used in place of Gini. https://www.simplilearn.com/ice9/free_resources_article_thumb/gini-impurity-entrophy.JPG It is a degree of uncertainty, and Information Gain is the reduction that occurs in entropy as one traverses down the tree. Entropy is zero for a DT node when the node contains instances of only one class. Entropy for depth 2 left node in the example given above is: https://www.simplilearn.com/ice9/free_resources_article_thumb/entrophy-for-depth-2.JPG Gini and Entropy both lead to similar trees. DT: Regularization The following figure shows two decision trees on the moons dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/dt-regularization-machine-learning.JPG The decision tree on the right is restricted by min_samples_leaf = 4. The model on the left is overfitting, while the model on the right generalizes better. Random Forest Classifier Let us have an understanding of Random Forest Classifier below. A random forest can be considered an ensemble of decision trees (Ensemble learning). Random Forest algorithm: Draw a random bootstrap sample of size n (randomly choose n samples from the training set). Grow a decision tree from the bootstrap sample. At each node, randomly select d features. Split the node using the feature that provides the best split according to the objective function, for instance by maximizing the information gain. Repeat the steps 1 to 2 k times. (k is the number of trees you want to create, using a subset of samples) Aggregate the prediction by each tree for a new data point to assign the class label by majority vote (pick the group selected by the most number of trees and assign new data point to that group). Random Forests are opaque, which means it is difficult to visualize their inner workings. https://www.simplilearn.com/ice9/free_resources_article_thumb/random-forest-classifier-graph.JPG However, the advantages outweigh their limitations since you do not have to worry about hyperparameters except k, which stands for the number of decision trees to be created from a subset of samples. RF is quite robust to noise from the individual decision trees. Hence, you need not prune individual decision trees. The larger the number of decision trees, the more accurate the Random Forest prediction is. (This, however, comes with higher computation cost). Key Takeaways Let us quickly run through what we have learned so far in this Classification tutorial. Classification algorithms are supervised learning methods to split data into classes. They can work on Linear Data as well as Nonlinear Data. Logistic Regression can classify data based on weighted parameters and sigmoid conversion to calculate the probability of classes. K-nearest Neighbors (KNN) algorithm uses similar features to classify data. Support Vector Machines (SVMs) classify data by detecting the maximum margin hyperplane between data classes. Naïve Bayes, a simplified Bayes Model, can help classify data using conditional probability models. Decision Trees are powerful classifiers and use tree splitting logic until pure or somewhat pure leaf node classes are attained. Random Forests apply Ensemble Learning to Decision Trees for more accurate classification predictions. Conclusion This completes ‘Classification’ tutorial. In the next tutorial, we will learn 'Unsupervised Learning with Clustering.'
molyswu
using Neural Networks (SSD) on Tensorflow. This repo documents steps and scripts used to train a hand detector using Tensorflow (Object Detection API). As with any DNN based task, the most expensive (and riskiest) part of the process has to do with finding or creating the right (annotated) dataset. I was interested mainly in detecting hands on a table (egocentric view point). I experimented first with the [Oxford Hands Dataset](http://www.robots.ox.ac.uk/~vgg/data/hands/) (the results were not good). I then tried the [Egohands Dataset](http://vision.soic.indiana.edu/projects/egohands/) which was a much better fit to my requirements. The goal of this repo/post is to demonstrate how neural networks can be applied to the (hard) problem of tracking hands (egocentric and other views). Better still, provide code that can be adapted to other uses cases. If you use this tutorial or models in your research or project, please cite [this](#citing-this-tutorial). Here is the detector in action. <img src="images/hand1.gif" width="33.3%"><img src="images/hand2.gif" width="33.3%"><img src="images/hand3.gif" width="33.3%"> Realtime detection on video stream from a webcam . <img src="images/chess1.gif" width="33.3%"><img src="images/chess2.gif" width="33.3%"><img src="images/chess3.gif" width="33.3%"> Detection on a Youtube video. Both examples above were run on a macbook pro **CPU** (i7, 2.5GHz, 16GB). Some fps numbers are: | FPS | Image Size | Device| Comments| | ------------- | ------------- | ------------- | ------------- | | 21 | 320 * 240 | Macbook pro (i7, 2.5GHz, 16GB) | Run without visualizing results| | 16 | 320 * 240 | Macbook pro (i7, 2.5GHz, 16GB) | Run while visualizing results (image above) | | 11 | 640 * 480 | Macbook pro (i7, 2.5GHz, 16GB) | Run while visualizing results (image above) | > Note: The code in this repo is written and tested with Tensorflow `1.4.0-rc0`. Using a different version may result in [some errors](https://github.com/tensorflow/models/issues/1581). You may need to [generate your own frozen model](https://pythonprogramming.net/testing-custom-object-detector-tensorflow-object-detection-api-tutorial/?completed=/training-custom-objects-tensorflow-object-detection-api-tutorial/) graph using the [model checkpoints](model-checkpoint) in the repo to fit your TF version. **Content of this document** - Motivation - Why Track/Detect hands with Neural Networks - Data preparation and network training in Tensorflow (Dataset, Import, Training) - Training the hand detection Model - Using the Detector to Detect/Track hands - Thoughts on Optimizations. > P.S if you are using or have used the models provided here, feel free to reach out on twitter ([@vykthur](https://twitter.com/vykthur)) and share your work! ## Motivation - Why Track/Detect hands with Neural Networks? There are several existing approaches to tracking hands in the computer vision domain. Incidentally, many of these approaches are rule based (e.g extracting background based on texture and boundary features, distinguishing between hands and background using color histograms and HOG classifiers,) making them not very robust. For example, these algorithms might get confused if the background is unusual or in situations where sharp changes in lighting conditions cause sharp changes in skin color or the tracked object becomes occluded.(see [here for a review](https://www.cse.unr.edu/~bebis/handposerev.pdf) paper on hand pose estimation from the HCI perspective) With sufficiently large datasets, neural networks provide opportunity to train models that perform well and address challenges of existing object tracking/detection algorithms - varied/poor lighting, noisy environments, diverse viewpoints and even occlusion. The main drawbacks to usage for real-time tracking/detection is that they can be complex, are relatively slow compared to tracking-only algorithms and it can be quite expensive to assemble a good dataset. But things are changing with advances in fast neural networks. Furthermore, this entire area of work has been made more approachable by deep learning frameworks (such as the tensorflow object detection api) that simplify the process of training a model for custom object detection. More importantly, the advent of fast neural network models like ssd, faster r-cnn, rfcn (see [here](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md#coco-trained-models-coco-models) ) etc make neural networks an attractive candidate for real-time detection (and tracking) applications. Hopefully, this repo demonstrates this. > If you are not interested in the process of training the detector, you can skip straight to applying the [pretrained model I provide in detecting hands](#detecting-hands). Training a model is a multi-stage process (assembling dataset, cleaning, splitting into training/test partitions and generating an inference graph). While I lightly touch on the details of these parts, there are a few other tutorials cover training a custom object detector using the tensorflow object detection api in more detail[ see [here](https://pythonprogramming.net/training-custom-objects-tensorflow-object-detection-api-tutorial/) and [here](https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9) ]. I recommend you walk through those if interested in training a custom object detector from scratch. ## Data preparation and network training in Tensorflow (Dataset, Import, Training) **The Egohands Dataset** The hand detector model is built using data from the [Egohands Dataset](http://vision.soic.indiana.edu/projects/egohands/) dataset. This dataset works well for several reasons. It contains high quality, pixel level annotations (>15000 ground truth labels) where hands are located across 4800 images. All images are captured from an egocentric view (Google glass) across 48 different environments (indoor, outdoor) and activities (playing cards, chess, jenga, solving puzzles etc). <img src="images/egohandstrain.jpg" width="100%"> If you will be using the Egohands dataset, you can cite them as follows: > Bambach, Sven, et al. "Lending a hand: Detecting hands and recognizing activities in complex egocentric interactions." Proceedings of the IEEE International Conference on Computer Vision. 2015. The Egohands dataset (zip file with labelled data) contains 48 folders of locations where video data was collected (100 images per folder). ``` -- LOCATION_X -- frame_1.jpg -- frame_2.jpg ... -- frame_100.jpg -- polygons.mat // contains annotations for all 100 images in current folder -- LOCATION_Y -- frame_1.jpg -- frame_2.jpg ... -- frame_100.jpg -- polygons.mat // contains annotations for all 100 images in current folder ``` **Converting data to Tensorflow Format** Some initial work needs to be done to the Egohands dataset to transform it into the format (`tfrecord`) which Tensorflow needs to train a model. This repo contains `egohands_dataset_clean.py` a script that will help you generate these csv files. - Downloads the egohands datasets - Renames all files to include their directory names to ensure each filename is unique - Splits the dataset into train (80%), test (10%) and eval (10%) folders. - Reads in `polygons.mat` for each folder, generates bounding boxes and visualizes them to ensure correctness (see image above). - Once the script is done running, you should have an images folder containing three folders - train, test and eval. Each of these folders should also contain a csv label document each - `train_labels.csv`, `test_labels.csv` that can be used to generate `tfrecords` Note: While the egohands dataset provides four separate labels for hands (own left, own right, other left, and other right), for my purpose, I am only interested in the general `hand` class and label all training data as `hand`. You can modify the data prep script to generate `tfrecords` that support 4 labels. Next: convert your dataset + csv files to tfrecords. A helpful guide on this can be found [here](https://pythonprogramming.net/creating-tfrecord-files-tensorflow-object-detection-api-tutorial/).For each folder, you should be able to generate `train.record`, `test.record` required in the training process. ## Training the hand detection Model Now that the dataset has been assembled (and your tfrecords), the next task is to train a model based on this. With neural networks, it is possible to use a process called [transfer learning](https://www.tensorflow.org/tutorials/image_retraining) to shorten the amount of time needed to train the entire model. This means we can take an existing model (that has been trained well on a related domain (here image classification) and retrain its final layer(s) to detect hands for us. Sweet!. Given that neural networks sometimes have thousands or millions of parameters that can take weeks or months to train, transfer learning helps shorten training time to possibly hours. Tensorflow does offer a few models (in the tensorflow [model zoo](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md#coco-trained-models-coco-models)) and I chose to use the `ssd_mobilenet_v1_coco` model as my start point given it is currently (one of) the fastest models (read the SSD research [paper here](https://arxiv.org/pdf/1512.02325.pdf)). The training process can be done locally on your CPU machine which may take a while or better on a (cloud) GPU machine (which is what I did). For reference, training on my macbook pro (tensorflow compiled from source to take advantage of the mac's cpu architecture) the maximum speed I got was 5 seconds per step as opposed to the ~0.5 seconds per step I got with a GPU. For reference it would take about 12 days to run 200k steps on my mac (i7, 2.5GHz, 16GB) compared to ~5hrs on a GPU. > **Training on your own images**: Please use the [guide provided by Harrison from pythonprogramming](https://pythonprogramming.net/training-custom-objects-tensorflow-object-detection-api-tutorial/) on how to generate tfrecords given your label csv files and your images. The guide also covers how to start the training process if training locally. [see [here] (https://pythonprogramming.net/training-custom-objects-tensorflow-object-detection-api-tutorial/)]. If training in the cloud using a service like GCP, see the [guide here](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_cloud.md). As the training process progresses, the expectation is that total loss (errors) gets reduced to its possible minimum (about a value of 1 or thereabout). By observing the tensorboard graphs for total loss(see image below), it should be possible to get an idea of when the training process is complete (total loss does not decrease with further iterations/steps). I ran my training job for 200k steps (took about 5 hours) and stopped at a total Loss (errors) value of 2.575.(In retrospect, I could have stopped the training at about 50k steps and gotten a similar total loss value). With tensorflow, you can also run an evaluation concurrently that assesses your model to see how well it performs on the test data. A commonly used metric for performance is mean average precision (mAP) which is single number used to summarize the area under the precision-recall curve. mAP is a measure of how well the model generates a bounding box that has at least a 50% overlap with the ground truth bounding box in our test dataset. For the hand detector trained here, the mAP value was **0.9686@0.5IOU**. mAP values range from 0-1, the higher the better. <img src="images/accuracy.jpg" width="100%"> Once training is completed, the trained inference graph (`frozen_inference_graph.pb`) is then exported (see the earlier referenced guides for how to do this) and saved in the `hand_inference_graph` folder. Now its time to do some interesting detection. ## Using the Detector to Detect/Track hands If you have not done this yet, please following the guide on installing [Tensorflow and the Tensorflow object detection api](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md). This will walk you through setting up the tensorflow framework, cloning the tensorflow github repo and a guide on - Load the `frozen_inference_graph.pb` trained on the hands dataset as well as the corresponding label map. In this repo, this is done in the `utils/detector_utils.py` script by the `load_inference_graph` method. ```python detection_graph = tf.Graph() with detection_graph.as_default(): od_graph_def = tf.GraphDef() with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid: serialized_graph = fid.read() od_graph_def.ParseFromString(serialized_graph) tf.import_graph_def(od_graph_def, name='') sess = tf.Session(graph=detection_graph) print("> ====== Hand Inference graph loaded.") ``` - Detect hands. In this repo, this is done in the `utils/detector_utils.py` script by the `detect_objects` method. ```python (boxes, scores, classes, num) = sess.run( [detection_boxes, detection_scores, detection_classes, num_detections], feed_dict={image_tensor: image_np_expanded}) ``` - Visualize detected bounding detection_boxes. In this repo, this is done in the `utils/detector_utils.py` script by the `draw_box_on_image` method. This repo contains two scripts that tie all these steps together. - detect_multi_threaded.py : A threaded implementation for reading camera video input detection and detecting. Takes a set of command line flags to set parameters such as `--display` (visualize detections), image parameters `--width` and `--height`, videe `--source` (0 for camera) etc. - detect_single_threaded.py : Same as above, but single threaded. This script works for video files by setting the video source parameter videe `--source` (path to a video file). ```cmd # load and run detection on video at path "videos/chess.mov" python detect_single_threaded.py --source videos/chess.mov ``` > Update: If you do have errors loading the frozen inference graph in this repo, feel free to generate a new graph that fits your TF version from the model-checkpoint in this repo. Use the [export_inference_graph.py](https://github.com/tensorflow/models/blob/master/research/object_detection/export_inference_graph.py) script provided in the tensorflow object detection api repo. More guidance on this [here](https://pythonprogramming.net/testing-custom-object-detector-tensorflow-object-detection-api-tutorial/?completed=/training-custom-objects-tensorflow-object-detection-api-tutorial/). ## Thoughts on Optimization. A few things that led to noticeable performance increases. - Threading: Turns out that reading images from a webcam is a heavy I/O event and if run on the main application thread can slow down the program. I implemented some good ideas from [Adrian Rosebuck](https://www.pyimagesearch.com/2017/02/06/faster-video-file-fps-with-cv2-videocapture-and-opencv/) on parrallelizing image capture across multiple worker threads. This mostly led to an FPS increase of about 5 points. - For those new to Opencv, images from the `cv2.read()` method return images in [BGR format](https://www.learnopencv.com/why-does-opencv-use-bgr-color-format/). Ensure you convert to RGB before detection (accuracy will be much reduced if you dont). ```python cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB) ``` - Keeping your input image small will increase fps without any significant accuracy drop.(I used about 320 x 240 compared to the 1280 x 720 which my webcam provides). - Model Quantization. Moving from the current 32 bit to 8 bit can achieve up to 4x reduction in memory required to load and store models. One way to further speed up this model is to explore the use of [8-bit fixed point quantization](https://heartbeat.fritz.ai/8-bit-quantization-and-tensorflow-lite-speeding-up-mobile-inference-with-low-precision-a882dfcafbbd). Performance can also be increased by a clever combination of tracking algorithms with the already decent detection and this is something I am still experimenting with. Have ideas for optimizing better, please share! <img src="images/general.jpg" width="100%"> Note: The detector does reflect some limitations associated with the training set. This includes non-egocentric viewpoints, very noisy backgrounds (e.g in a sea of hands) and sometimes skin tone. There is opportunity to improve these with additional data. ## Integrating Multiple DNNs. One way to make things more interesting is to integrate our new knowledge of where "hands" are with other detectors trained to recognize other objects. Unfortunately, while our hand detector can in fact detect hands, it cannot detect other objects (a factor or how it is trained). To create a detector that classifies multiple different objects would mean a long involved process of assembling datasets for each class and a lengthy training process. > Given the above, a potential strategy is to explore structures that allow us **efficiently** interleave output form multiple pretrained models for various object classes and have them detect multiple objects on a single image. An example of this is with my primary use case where I am interested in understanding the position of objects on a table with respect to hands on same table. I am currently doing some work on a threaded application that loads multiple detectors and outputs bounding boxes on a single image. More on this soon.
Sfedfcv
Skip to content github / docs Code Issues 80 Pull requests 35 Discussions Actions Projects 2 Security Insights Merge branch 'main' into 1862-Add-Travis-CI-migration-table 1862-Add-Travis-CI-migration-table (#1869, Iixixi/ZachryTylerWood#102, THEBOLCK79/docs#1, sbnbhk/docs#1) @martin389 martin389 committed on Dec 9, 2020 2 parents 2f9ec0c + 1588f50 commit 1a56ed136914e522f3a23ecc2be1c49f479a1a6a Showing 501 changed files with 5,397 additions and 1,362 deletions. 2 .github/allowed-actions.js @@ -30,7 +30,7 @@ module.exports = [ 'rachmari/labeler@832d42ec5523f3c6d46e8168de71cd54363e3e2e', 'repo-sync/github-sync@3832fe8e2be32372e1b3970bbae8e7079edeec88', 'repo-sync/pull-request@33777245b1aace1a58c87a29c90321aa7a74bd7d', 'rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815', 'someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd', 'tjenkinson/gh-action-auto-merge-dependency-updates@cee2ac0', 'EndBug/add-and-commit@9358097a71ad9fb9e2f9624c6098c89193d83575' ] 72 .github/workflows/confirm-internal-staff-work-in-docs.yml @@ -0,0 +1,72 @@ name: Confirm internal staff meant to post in public on: issues: types: - opened - reopened - transferred pull_request_target: types: - opened - reopened jobs: check-team-membership: runs-on: ubuntu-latest continue-on-error: true if: github.repository == 'github/docs' steps: - uses: actions/github-script@626af12fe9a53dc2972b48385e7fe7dec79145c9 with: github-token: ${{ secrets.DOCUBOT_FR_PROJECT_BOARD_WORKFLOWS_REPO_ORG_READ_SCOPES }} script: | // Only perform this action with GitHub employees try { await github.teams.getMembershipForUserInOrg({ org: 'github', team_slug: 'employees', username: context.payload.sender.login, }); } catch(err) { // An error will be thrown if the user is not a GitHub employee // If a user is not a GitHub employee, we should stop here and // Not send a notification return } // Don't perform this action with Docs team members try { await github.teams.getMembershipForUserInOrg({ org: 'github', team_slug: 'docs', username: context.payload.sender.login, }); // If the user is a Docs team member, we should stop here and not send // a notification return } catch(err) { // An error will be thrown if the user is not a Docs team member // If a user is not a Docs team member we should continue and send // the notification } const issueNo = context.number || context.issue.number // Create an issue in our private repo await github.issues.create({ owner: 'github', repo: 'docs-internal', title: `@${context.payload.sender.login} confirm that \#${issueNo} should be in the public github/docs repo`, body: `@${context.payload.sender.login} opened https://github.com/github/docs/issues/${issueNo} publicly in the github/docs repo, instead of the private github/docs-internal repo.\n\n@${context.payload.sender.login}, please confirm that this belongs in the public repo and that no sensitive information was disclosed by commenting below and closing the issue.\n\nIf this was not intentional and sensitive information was shared, please delete https://github.com/github/docs/issues/${issueNo} and notify us in the \#docs-open-source channel.\n\nThanks! \n\n/cc @github/docs @github/docs-engineering` }); throw new Error('A Hubber opened an issue on the public github/docs repo'); - name: Send Slack notification if a GitHub employee who isn't on the docs team opens an issue in public if: ${{ failure() && github.repository == 'github/docs' }} uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd with: channel: ${{ secrets.DOCS_OPEN_SOURCE_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} text: <@${{github.actor}}> opened https://github.com/github/docs/issues/${{ github.event.number || github.event.issue.number }} publicly on the github/docs repo instead of the private github/docs-internal repo. They have been notified via a new issue in the github/docs-internal repo to confirm this was intentional. 15 .github/workflows/js-lint.yml @@ -10,23 +10,8 @@ on: - translations jobs: see_if_should_skip: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@36feb0d8d062137530c2e00bd278d138fe191289 with: cancel_others: 'false' github_token: ${{ github.token }} paths: '["**/*.js", "package*.json", ".github/workflows/js-lint.yml", ".eslint*"]' lint: runs-on: ubuntu-latest needs: see_if_should_skip if: ${{ needs.see_if_should_skip.outputs.should_skip != 'true' }} steps: - name: Check out repo uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f 13 .github/workflows/repo-freeze-reminders.yml @@ -14,11 +14,10 @@ jobs: if: github.repository == 'github/docs-internal' steps: - name: Send Slack notification if repo is frozen uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: ${{ env.FREEZE == 'true' }} uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_USERNAME: docs-repo-sync SLACK_ICON_EMOJI: ':freezing_face:' SLACK_COLOR: '#51A0D5' # Carolina Blue SLACK_MESSAGE: All repo-sync runs will fail for ${{ github.repository }} because the repo is currently frozen! with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: info text: All repo-sync runs will fail for ${{ github.repository }} because the repo is currently frozen! 54 .github/workflows/repo-sync-stalls.yml @@ -0,0 +1,54 @@ name: Repo Sync Stalls on: workflow_dispatch: schedule: - cron: '*/30 * * * *' jobs: check-freezer: name: Check for deployment freezes runs-on: ubuntu-latest steps: - name: Exit if repo is frozen if: ${{ env.FREEZE == 'true' }} run: | echo 'The repo is currently frozen! Exiting this workflow.' exit 1 # prevents further steps from running repo-sync-stalls: runs-on: ubuntu-latest steps: - name: Check if repo sync is stalled uses: actions/github-script@626af12fe9a53dc2972b48385e7fe7dec79145c9 with: github-token: ${{ secrets.DOCUBOT_FR_PROJECT_BOARD_WORKFLOWS_REPO_ORG_READ_SCOPES }} script: | let pulls; const owner = context.repo.owner const repo = context.repo.repo try { pulls = await github.pulls.list({ owner: owner, repo: repo, head: `${owner}:repo-sync`, state: 'open' }); } catch(err) { throw err return } pulls.data.forEach(pr => { const timeDelta = Date.now() - Date.parse(pr.created_at); const minutesOpen = timeDelta / 1000 / 60; if (minutesOpen > 30) { core.setFailed('Repo sync appears to be stalled') } }) - name: Send Slack notification if workflow fails uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: Repo sync appears to be stalled for ${{github.repository}}. See https://github.com/${{github.repository}}/pulls?q=is%3Apr+is%3Aopen+repo+sync 16 .github/workflows/repo-sync.yml @@ -7,6 +7,7 @@ name: Repo Sync on: workflow_dispatch: schedule: - cron: '*/15 * * * *' # every 15 minutes @@ -70,11 +71,10 @@ jobs: number: ${{ steps.find-pull-request.outputs.number }} - name: Send Slack notification if workflow fails uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 if: ${{ failure() }} env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_USERNAME: docs-repo-sync SLACK_ICON_EMOJI: ':ohno:' SLACK_COLOR: '#B90E0A' # Crimson SLACK_MESSAGE: The last repo-sync run for ${{github.repository}} failed. See https://github.com/${{github.repository}}/actions?query=workflow%3A%22Repo+Sync%22 uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: The last repo-sync run for ${{github.repository}} failed. See https://github.com/${{github.repository}}/actions?query=workflow%3A%22Repo+Sync%22 10 .github/workflows/sync-algolia-search-indices.yml @@ -33,8 +33,10 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: npm run sync-search - name: Send slack notification if workflow run fails uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_MESSAGE: The last Algolia workflow run for ${{github.repository}} failed. Search actions for `workflow:Algolia` with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: The last Algolia workflow run for ${{github.repository}} failed. Search actions for `workflow:Algolia` 15 .github/workflows/yml-lint.yml @@ -10,23 +10,8 @@ on: - translations jobs: see_if_should_skip: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@36feb0d8d062137530c2e00bd278d138fe191289 with: cancel_others: 'false' github_token: ${{ github.token }} paths: '["**/*.yml", "**/*.yaml", "package*.json", ".github/workflows/yml-lint.yml"]' lint: runs-on: ubuntu-latest needs: see_if_should_skip if: ${{ needs.see_if_should_skip.outputs.should_skip != 'true' }} steps: - name: Check out repo uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f 4 README.md @@ -28,7 +28,7 @@ If you've found a problem, you can open an issue using a [template](https://gith #### Solve an issue If you have a solution to one of the open issues, you will need to fork the repository and submit a PR using the [template](https://github.com/github/docs/blob/main/CONTRIBUTING.md#pull-request-template) that is visible automatically in the pull request body. For more details about this process, please check out [Getting Started with Contributing](/CONTRIBUTING.md). If you have a solution to one of the open issues, you will need to fork the repository and submit a pull request using the [template](https://github.com/github/docs/blob/main/CONTRIBUTING.md#pull-request-template) that is visible automatically in the pull request body. For more details about this process, please check out [Getting Started with Contributing](/CONTRIBUTING.md). #### Join us in discussions @@ -50,6 +50,8 @@ There are a few more things to know when you're getting started with this repo: In addition to the README you're reading right now, this repo includes other READMEs that describe the purpose of each subdirectory in more detail: - [content/README.md](content/README.md) - [content/graphql/README.md](content/graphql/README.md) - [content/rest/README.md](content/rest/README.md) - [contributing/README.md](contributing/README.md) - [data/README.md](data/README.md) - [data/reusables/README.md](data/reusables/README.md) BIN +164 KB assets/images/help/classroom/assignment-group-hero.png Binary file not shown. BIN +75.5 KB assets/images/help/classroom/assignment-ide-go-grant-access-button.png Binary file not shown. BIN +175 KB assets/images/help/classroom/assignment-individual-hero.png Binary file not shown. BIN +27.6 KB assets/images/help/classroom/assignment-repository-ide-button-in-readme.png Binary file not shown. BIN +83.4 KB assets/images/help/classroom/assignments-assign-deadline.png Binary file not shown. BIN +32.4 KB assets/images/help/classroom/assignments-assignment-title.png Binary file not shown. BIN +27.7 KB assets/images/help/classroom/assignments-autograding-click-pencil-or-trash.png Binary file not shown. BIN +72 KB assets/images/help/classroom/assignments-choose-repository-visibility.png Binary file not shown. BIN +20.1 KB assets/images/help/classroom/assignments-click-continue-button.png Binary file not shown. BIN +23.7 KB assets/images/help/classroom/assignments-click-create-assignment-button.png Binary file not shown. BIN +76.4 KB assets/images/help/classroom/assignments-click-grading-and-feedback.png Binary file not shown. BIN +53.1 KB assets/images/help/classroom/assignments-click-new-assignment-button.png Binary file not shown. BIN +134 KB assets/images/help/classroom/assignments-click-online-ide.png Binary file not shown. BIN +77.8 KB assets/images/help/classroom/assignments-click-pencil.png Binary file not shown. BIN +18.8 KB assets/images/help/classroom/assignments-click-review-button.png Binary file not shown. BIN +20.6 KB assets/images/help/classroom/assignments-click-save-test-case-button.png Binary file not shown. BIN +121 KB assets/images/help/classroom/assignments-click-template-repository-in-list.png Binary file not shown. BIN +21.1 KB assets/images/help/classroom/assignments-click-update-assignment.png Binary file not shown. BIN +76.9 KB assets/images/help/classroom/assignments-click-view-ide.png Binary file not shown. BIN +96.5 KB assets/images/help/classroom/assignments-click-view-test.png Binary file not shown. BIN +71.3 KB assets/images/help/classroom/assignments-define-teams.png Binary file not shown. BIN +39.4 KB assets/images/help/classroom/assignments-enable-feedback-pull-requests.png Binary file not shown. BIN +40.4 KB assets/images/help/classroom/assignments-type-protected-file-paths.png Binary file not shown. BIN +330 KB assets/images/help/classroom/autograding-actions-logs.png Binary file not shown. BIN +187 KB assets/images/help/classroom/autograding-actions-tab.png Binary file not shown. BIN +94.9 KB assets/images/help/classroom/autograding-click-grading-method.png Diff not rendered. BIN +57.5 KB assets/images/help/classroom/autograding-click-pencil.png Diff not rendered. BIN +57.7 KB assets/images/help/classroom/autograding-click-trash.png Diff not rendered. BIN +168 KB assets/images/help/classroom/autograding-hero.png Diff not rendered. BIN +154 KB assets/images/help/classroom/classroom-add-students-to-your-roster.png Diff not rendered. BIN +166 KB assets/images/help/classroom/classroom-copy-credentials.png Diff not rendered. BIN +181 KB assets/images/help/classroom/classroom-hero.png Diff not rendered. BIN +48.3 KB assets/images/help/classroom/classroom-settings-click-connection-settings.png Diff not rendered. BIN +94 KB ...ges/help/classroom/classroom-settings-click-disconnect-from-your-lms-button.png Diff not rendered. BIN +148 KB assets/images/help/classroom/classroom-settings-click-lms.png Diff not rendered. BIN +149 KB assets/images/help/classroom/click-assignment-in-list.png Diff not rendered. BIN +52.3 KB assets/images/help/classroom/click-classroom-in-list.png Diff not rendered. BIN +49.5 KB assets/images/help/classroom/click-create-classroom-button.png Diff not rendered. BIN +30 KB assets/images/help/classroom/click-create-roster-button.png Diff not rendered. BIN +78.2 KB assets/images/help/classroom/click-delete-classroom-button.png Diff not rendered. BIN +60.8 KB ...images/help/classroom/click-import-from-a-learning-management-system-button.png Diff not rendered. BIN +51.9 KB assets/images/help/classroom/click-new-classroom-button.png Diff not rendered. BIN +83.4 KB assets/images/help/classroom/click-organization.png Diff not rendered. BIN +28.4 KB assets/images/help/classroom/click-settings.png Diff not rendered. BIN +29.7 KB assets/images/help/classroom/click-students.png Diff not rendered. BIN +60 KB assets/images/help/classroom/click-update-students-button.png Diff not rendered. BIN +127 KB assets/images/help/classroom/delete-classroom-click-delete-classroom-button.png Diff not rendered. BIN +104 KB assets/images/help/classroom/delete-classroom-modal-with-warning.png Diff not rendered. BIN +264 KB assets/images/help/classroom/ide-makecode-arcade-version-control-button.png Diff not rendered. BIN +69.4 KB assets/images/help/classroom/ide-replit-version-control-button.png Diff not rendered. BIN +234 KB assets/images/help/classroom/lms-github-classroom-credentials.png Diff not rendered. BIN +955 KB assets/images/help/classroom/probot-settings.gif Diff not rendered. BIN +113 KB assets/images/help/classroom/roster-hero.png Diff not rendered. BIN +40.4 KB assets/images/help/classroom/settings-click-rename-classroom-button.png Diff not rendered. BIN +41 KB assets/images/help/classroom/settings-type-classroom-name.png Diff not rendered. BIN +140 KB assets/images/help/classroom/setup-click-authorize-github-classroom.png Diff not rendered. BIN +102 KB assets/images/help/classroom/setup-click-authorize-github.png Diff not rendered. BIN +163 KB assets/images/help/classroom/setup-click-grant.png Diff not rendered. BIN +324 KB assets/images/help/classroom/students-click-delete-roster-button-in-modal.png Diff not rendered. BIN +91.1 KB assets/images/help/classroom/students-click-delete-roster-button.png Diff not rendered. BIN +48.2 KB assets/images/help/classroom/type-classroom-name.png Diff not rendered. BIN +174 KB assets/images/help/classroom/type-or-upload-student-identifiers.png Diff not rendered. BIN +83.3 KB assets/images/help/classroom/use-drop-down-then-click-archive.png Diff not rendered. BIN +45.2 KB assets/images/help/classroom/use-drop-down-then-click-unarchive.png Diff not rendered. BIN +55.4 KB assets/images/help/discussions/choose-new-category.png Diff not rendered. BIN +56.8 KB assets/images/help/discussions/click-delete-and-move-button.png Diff not rendered. BIN +59.7 KB assets/images/help/discussions/click-delete-discussion.png Diff not rendered. BIN +65.3 KB assets/images/help/discussions/click-delete-for-category.png Diff not rendered. BIN +68.9 KB assets/images/help/discussions/click-delete-this-discussion-button.png Diff not rendered. BIN +353 KB assets/images/help/discussions/click-discussion-in-list.png Diff not rendered. BIN +41 KB assets/images/help/discussions/click-edit-categories.png Diff not rendered. BIN +64.3 KB assets/images/help/discussions/click-edit-for-category.png Diff not rendered. BIN +60.2 KB assets/images/help/discussions/click-edit-pinned-discussion.png Diff not rendered. BIN +104 KB assets/images/help/discussions/click-new-category-button.png Diff not rendered. BIN +98.2 KB assets/images/help/discussions/click-pin-discussion-button.png Diff not rendered. BIN +55.7 KB assets/images/help/discussions/click-pin-discussion.png Diff not rendered. BIN +104 KB assets/images/help/discussions/click-save.png Diff not rendered. BIN +59.9 KB assets/images/help/discussions/click-transfer-discussion-button.png Diff not rendered. BIN +60.2 KB assets/images/help/discussions/click-transfer-discussion.png Diff not rendered. BIN +63.3 KB assets/images/help/discussions/click-unpin-discussion-button.png Diff not rendered. BIN +59.8 KB assets/images/help/discussions/click-unpin-discussion.png Diff not rendered. BIN +140 KB assets/images/help/discussions/comment-mark-as-answer-button.png Diff not rendered. BIN +136 KB assets/images/help/discussions/comment-marked-as-answer.png Diff not rendered. BIN +234 KB assets/images/help/discussions/customize-pinned-discussion.png Diff not rendered. BIN +1.21 MB assets/images/help/discussions/discussons-hero.png Diff not rendered. BIN +139 KB assets/images/help/discussions/edit-category-details.png Diff not rendered. BIN +136 KB assets/images/help/discussions/edit-existing-category-details.png Diff not rendered. BIN +55.5 KB assets/images/help/discussions/existing-category-click-save-changes-button.png Diff not rendered. BIN +680 KB assets/images/help/discussions/hero.png Diff not rendered. BIN +307 KB assets/images/help/discussions/most-helpful.png Diff not rendered. BIN +52.9 KB assets/images/help/discussions/new-category-click-create-button.png Diff not rendered. BIN +132 KB assets/images/help/discussions/new-discussion-button.png Diff not rendered. BIN +140 KB assets/images/help/discussions/new-discussion-select-category-dropdown-menu.png Diff not rendered. BIN +46.7 KB assets/images/help/discussions/new-discussion-start-discussion-button.png Diff not rendered. BIN +108 KB assets/images/help/discussions/new-discussion-title-and-body-fields.png Diff not rendered. BIN +23.1 KB assets/images/help/discussions/public-repo-settings.png Diff not rendered. BIN +49.5 KB assets/images/help/discussions/repository-discussions-tab.png Diff not rendered. BIN +51.8 KB assets/images/help/discussions/search-and-filter-controls.png Diff not rendered. BIN +44.4 KB assets/images/help/discussions/search-result.png Diff not rendered. BIN +35.4 KB assets/images/help/discussions/select-discussions-checkbox.png Diff not rendered. BIN +44.8 KB assets/images/help/discussions/setup-discussions-button.png Diff not rendered. BIN +95.9 KB assets/images/help/discussions/toggle-allow-users-with-read-access-checkbox.png Diff not rendered. BIN +73 KB assets/images/help/discussions/unanswered-discussion.png Diff not rendered. BIN +81.3 KB assets/images/help/discussions/use-choose-a-repository-drop-down.png Diff not rendered. BIN +30.3 KB assets/images/help/discussions/your-discussions.png Diff not rendered. BIN +563 KB assets/images/help/education/click-get-teacher-benefits.png Diff not rendered. BIN +116 KB assets/images/help/images/overview-actions-result-navigate.png Diff not rendered. BIN +150 KB assets/images/help/images/overview-actions-result-updated-2.png Diff not rendered. BIN +128 KB assets/images/help/images/workflow-graph-job.png Diff not rendered. BIN +135 KB assets/images/help/images/workflow-graph.png Diff not rendered. BIN +5.46 KB assets/images/help/organizations/update-profile-button.png Diff not rendered. BIN +44.6 KB assets/images/help/pull_requests/dependency-review-rich-diff.png Diff not rendered. BIN +24.6 KB assets/images/help/pull_requests/dependency-review-source-diff.png Diff not rendered. BIN +214 KB assets/images/help/pull_requests/dependency-review-vulnerability.png Diff not rendered. BIN +105 KB assets/images/help/pull_requests/file-filter-menu-json.png Diff not rendered. BIN +22.5 KB (510%) assets/images/help/pull_requests/pull-request-tabs-changed-files.png Diff not rendered. BIN +45.2 KB assets/images/help/repository/actions-delete-artifact-updated.png Diff not rendered. BIN +122 KB assets/images/help/repository/actions-failed-pester-test-updated.png Diff not rendered. BIN +45.4 KB assets/images/help/repository/artifact-drop-down-updated.png Diff not rendered. BIN +54.5 KB assets/images/help/repository/cancel-check-suite-updated.png Diff not rendered. BIN +120 KB assets/images/help/repository/copy-link-button-updated-2.png Diff not rendered. BIN +77.6 KB assets/images/help/repository/delete-all-logs-updated-2.png Diff not rendered. BIN +326 KB assets/images/help/repository/docker-action-workflow-run-updated.png Diff not rendered. BIN +84.6 KB assets/images/help/repository/download-logs-drop-down-updated-2.png Diff not rendered. BIN +170 KB assets/images/help/repository/in-progress-run.png Diff not rendered. BIN +124 KB assets/images/help/repository/javascript-action-workflow-run-updated-2.png Diff not rendered. BIN +116 KB assets/images/help/repository/passing-data-between-jobs-in-a-workflow-updated.png Diff not rendered. BIN +80.8 KB assets/images/help/repository/rerun-checks-drop-down-updated.png Diff not rendered. BIN +41.2 KB assets/images/help/repository/search-log-box-updated-2.png Diff not rendered. BIN +133 KB assets/images/help/repository/super-linter-workflow-results-updated-2.png Diff not rendered. BIN +97.5 KB assets/images/help/repository/superlinter-lint-code-base-job-updated.png Diff not rendered. BIN -128 KB assets/images/help/repository/upload-build-test-artifact.png Diff not rendered. BIN +27.5 KB (170%) assets/images/help/repository/view-run-billable-time.png Diff not rendered. BIN +54.8 KB assets/images/help/repository/workflow-run-kebab-horizontal-icon-updated-2.png Diff not rendered. BIN +7.54 KB assets/images/help/settings/appearance-tab.png Diff not rendered. BIN +39.7 KB assets/images/help/settings/theme-settings-radio-buttons.png Diff not rendered. BIN +11.1 KB assets/images/help/settings/update-theme-preference-button.png Diff not rendered. BIN +22.5 KB assets/images/help/sponsors/billing-account-switcher.png Diff not rendered. BIN +6.37 KB (150%) assets/images/help/sponsors/edit-sponsorship-payment-button.png Diff not rendered. BIN +34.8 KB assets/images/help/sponsors/link-account-button.png Diff not rendered. BIN +12.8 KB (170%) assets/images/help/sponsors/manage-your-sponsorship-button.png Diff not rendered. BIN +20.6 KB assets/images/help/sponsors/organization-update-email-textbox.png Diff not rendered. BIN +13.5 KB assets/images/help/sponsors/pay-prorated-amount-link.png Diff not rendered. BIN +34.7 KB assets/images/help/sponsors/select-an-account-drop-down.png Diff not rendered. BIN +17 KB assets/images/help/sponsors/sponsor-as-drop-down-menu.png Diff not rendered. BIN +15.8 KB assets/images/help/sponsors/sponsoring-as-drop-down-menu.png Diff not rendered. BIN +16.1 KB assets/images/help/sponsors/sponsoring-settings-button.png Diff not rendered. BIN +29.5 KB assets/images/help/sponsors/sponsoring-tab.png Diff not rendered. BIN +7.91 KB assets/images/help/sponsors/update-checkbox-manage.png Diff not rendered. BIN +43 KB (160%) assets/images/marketplace/marketplace-request-button.png Diff not rendered. BIN +53.6 KB assets/images/marketplace/marketplace_verified_creator_badges_apps.png Diff not rendered. 6 content/actions/creating-actions/creating-a-docker-container-action.md @@ -226,6 +226,10 @@ jobs: ``` {% endraw %} From your repository, click the **Actions** tab, and select the latest workflow run. You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. From your repository, click the **Actions** tab, and select the latest workflow run. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}Under **Jobs** or in the visualization graph, click **A job to say hello**. {% endif %}You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 6 content/actions/creating-actions/creating-a-javascript-action.md @@ -261,9 +261,11 @@ jobs: ``` {% endraw %} From your repository, click the **Actions** tab, and select the latest workflow run. You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. From your repository, click the **Actions** tab, and select the latest workflow run. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}Under **Jobs** or in the visualization graph, click **A job to say hello**. {% endif %}You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% elsif currentVersion ver_gt "enterprise-server@2.22" %}  {% else %}  4 content/actions/guides/about-packaging-with-github-actions.md @@ -25,7 +25,11 @@ Creating a package at the end of a continuous integration workflow can help duri Now, when reviewing a pull request, you'll be able to look at the workflow run and download the artifact that was produced. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} This will let you run the code in the pull request on your machine, which can help with debugging or testing the pull request. 4 content/actions/guides/building-and-testing-powershell.md @@ -60,7 +60,11 @@ jobs: * `run: Test-Path resultsfile.log` - Check whether a file called `resultsfile.log` is present in the repository's root directory. * `Should -Be $true` - Uses Pester to define an expected result. If the result is unexpected, then {% data variables.product.prodname_actions %} flags this as a failed test. For example: {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} * `Invoke-Pester Unit.Tests.ps1 -Passthru` - Uses Pester to execute tests defined in a file called `Unit.Tests.ps1`. For example, to perform the same test described above, the `Unit.Tests.ps1` will contain the following: ``` 7 content/actions/guides/storing-workflow-data-as-artifacts.md @@ -108,8 +108,6 @@ jobs: path: output/test/code-coverage.html ```  {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} ### Configuring a custom artifact retention period @@ -238,7 +236,12 @@ jobs: echo The result is $value ``` The workflow run will archive any artifacts that it generated. For more information on downloading archived artifacts, see "[Downloading workflow artifacts](/actions/managing-workflow-runs/downloading-workflow-artifacts)." {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% if currentVersion == "free-pro-team@latest" %} 8 content/actions/index.md @@ -68,18 +68,18 @@ versions: <h2 class="mb-2 font-mktg h1">Code examples</h2> <div class="pr-lg-3 mb-5 mt-3"> <input class="js-code-example-filter input-lg py-2 px-3 col-12 col-lg-8 form-control" placeholder="Search code examples" type="search" autocomplete="off" aria-label="Search code examples"/> <input class="js-filter-card-filter input-lg py-2 px-3 col-12 col-lg-8 form-control" placeholder="Search code examples" type="search" autocomplete="off" aria-label="Search code examples"/> </div> <div class="d-flex flex-wrap gutter"> {% render 'code-example-card' for actionsCodeExamples as example %} </div> <button class="js-code-example-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> <button class="js-filter-card-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> <div class="js-code-example-no-results d-none py-4 text-center text-gray font-mktg"> <div class="js-filter-card-no-results d-none py-4 text-center text-gray font-mktg"> <div class="mb-3">{% octicon "search" width="24" %}</div> <h3 class="text-normal">Sorry, there is no result for <strong class="js-code-example-filter-value"></strong></h3> <h3 class="text-normal">Sorry, there is no result for <strong class="js-filter-card-value"></strong></h3> <p class="my-3 f4">It looks like we don't have an example that fits your filter.<br>Try another filter or add your code example</p> <a href="https://github.com/github/docs/blob/main/data/variables/action_code_examples.yml">Learn how to add a code example {% octicon "arrow-right" %}</a> </div> 11 content/actions/learn-github-actions/introduction-to-github-actions.md @@ -204,7 +204,7 @@ In this diagram, you can see the workflow file you just created and how the {% d ### Viewing the job's activity Once your job has started running, you can view each step's activity on {% data variables.product.prodname_dotcom %}. Once your job has started running, you can {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}see a visualization graph of the run's progress and {% endif %}view each step's activity on {% data variables.product.prodname_dotcom %}. {% data reusables.repositories.navigate-to-repo %} 1. Under your repository name, click **Actions**. @@ -213,7 +213,14 @@ Once your job has started running, you can view each step's activity on {% data  1. Under "Workflow runs", click the name of the run you want to see.  {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. Under **Jobs** or in the visualization graph, click the job you want to see.  {% endif %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. View the results of each step.  {% elsif currentVersion ver_gt "enterprise-server@2.22" %} 1. Click on the job name to see the results of each step.  {% else %} 7 content/actions/managing-workflow-runs/canceling-a-workflow.md @@ -17,9 +17,14 @@ versions: {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. From the list of workflow runs, click the name of the `queued` or `in progress` run that you want to cancel.  1. In the upper-right corner of the workflow, click **Cancel workflow**. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} ### Steps {% data variables.product.prodname_dotcom %} takes to cancel a workflow run 4 content/actions/managing-workflow-runs/downloading-workflow-artifacts.md @@ -20,4 +20,8 @@ versions: {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under **Artifacts**, click the artifact you want to download. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 1 content/actions/managing-workflow-runs/index.md @@ -18,6 +18,7 @@ versions: {% data reusables.actions.enterprise-beta %} {% data reusables.actions.enterprise-github-hosted-runners %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% link_in_list /using-the-visualization-graph %}{% endif %} {% link_in_list /viewing-workflow-run-history %} {% link_in_list /using-workflow-run-logs %} {% link_in_list /manually-running-a-workflow %} 3 content/actions/managing-workflow-runs/re-running-a-workflow.md @@ -16,5 +16,4 @@ versions: {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. In the upper-right corner of the workflow, use the **Re-run jobs** drop-down menu, and select **Re-run all jobs**.  1. In the upper-right corner of the workflow, use the **Re-run jobs** drop-down menu, and select **Re-run all jobs**.{% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% else %}{% endif %} 4 content/actions/managing-workflow-runs/removing-workflow-artifacts.md @@ -27,7 +27,11 @@ versions: {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under **Artifacts**, click {% octicon "trashcan" aria-label="The trashcan icon" %} next to the artifact you want to remove. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} ### Setting the retention period for an artifact 23 content/actions/managing-workflow-runs/using-the-visualization-graph.md @@ -0,0 +1,23 @@ --- title: Using the visualization graph intro: Every workflow run generates a real-time graph that illustrates the run progress. You can use this graph to monitor and debug workflows. product: '{% data reusables.gated-features.actions %}' versions: free-pro-team: '*' enterprise-server: '>=3.1' --- {% data reusables.actions.enterprise-beta %} {% data reusables.actions.visualization-beta %} {% data reusables.actions.enterprise-github-hosted-runners %} {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. The graph displays each job in the workflow. An icon to the left of the job name indicates the status of the job. Lines between jobs indicate dependencies.  2. Click on a job to view the job log.  18 content/actions/managing-workflow-runs/using-workflow-run-logs.md @@ -45,7 +45,11 @@ You can search the build logs for a particular step. When you search logs, only {% data reusables.repositories.navigate-to-job-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper-right corner of the log output, in the **Search logs** search box, type a search query. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% else %} 1. To expand each step you want to include in your search, click the step.  @@ -63,8 +67,12 @@ You can download the log files from your workflow run. You can also download a w {% data reusables.repositories.view-run-superlinter %} {% data reusables.repositories.navigate-to-job-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} and select **Download log archive**. 1. In the upper right corner, click {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% octicon "gear" aria-label="The gear icon" %}{% else %}{% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}{% endif %} and select **Download log archive**. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% else %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} and select **Download log archive**.  @@ -80,9 +88,17 @@ You can delete the log files from your workflow run. {% data reusables.repositor {% data reusables.repositories.view-run-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 2. To delete the log files, click the **Delete all logs** button and review the confirmation prompt. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} After deleting logs, the **Delete all logs** button is removed to indicate that no log files remain in the workflow run. {% else %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. 2 content/actions/managing-workflow-runs/viewing-job-execution-time.md @@ -15,7 +15,7 @@ Billable job execution minutes are only shown for jobs run on private repositori {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under the job summary, you can view the job's execution time. To view the billable job execution time, click **Run and billable time details**. 1. Under the job summary, you can view the job's execution time. To view details about the billable job execution time, click the time under **Billable time**.  {% note %} 5 content/actions/quickstart.md @@ -60,8 +60,13 @@ Committing the workflow file in your repository triggers the `push` event and ru {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow-superlinter %} {% data reusables.repositories.view-run-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. Under **Jobs** or in the visualization graph, click the **Lint code base** job.  {% else %} 1. In the left sidebar, click the **Lint code base** job.  {% endif %} {% data reusables.repositories.view-failed-job-results-superlinter %} ### More starter workflows 49 content/developers/github-marketplace/about-github-marketplace.md @@ -1,6 +1,6 @@ --- title: About GitHub Marketplace intro: 'Learn the basics to prepare your app for review before joining {% data variables.product.prodname_marketplace %}.' intro: 'Learn about {% data variables.product.prodname_marketplace %} where you can share your apps and actions publicly with all {% data variables.product.product_name %} users.' redirect_from: - /apps/marketplace/getting-started/ - /marketplace/getting-started @@ -14,52 +14,41 @@ versions: {% data reusables.actions.actions-not-verified %} To learn about publishing {% data variables.product.prodname_actions %} in the {% data variables.product.prodname_marketplace %}, see "[Publishing actions in GitHub Marketplace](/actions/creating-actions/publishing-actions-in-github-marketplace)." To learn about publishing {% data variables.product.prodname_actions %} in {% data variables.product.prodname_marketplace %}, see "[Publishing actions in GitHub Marketplace](/actions/creating-actions/publishing-actions-in-github-marketplace)." ### Apps You can list verified and unverified apps in {% data variables.product.prodname_marketplace %}. Unverified apps do not go through the security, testing, and verification cycle {% data variables.product.prodname_dotcom %} requires for verified apps. Anyone can share their apps with other users on {% data variables.product.prodname_marketplace %} but only listings that are verified by {% data variables.product.company_short %} can include paid plans. For more information, see "[About verified creators](/developers/github-marketplace/about-verified-creators)." Verified apps have a green badge in {% data variables.product.prodname_marketplace %}. Unverified apps have a grey badge next to their listing and are only available as free apps. If you're interested in creating an app for {% data variables.product.prodname_marketplace %}, but you're new to {% data variables.product.prodname_github_apps %} or {% data variables.product.prodname_oauth_app %}s, see "[Building {% data variables.product.prodname_github_apps %}](/developers/apps/building-github-apps)" or "[Building {% data variables.product.prodname_oauth_app %}s](/developers/apps/building-oauth-apps)."  If you're interested in creating an app for {% data variables.product.prodname_marketplace %}, but you're new to {% data variables.product.prodname_github_apps %} and {% data variables.product.prodname_oauth_app %}s, see "[Building apps](/apps/)." {% data reusables.marketplace.github_apps_preferred %}, although you can list both OAuth and {% data variables.product.prodname_github_app %}s in {% data variables.product.prodname_marketplace %}. See "[Differences between GitHub and OAuth apps](/apps/differences-between-apps/)" for more details. To learn more about switching from OAuth to {% data variables.product.prodname_github_apps %}, see [Migrating OAuth Apps to {% data variables.product.prodname_github_app %}s](/apps/migrating-oauth-apps-to-github-apps/). {% data reusables.marketplace.github_apps_preferred %}, although you can list both OAuth and {% data variables.product.prodname_github_app %}s in {% data variables.product.prodname_marketplace %}. For more information, see "[Differences between {% data variables.product.prodname_github_apps %} and {% data variables.product.prodname_oauth_app %}s](/apps/differences-between-apps/)" and "[Migrating {% data variables.product.prodname_oauth_app %}s to {% data variables.product.prodname_github_apps %}](/apps/migrating-oauth-apps-to-github-apps/)." If you have questions about {% data variables.product.prodname_marketplace %}, please contact {% data variables.contact.contact_support %} directly. #### Unverified Apps Unverified apps do not need to meet the "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)" or go through the "[Security review process](/marketplace/getting-started/security-review-process/)". {% data reusables.marketplace.unverified-apps %} Having a published paid plan will prevent you from being able to submit an unverified app. You must remove paid plans or keep them in draft mode before publishing an unverified app. To list your unverified app in {% data variables.product.prodname_marketplace %}, you only need to create a "[Listing on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/)" and submit it as an unverified listing. {% data reusables.marketplace.launch-with-free %} ### Publishing an app to {% data variables.product.prodname_marketplace %} #### Verified Apps When you have finished creating your app, you can share it with other users by publishing it to {% data variables.product.prodname_marketplace %}. In summary, the process is: If you've already built an app and you're interested in submitting a verified listing in {% data variables.product.prodname_marketplace %}, start here: 1. Review your app carefully to ensure that it will behave as expected in other repositories and that it follows best practice guidelines. For more information, see "[Security best practices for apps](/developers/github-marketplace/security-best-practices-for-apps)" and "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app#best-practice-for-customer-experience)." 1. [Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)<br/>Learn about requirements, guidelines, and the app submission process. 1. Add webhook events to the app to track user billing requests. For more information about the {% data variables.product.prodname_marketplace %} API, webhook events, and billing requests, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." 1. [Integrating with the {% data variables.product.prodname_marketplace %} API](/marketplace/integrating-with-the-github-marketplace-api/)<br/>Before you can list your app on {% data variables.product.prodname_marketplace %}, you'll need to integrate billing flows using the {% data variables.product.prodname_marketplace %} API and webhook events. 1. Create a draft {% data variables.product.prodname_marketplace %} listing. For more information, see "[Drafting a listing for your app](/developers/github-marketplace/drafting-a-listing-for-your-app)." 1. [Listing on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/) <br/>Create a draft {% data variables.product.prodname_marketplace %} listing, configure webhook settings, and set up pricing plans. 1. Add a pricing plan. For more information, see "[Setting pricing plans for your listing](/developers/github-marketplace/setting-pricing-plans-for-your-listing)." 1. [Selling your app](/marketplace/selling-your-app/)<br/>Learn about pricing plans, billing cycles, and how to receive payment from {% data variables.product.prodname_dotcom %} for your app. 1. Check whether your app meets the requirements for listing on {% data variables.product.prodname_marketplace %} as a free or a paid app. For more information, see "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app)." 1. [{% data variables.product.prodname_marketplace %} Insights](/marketplace/github-marketplace-insights/)<br/>See how your app is performing in {% data variables.product.prodname_marketplace %}. You can use metrics collected by {% data variables.product.prodname_dotcom %} to guide your marketing campaign and be successful in {% data variables.product.prodname_marketplace %}. 1. Read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." 1. [{% data variables.product.prodname_marketplace %} transactions](/marketplace/github-marketplace-transactions/)<br/>Download and view transaction data for your {% data variables.product.prodname_marketplace %} listing. 1. Submit your listing for publication in {% data variables.product.prodname_marketplace %}, requesting verification if you want to sell the app. For more information, see "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication)." ### Reviewing your app An onboarding expert will contact you with any questions or further steps. For example, if you have added a paid plan, you will need to complete the verification process and complete financial onboarding. As soon as your listing is approved the app is published to {% data variables.product.prodname_marketplace %}. We want to make sure that the apps offered on {% data variables.product.prodname_marketplace %} are safe, secure, and well tested. The {% data variables.product.prodname_marketplace %} onboarding specialists will review your app to ensure that it meets all requirements. Follow the guidelines in these articles before submitting your app: ### Seeing how your app is performing You can access metrics and transactions for your listing. For more information, see: * [Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/) * [Security review process](/marketplace/getting-started/security-review-process/) - "[Viewing metrics for your listing](/developers/github-marketplace/viewing-metrics-for-your-listing)" - "[Viewing transactions for your listing](/developers/github-marketplace/viewing-transactions-for-your-listing)" 43 content/developers/github-marketplace/about-verified-creators.md @@ -0,0 +1,43 @@ --- title: About verified creators intro: 'Each organization that wants to sell apps on {% data variables.product.prodname_marketplace %} must follow a verification process. Their identity is checked and their billing process reviewed.' versions: free-pro-team: '*' --- ### About verified creators A verified creator is an organization that {% data variables.product.company_short %} has checked. Anyone can share their apps with other users on {% data variables.product.prodname_marketplace %} but only organizations that are verified by {% data variables.product.company_short %} can sell apps. For more information about organizations, see "[About organizations](/github/setting-up-and-managing-organizations-and-teams/about-organizations)." The verification process aims to protect users. For example, it verifies the seller's identity, checks that their {% data variables.product.product_name %} organization is set up securely, and that they can be contacted for support. After passing the verification checks, any apps that the organization lists on {% data variables.product.prodname_marketplace %} are shown with a verified creator badge {% octicon "verified" aria-label="Verified creator badge" %}. The organization can now add paid plans to any of their apps. Each app with a paid plan also goes through a financial onboarding process to check that it's set up to handle billing correctly.  In addition to the verified creator badge, you'll also see badges for unverified and verified apps. These apps were published using the old method for verifying individual apps.  For information on finding apps to use, see "[Searching {% data variables.product.prodname_marketplace %}](/github/searching-for-information-on-github/searching-github-marketplace)." ### About the verification process The first time you request verification for a listing of one of your apps, you will enter the verification process. An onboarding expert will guide you through the process. This includes checking: - Profile information - The basic profile information is populated accurately and appropriately. - Security - The organization has enabled two-factor authentication. - Verified domain - The organization has verified the domain of the site URL. - Purchase webhook event - The event is handled correctly by the app. When your organization is verified, all your apps are shown with a verified creator badge. You are now able to offer paid plans for any of your apps. For more information about the requirements for listing an app on {% data variables.product.prodname_marketplace %}, see "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)." {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." {% note %} **Note:** This verification process for apps replaces the previous process where individual apps were verified. The current process is similar to the verification process for actions. If you have apps that were verified under the old process, these will not be affected by the changes. The {% data variables.product.prodname_marketplace %} team will contact you with details of how to migrate to organization-based verification. {% endnote %} 12 content/developers/github-marketplace/billing-customers.md @@ -13,17 +13,17 @@ versions: ### Understanding the billing cycle Customers can choose a monthly or yearly billing cycle when they purchase your app. All changes customers make to the billing cycle and plan selection will trigger a `marketplace_purchase` event. You can refer to the `marketplace_purchase` webhook payload to see which billing cycle a customer selects and when the next billing date begins (`effective_date`). For more information about webhook payloads, see "[{% data variables.product.prodname_marketplace %} webhook events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)." Customers can choose a monthly or yearly billing cycle when they purchase your app. All changes customers make to the billing cycle and plan selection will trigger a `marketplace_purchase` event. You can refer to the `marketplace_purchase` webhook payload to see which billing cycle a customer selects and when the next billing date begins (`effective_date`). For more information about webhook payloads, see "[Webhook events for the {% data variables.product.prodname_marketplace %} API](/developers/github-marketplace/webhook-events-for-the-github-marketplace-api)." ### Providing billing services in your app's UI Customers must be able to perform the following actions from your app's website: - Customers must be able to modify or cancel their {% data variables.product.prodname_marketplace %} plans for personal and organizational accounts separately. Customers should be able to perform the following actions from your app's website: - Customers should be able to modify or cancel their {% data variables.product.prodname_marketplace %} plans for personal and organizational accounts separately. {% data reusables.marketplace.marketplace-billing-ui-requirements %} ### Billing services for upgrades, downgrades, and cancellations Follow these guidelines for upgrades, downgrades, and cancellations to maintain a clear and consistent billing process. For more detailed instructions about the {% data variables.product.prodname_marketplace %} purchase events, see "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)." Follow these guidelines for upgrades, downgrades, and cancellations to maintain a clear and consistent billing process. For more detailed instructions about the {% data variables.product.prodname_marketplace %} purchase events, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." You can use the `marketplace_purchase` webhook's `effective_date` key to determine when a plan change will occur and periodically synchronize the [List accounts for a plan](/rest/reference/apps#list-accounts-for-a-plan). @@ -33,7 +33,7 @@ When a customer upgrades their pricing plan or changes their billing cycle from {% data reusables.marketplace.marketplace-failed-purchase-event %} For information about building upgrade and downgrade workflows into your app, see "[Upgrading and downgrading plans](/marketplace/integrating-with-the-github-marketplace-api/upgrading-and-downgrading-plans/)." For information about building upgrade and downgrade workflows into your app, see "[Handling plan changes](/developers/github-marketplace/handling-plan-changes)." #### Downgrades and cancellations @@ -45,4 +45,4 @@ When a customer cancels a plan, you must: {% data reusables.marketplace.cancellation-clarification %} - Enable them to upgrade the plan through GitHub if they would like to continue the plan at a later time. For information about building cancellation workflows into your app, see "[Cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/)." For information about building cancellation workflows into your app, see "[Handling plan cancellations](/developers/github-marketplace/handling-plan-cancellations)." 20 ...nt/developers/github-marketplace/customer-experience-best-practices-for-apps.md @@ -0,0 +1,20 @@ --- title: Customer experience best practices for apps intro: 'Guidelines for creating an app that will be easy to use and understand.' shortTitle: Customer experience best practice versions: free-pro-team: '*' --- If you follow these best practices it will help you to provide a good customer experience. ### Customer communication - Marketing materials for the app should accurately represent the app's behavior. - Apps should include links to user-facing documentation that describe how to set up and use the app. - Customers should be able to see what type of plan they have in the billing, profile, or account settings section of the app. - Customers should be able to install and use your app on both a personal account and an organization account. They should be able to view and manage the app on those accounts separately. ### Plan management {% data reusables.marketplace.marketplace-billing-ui-requirements %} 4 content/developers/github-marketplace/drafting-a-listing-for-your-app.md @@ -59,8 +59,8 @@ Once you've created a {% data variables.product.prodname_marketplace %} draft li ### Submitting your app Once you've completed your {% data variables.product.prodname_marketplace %} listing, you can submit your listing for review from the **Overview** page. You'll need to read and accept the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)," and then you can click **Submit for review**. After you submit your app for review, the {% data variables.product.prodname_marketplace %} onboarding team will contact you with additional information about the onboarding process. You can learn more about the onboarding and security review process in "[Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)." Once you've completed your {% data variables.product.prodname_marketplace %} listing, you can submit your listing for review from the **Overview** page. You'll need to read and accept the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)," and then you can click **Submit for review**. After you submit your app for review, an onboarding expert will contact you with additional information about the onboarding process. You can learn more about the onboarding and security review process in "[Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)." ### Removing a {% data variables.product.prodname_marketplace %} listing If you no longer want to list your app in {% data variables.product.prodname_marketplace %}, contact [marketplace@github.com](mailto:marketplace@github.com) to remove your listing. If you no longer want to list your app in {% data variables.product.prodname_marketplace %}, contact {% data variables.contact.contact_support %} to remove your listing. 2 content/developers/github-marketplace/handling-new-purchases-and-free-trials.md @@ -28,7 +28,7 @@ GitHub then sends the [`marketplace_purchase`](/webhooks/event-payloads/#marketp Read the `effective_date` and `marketplace_purchase` object from the `marketplace_purchase` webhook to determine which plan the customer purchased, when the billing cycle starts, and when the next billing cycle begins. If your app offers a free trial, read the `marketplace_purchase[on_free_trial]` attribute from the webhook. If the value is `true`, your app will need to track the free trial start date (`effective_date`) and the date the free trial ends (`free_trial_ends_on`). Use the `free_trial_ends_on` date to display the remaining days left in a free trial in your app's UI. You can do this in either a banner or in your [billing UI](/marketplace/selling-your-app/billing-customers-in-github-marketplace/#providing-billing-services-in-your-apps-ui). To learn how to handle cancellations before a free trial ends, see "[Cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/)." See "[Upgrading and downgrading plans](/marketplace/integrating-with-the-github-marketplace-api/upgrading-and-downgrading-plans/)" to find out how to transition a free trial to a paid plan when a free trial expires. If your app offers a free trial, read the `marketplace_purchase[on_free_trial]` attribute from the webhook. If the value is `true`, your app will need to track the free trial start date (`effective_date`) and the date the free trial ends (`free_trial_ends_on`). Use the `free_trial_ends_on` date to display the remaining days left in a free trial in your app's UI. You can do this in either a banner or in your [billing UI](/marketplace/selling-your-app/billing-customers-in-github-marketplace/#providing-billing-services-in-your-apps-ui). To learn how to handle cancellations before a free trial ends, see "[Handling plan cancellations](/developers/github-marketplace/handling-plan-cancellations)." See "[Handling plan changes](/developers/github-marketplace/handling-plan-changes)" to find out how to transition a free trial to a paid plan when a free trial expires. See "[{% data variables.product.prodname_marketplace %} webhook events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)" for an example of the `marketplace_purchase` event payload. 6 content/developers/github-marketplace/index.md @@ -11,8 +11,10 @@ versions: {% topic_link_in_list /creating-apps-for-github-marketplace %} {% link_in_list /about-github-marketplace %} {% link_in_list /about-verified-creators %} {% link_in_list /requirements-for-listing-an-app %} {% link_in_list /security-review-process-for-submitted-apps %} {% link_in_list /security-best-practices-for-apps %} {% link_in_list /customer-experience-best-practices-for-apps %} {% link_in_list /viewing-metrics-for-your-listing %} {% link_in_list /viewing-transactions-for-your-listing %} {% topic_link_in_list /using-the-github-marketplace-api-in-your-app %} @@ -27,7 +29,7 @@ versions: {% link_in_list /writing-a-listing-description-for-your-app %} {% link_in_list /setting-pricing-plans-for-your-listing %} {% link_in_list /configuring-a-webhook-to-notify-you-of-plan-changes %} {% link_in_list /submitting-your-listing-for-review %} {% link_in_list /submitting-your-listing-for-publication %} {% topic_link_in_list /selling-your-app-on-github-marketplace %} {% link_in_list /pricing-plans-for-github-marketplace-apps %} {% link_in_list /billing-customers %} 32 content/developers/github-marketplace/pricing-plans-for-github-marketplace-apps.md @@ -10,35 +10,45 @@ versions: {% data variables.product.prodname_marketplace %} pricing plans can be free, flat rate, or per-unit, and GitHub lists the price in US dollars. Customers purchase your app using a payment method attached to their {% data variables.product.product_name %} account, without having to leave GitHub.com. You don't have to write code to perform billing transactions, but you will have to handle [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows) for purchase events. {% data variables.product.prodname_marketplace %} pricing plans can be free, flat rate, or per-unit. Prices are set, displayed, and processed in US dollars. Paid plans are restricted to verified listings. Customers purchase your app using a payment method attached to their {% data variables.product.product_name %} account, without having to leave {% data variables.product.prodname_dotcom_the_website %}. You don't have to write code to perform billing transactions, but you will have to handle events from the {% data variables.product.prodname_marketplace %} API. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If the app you're listing on {% data variables.product.prodname_marketplace %} has multiple plan options, you can set up corresponding pricing plans. For example, if your app has two plan options, an open source plan and a pro plan, you can set up a free pricing plan for your open source plan and a flat pricing plan for your pro plan. Each {% data variables.product.prodname_marketplace %} listing must have an annual and a monthly price for every plan that's listed. For more information on how to create a pricing plan, see "[Setting a {% data variables.product.prodname_marketplace %} listing's pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/)." {% note %} {% data reusables.marketplace.free-plan-note %} **Note:** If you're listing an app on {% data variables.product.prodname_marketplace %}, you can't list your app with a free pricing plan if you offer a paid service outside of {% data variables.product.prodname_marketplace %}. ### Types of pricing plans {% endnote %} #### Free pricing plans ### Types of pricing plans {% data reusables.marketplace.free-apps-encouraged %} Free plans are completely free for users. If you set up a free pricing plan, you cannot charge users that choose the free pricing plan for the use of your app. You can create both free and paid plans for your listing. All apps need to handle events for new purchases and cancellations. Apps that only have free plans do not need to handle events for free trials, upgrades, and downgrades. For more information, see: "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If you add a paid plan to an app that you've already listed in {% data variables.product.prodname_marketplace %} as a free service, you'll need to request verification for the app and go through financial onboarding. #### Paid pricing plans **Free pricing plans** are completely free for users. If you set up a free pricing plan, you cannot charge users that choose the free pricing plan for the use of your app. You can create both free and paid plans for your listing. Unverified free apps do not need to implement any billing flows. Free apps that are verified by Github need to implement billing flows for new purchases and cancellations, but do not need to implement billing flows for free trials, upgrades, and downgrades. If you add a paid plan to an app that you've already listed in {% data variables.product.prodname_marketplace %} as a free service, you'll need to resubmit the app for review. There are two types of paid pricing plan: **Flat rate pricing plans** charge a set fee on a monthly and yearly basis. - Flat rate pricing plans charge a set fee on a monthly and yearly basis. **Per-unit pricing plans** charge a set fee on either a monthly or yearly basis for a unit that you specify. A "unit" can be anything you'd like (for example, a user, seat, or person). - Per-unit pricing plans charge a set fee on either a monthly or yearly basis for a unit that you specify. A "unit" can be anything you'd like (for example, a user, seat, or person). **Marketplace free trials** provide 14-day free trials of OAuth or GitHub Apps to customers. When you [set up a Marketplace pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/), you can select the option to provide a free trial for flat-rate or per-unit pricing plans. You may also want to offer free trials. These provide free, 14-day trials of OAuth or GitHub Apps to customers. When you set up a Marketplace pricing plan, you can select the option to provide a free trial for flat-rate or per-unit pricing plans. ### Free trials Customers can start a free trial for any available paid plan on a Marketplace listing, but will not be able to create more than one free trial for a Marketplace product. Customers can start a free trial for any paid plan on a Marketplace listing that includes free trials. However, customers cannot create more than one free trial per marketplace product. Free trials have a fixed length of 14 days. Customers are notified 4 days before the end of their trial period (on day 11 of the free trial) that their plan will be upgraded. At the end of a free trial, customers will be auto-enrolled into the plan they are trialing if they do not cancel. See "[New purchases and free trials](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/)" for details on how to handle free trials in your app. For more information, see: "[Handling new purchases and free trials](/developers/github-marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/)." {% note %} 61 content/developers/github-marketplace/requirements-for-listing-an-app.md @@ -1,6 +1,6 @@ --- title: Requirements for listing an app intro: 'Apps on {% data variables.product.prodname_marketplace %} must meet the requirements outlined on this page before our {% data variables.product.prodname_marketplace %} onboarding specialists will approve the listing.' intro: 'Apps on {% data variables.product.prodname_marketplace %} must meet the requirements outlined on this page before the listing can be published.' redirect_from: - /apps/adding-integrations/listing-apps-on-github-marketplace/requirements-for-listing-an-app-on-github-marketplace/ - /apps/marketplace/listing-apps-on-github-marketplace/requirements-for-listing-an-app-on-github-marketplace/ @@ -12,49 +12,62 @@ versions: free-pro-team: '*' --- <!--UI-LINK: Displayed as a link on the https://github.com/marketplace/new page.--> The requirements for listing an app on {% data variables.product.prodname_marketplace %} vary according to whether you want to offer a free or a paid app. Before you submit your app for review, you must read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." You'll accept the terms within your [draft listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/) on {% data variables.product.product_name %}. Once you've submitted your app, one of the {% data variables.product.prodname_marketplace %} onboarding specialists will reach out to you with more information about the onboarding process, and review your app to ensure it meets these requirements: ### Requirements for all {% data variables.product.prodname_marketplace %} listings ### User experience All listings on {% data variables.product.prodname_marketplace %} should be for tools that provide value to the {% data variables.product.product_name %} community. When you submit your listing for publication, you must read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." - {% data variables.product.prodname_github_app %}s should have a minimum of 100 installations. - {% data variables.product.prodname_oauth_app %}s should have a minimum of 200 users. #### User experience requirements for all apps All listings should meet the following requirements, regardless of whether they are for a free or paid app. - Listings must not actively persuade users away from {% data variables.product.product_name %}. - Listings must include valid contact information for the publisher. - Listings must have a relevant description of the application. - Listings must specify a pricing plan. - Apps must provide value to customers and integrate with the platform in some way beyond authentication. - Apps must be publicly available in {% data variables.product.prodname_marketplace %} and cannot be in beta or available by invite only. - Apps cannot actively persuade users away from {% data variables.product.product_name %}. - Marketing materials for the app must accurately represent the app's behavior. - Apps must include links to user-facing documentation that describe how to set up and use the app. - When a customer purchases an app and GitHub redirects them to the app's installation URL, the app must begin the OAuth flow immediately. For details, see "[Handling new purchases and free trials](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/#step-3-authorization)." - Apps must have webhook events set up to notify the publisher of any plan changes or cancellations using the {% data variables.product.prodname_marketplace %} API. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." - Customers must be able to install your app and select repositories on both a personal and organization account. They should be able to view and manage those accounts separately. For more information on providing a good customer experience, see "[Customer experience best practices for apps](/developers/github-marketplace/customer-experience-best-practices-for-apps)." ### Brand and listing #### Brand and listing requirements for all apps - Apps that use GitHub logos must follow the "[{% data variables.product.product_name %} Logos and Usage](https://github.com/logos)" guidelines. - Apps that use GitHub logos must follow the {% data variables.product.company_short %} guidelines. For more information, see "[{% data variables.product.company_short %} Logos and Usage](https://github.com/logos)." - Apps must have a logo, feature card, and screenshots images that meet the recommendations provided in "[Writing {% data variables.product.prodname_marketplace %} listing descriptions](/marketplace/listing-on-github-marketplace/writing-github-marketplace-listing-descriptions/)." - Listings must include descriptions that are well written and free of grammatical errors. For guidance in writing your listing, see "[Writing {% data variables.product.prodname_marketplace %} listing descriptions](/marketplace/listing-on-github-marketplace/writing-github-marketplace-listing-descriptions/)." ### Security To protect your customers, we recommend that you also follow security best practices. For more information, see "[Security best practices for apps](/developers/github-marketplace/security-best-practices-for-apps)." ### Considerations for free apps Apps will go through a security review before being listed on {% data variables.product.prodname_marketplace %}. A successful review will meet the requirements and follow the security best practices listed in "[Security review process](/marketplace/getting-started/security-review-process/)." For information on the review process, contact [marketplace@github.com](mailto:marketplace@github.com). {% data reusables.marketplace.free-apps-encouraged %} ### Requirements for paid apps In addition to the requirements for all apps above, each app that you offer as a paid service on {% data variables.product.prodname_marketplace %} must also meet the following requirements: - {% data variables.product.prodname_github_app %}s should have a minimum of 100 installations. - {% data variables.product.prodname_oauth_app %}s should have a minimum of 200 users. - All paid apps must handle {% data variables.product.prodname_marketplace %} purchase events for new purchases, upgrades, downgrades, cancellations, and free trials. For more information, see "[Billing requirements for paid apps](#billing-requirements-for-paid-apps)" below. - Publishing organizations must have a verified domain and must enable two-factor authentication. For more information, see "[Requiring two-factor authentication in your organization](/github/setting-up-and-managing-organizations-and-teams/requiring-two-factor-authentication-in-your-organization.") ### Billing flows When you are ready to publish the app on {% data variables.product.prodname_marketplace %} you must request verification for the listing. Your app must integrate [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows) using the [{% data variables.product.prodname_marketplace %} webhook event](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/). {% note %} #### Free apps The verification process is open to organizations. {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." {% data reusables.marketplace.free-apps-encouraged %} If you are listing a free app, you'll need to meet these requirements: {% endnote %} - Customers must be able to see that they have a free plan in the billing, profile, or account settings section of the app. - When a customer cancels your app, you must follow the flow for [cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/). ### Billing requirements for paid apps #### Paid apps Your app does not need to handle payments but does need to use {% data variables.product.prodname_marketplace %} purchase events to manage new purchases, upgrades, downgrades, cancellations, and free trials. For information about how integrate these events into your app, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." To offer your app as a paid service, you'll need to meet these requirements to list your app on {% data variables.product.prodname_marketplace %}: Using GitHub's billing API allows customers to purchase an app without leaving GitHub and to pay for the service with the payment method already attached to their {% data variables.product.product_name %} account. - To sell your app in {% data variables.product.prodname_marketplace %}, it must use GitHub's billing system. Your app does not need to handle payments but does need to use "[{% data variables.product.prodname_marketplace %} purchase events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)" to manage new purchases, upgrades, downgrades, cancellations, and free trials. See "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)" to learn about how to integrate these events into your app. Using GitHub's billing system allows customers to purchase an app without leaving GitHub and pay for the service with the payment method already attached to their {% data variables.product.product_name %} account. - Apps must support both monthly and annual billing for paid subscriptions purchases. - Listings may offer any combination of free and paid plans. Free plans are optional but encouraged. For more information, see "[Setting a {% data variables.product.prodname_marketplace %} listing's pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/)." {% data reusables.marketplace.marketplace-billing-ui-requirements %} 60 content/developers/github-marketplace/security-best-practices-for-apps.md @@ -0,0 +1,60 @@ --- title: Security best practices for apps intro: 'Guidelines for preparing a secure app to share on {% data variables.product.prodname_marketplace %}.' redirect_from: - /apps/marketplace/getting-started/security-review-process/ - /marketplace/getting-started/security-review-process - /developers/github-marketplace/security-review-process-for-submitted-apps shortTitle: Security best practice versions: free-pro-team: '*' --- If you follow these best practices it will help you to provide a secure user experience. ### Authorization, authentication, and access control We recommend creating a GitHub App rather than an OAuth App. {% data reusables.marketplace.github_apps_preferred %}. See "[Differences between GitHub Apps and OAuth Apps](/apps/differences-between-apps/)" for more details. - Apps should use the principle of least privilege and should only request the OAuth scopes and GitHub App permissions that the app needs to perform its intended functionality. For more information, see [Principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege) in Wikipedia. - Apps should provide customers with a way to delete their account, without having to email or call a support person. - Apps should not share tokens between different implementations of the app. For example, a desktop app should have a separate token from a web-based app. Individual tokens allow each app to request the access needed for GitHub resources separately. - Design your app with different user roles, depending on the functionality needed by each type of user. For example, a standard user should not have access to admin functionality, and billing managers might not need push access to repository code. - Apps should not share service accounts such as email or database services to manage your SaaS service. - All services used in your app should have unique login and password credentials. - Admin privilege access to the production hosting infrastructure should only be given to engineers and employees with administrative duties. - Apps should not use personal access tokens to authenticate and should authenticate as an [OAuth App](/apps/about-apps/#about-oauth-apps) or a [GitHub App](/apps/about-apps/#about-github-apps): - OAuth Apps should authenticate using an [OAuth token](/apps/building-oauth-apps/authorizing-oauth-apps/). - GitHub Apps should authenticate using either a [JSON Web Token (JWT)](/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app), [OAuth token](/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps/), or [installation access token](/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-an-installation). ### Data protection - Apps should encrypt data transferred over the public internet using HTTPS, with a valid TLS certificate, or SSH for Git. - Apps should store client ID and client secret keys securely. We recommend storing them as [environmental variables](http://en.wikipedia.org/wiki/Environment_variable#Getting_and_setting_environment_variables). - Apps should delete all GitHub user data within 30 days of receiving a request from the user, or within 30 days of the end of the user's legal relationship with GitHub. - Apps should not require the user to provide their GitHub password. - Apps should encrypt tokens, client IDs, and client secrets. ### Logging and monitoring Apps should have logging and monitoring capabilities. App logs should be retained for at least 30 days and archived for at least one year. A security log should include: - Authentication and authorization events - Service configuration changes - Object reads and writes - All user and group permission changes - Elevation of role to admin - Consistent timestamping for each event - Source users, IP addresses, and/or hostnames for all logged actions ### Incident response workflow To provide a secure experience for users, you should have a clear incident response plan in place before listing your app. We recommend having a security and operations incident response team in your company rather than using a third-party vendor. You should have the capability to notify {% data variables.product.product_name %} within 24 hours of a confirmed incident. For an example of an incident response workflow, see the "Data Breach Response Policy" on the [SANS Institute website](https://www.sans.org/information-security-policy/). A short document with clear steps to take in the event of an incident is more valuable than a lengthy policy template. ### Vulnerability management and patching workflow You should conduct regular vulnerability scans of production infrastructure. You should triage the results of vulnerability scans and define a period of time in which you agree to remediate the vulnerability. If you are not ready to set up a full vulnerability management program, it's useful to start by creating a patching process. For guidance in creating a patch management policy, see this TechRepublic article "[Establish a patch management policy](https://www.techrepublic.com/blog/it-security/establish-a-patch-management-policy-87756/)." 94 ...ent/developers/github-marketplace/security-review-process-for-submitted-apps.md This file was deleted. 53 content/developers/github-marketplace/setting-pricing-plans-for-your-listing.md @@ -1,6 +1,6 @@ --- title: Setting pricing plans for your listing intro: 'When [listing your app on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/), you can choose to provide your app as a free service or sell your app. If you plan to sell your app, you can create different pricing plans for different feature tiers.' intro: 'When you list your app on {% data variables.product.prodname_marketplace %}, you can choose to provide your app as a free service or sell your app. If you plan to sell your app, you can create different pricing plans for different feature tiers.' redirect_from: - /apps/adding-integrations/managing-pricing-and-payments-for-a-github-marketplace-listing/setting-a-github-marketplace-listing-s-pricing-plan/ - /apps/marketplace/managing-pricing-and-payments-for-a-github-marketplace-listing/setting-a-github-marketplace-listing-s-pricing-plan/ @@ -17,57 +17,52 @@ versions: free-pro-team: '*' --- ### About setting pricing plans If you want to sell an app on {% data variables.product.prodname_marketplace %}, you need to request verification when you publish the listing for your app. During the verification process, an onboarding expert checks the organization's identity and security settings. The onboarding expert will also take the organization through financial onboarding. For more information, see: "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)." ### Creating pricing plans To learn about the types of pricing plans that {% data variables.product.prodname_marketplace %} offers, see "[{% data variables.product.prodname_marketplace %} Pricing Plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." You'll also find helpful billing guidelines in "[Selling your app](/marketplace/selling-your-app/)." Pricing plans can be in the draft or published state. If you haven't submitted your {% data variables.product.prodname_marketplace %} listing for approval, a published listing will function the same way as draft listings until your app is approved and listed on {% data variables.product.prodname_marketplace %}. Draft listings allow you to create and save new pricing plans without making them available on your {% data variables.product.prodname_marketplace %} listing page. Once you publish the pricing plan, it's available for customers to purchase immediately. You can publish up to 10 pricing plans. {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." To create a pricing plan for your {% data variables.product.prodname_marketplace %} listing, click **Plans and pricing** in the left sidebar of your [{% data variables.product.prodname_marketplace %} listing page](https://github.com/marketplace/manage). If you haven't created a {% data variables.product.prodname_marketplace %} listing yet, read "[Creating a draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/)" to learn how. When you click **New draft plan**, you'll see a form that allows you to customize your pricing plan. You'll need to configure the following fields to create a pricing plan: {% data variables.product.prodname_marketplace %} offers several different types of pricing plan. For detailed information, see "[Pricing plans for {% data variables.product.prodname_marketplace %}](/developers/github-marketplace/pricing-plans-for-github-marketplace-apps)." #### Plan name ### About saving pricing plans Your pricing plan's name will appear on your {% data variables.product.prodname_marketplace %} app's landing page. You can customize the name of your pricing plan to align to the plan's resources, the size of the company that will use the plan, or anything you'd like. You can save pricing plans in a draft or published state. If you haven't submitted your {% data variables.product.prodname_marketplace %} listing for approval, a published plan will function in the same way as a draft plan until your listing is approved and shown on {% data variables.product.prodname_marketplace %}. Draft plans allow you to create and save new pricing plans without making them available on your {% data variables.product.prodname_marketplace %} listing page. Once you publish a pricing plan on a published listing, it's available for customers to purchase immediately. You can publish up to 10 pricing plans. #### Pricing models For guidelines on billing customers, see "[Billing customers](/developers/github-marketplace/billing-customers)." ##### Free plans {% data reusables.marketplace.free-apps-encouraged %} A free plan still requires you to handle [new purchase](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/) and [cancellation](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/) billing flows. See "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)" for more details. ##### Flat-rate plans ### Creating pricing plans Flat-rate pricing plans allow you to offer your service to customers for a flat-rate fee. {% data reusables.marketplace.marketplace-pricing-free-trials %} To create a pricing plan for your {% data variables.product.prodname_marketplace %} listing, click **Plans and pricing** in the left sidebar of your [{% data variables.product.prodname_marketplace %} listing page](https://github.com/marketplace/manage). For more information, see "[Creating a draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/)." You must set a price for both monthly and yearly subscriptions in U.S. Dollars for flat-rate plans. When you click **New draft plan**, you'll see a form that allows you to customize your pricing plan. You'll need to configure the following fields to create a pricing plan: ##### Per-unit plans - **Plan name** - Your pricing plan's name will appear on your {% data variables.product.prodname_marketplace %} app's landing page. You can customize the name of your pricing plan to align with the plan's resources, the size of the company that will use the plan, or anything you'd like. Per-unit pricing allows you to offer your app in units. For example, a unit can be a person, seat, or user. You'll need to provide a name for the unit and set a price for both monthly and yearly subscriptions, in U.S. Dollars. - **Pricing models** - There are three types of pricing plan: free, flat-rate, and per-unit. All plans require you to process new purchase and cancellation events from the marketplace API. In addition, for paid plans: #### Available for - You must set a price for both monthly and yearly subscriptions in US dollars. - Your app must process plan change events. - You must request verification to publish a listing with a paid plan. - {% data reusables.marketplace.marketplace-pricing-free-trials %} {% data variables.product.prodname_marketplace %} pricing plans can apply to **Personal and organization accounts**, **Personal accounts only**, or **Organization accounts only**. For example, if your pricing plan is per-unit and provides multiple seats, you would select **Organization accounts only** because there is no way to assign seats to people in an organization from a personal account. For detailed information, see "[Pricing plans for {% data variables.product.prodname_marketplace %} apps](/developers/github-marketplace/pricing-plans-for-github-marketplace-apps)" and "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." #### Short description - **Available for** - {% data variables.product.prodname_marketplace %} pricing plans can apply to **Personal and organization accounts**, **Personal accounts only**, or **Organization accounts only**. For example, if your pricing plan is per-unit and provides multiple seats, you would select **Organization accounts only** because there is no way to assign seats to people in an organization from a personal account. Write a brief summary of the details of the pricing plan. The description might include the type of customer the plan is intended for or the resources the plan includes. - **Short description** - Write a brief summary of the details of the pricing plan. The description might include the type of customer the plan is intended for or the resources the plan includes. #### Bullets - **Bullets** - You can write up to four bullets that include more details about your pricing plan. The bullets might include the use cases of your app or list more detailed information about the resources or features included in the plan. You can write up to four bullets that include more details about your pricing plan. The bullets might include the use cases of your app or list more detailed information about the resources or features included in the plan. {% data reusables.marketplace.free-plan-note %} ### Changing a {% data variables.product.prodname_marketplace %} listing's pricing plan If a pricing plan for your {% data variables.product.prodname_marketplace %} plan is no longer needed or if you need to adjust pricing details, you can remove it. If a pricing plan for your {% data variables.product.prodname_marketplace %} listing is no longer needed, or if you need to adjust pricing details, you can remove it.  Once you publish a pricing plan for an app already listed in the {% data variables.product.prodname_marketplace %}, you can't make changes to the plan. Instead, you'll need to remove the pricing plan. Customers who already purchased the removed pricing plan will continue to use it until they opt out and move onto a new pricing plan. For more on pricing plans, see "[{% data variables.product.prodname_marketplace %} pricing plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." Once you publish a pricing plan for an app that is already listed in {% data variables.product.prodname_marketplace %}, you can't make changes to the plan. Instead, you'll need to remove the pricing plan and create a new plan. Customers who already purchased the removed pricing plan will continue to use it until they opt out and move onto a new pricing plan. For more on pricing plans, see "[{% data variables.product.prodname_marketplace %} pricing plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." Once you remove a pricing plan, users won't be able to purchase your app using that plan. Existing users on the removed pricing plan will continue to stay on the plan until they cancel their plan subscription. 37 content/developers/github-marketplace/submitting-your-listing-for-publication.md @@ -0,0 +1,37 @@ --- title: Submitting your listing for publication intro: 'You can submit your listing for the {% data variables.product.prodname_dotcom %} community to use.' redirect_from: - /marketplace/listing-on-github-marketplace/submitting-your-listing-for-review - /developers/github-marketplace/submitting-your-listing-for-review versions: free-pro-team: '*' --- Once you've completed the listing for your app, you'll see two buttons that allow you to request publication of the listing with or without verification. The **Request** button for "Publish without verification" is disabled if you have published any paid pricing plans in the listing.  {% data reusables.marketplace.launch-with-free %} After you submit your listing for review, an onboarding expert will reach out to you with additional information. For an overview of the process for creating and submitting a listing, see "[About {% data variables.product.prodname_marketplace %}](/developers/github-marketplace/about-github-marketplace#publishing-an-app-to-github-marketplace)." ### Prerequisites for publishing with verification Before you request verification of your listing, you'll need to integrate the {% data variables.product.prodname_marketplace %} billing flows and webhook into your app. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If you've met the requirements for listing and you've integrated with the {% data variables.product.prodname_marketplace %} API, go ahead and submit your listing. For more information, see "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app)." {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Transferring an app to an organization before you submit](#transferring-an-app-to-an-organization-before-you-submit)" below. ### Transferring an app to an organization before you submit You cannot sell an app that's owned by a user account. You need to transfer the app to an organization that is already a verified creator, or that can request verification for a listing for the app. For details, see: 1. "[Creating an organization from scratch](/github/setting-up-and-managing-organizations-and-teams/creating-a-new-organization-from-scratch)" 1. "[Transferring ownership of a GitHub App](/developers/apps/transferring-ownership-of-a-github-app)" or "[Transferring ownership of an OAuth App](/developers/apps/transferring-ownership-of-an-oauth-app)" 22 content/developers/github-marketplace/submitting-your-listing-for-review.md This file was deleted. 4 content/developers/github-marketplace/testing-your-app.md @@ -1,6 +1,6 @@ --- title: Testing your app intro: 'GitHub recommends testing your app with APIs and webhooks before submitting your listing to {% data variables.product.prodname_marketplace %} so you can provide an ideal experience for customers. Before the {% data variables.product.prodname_marketplace %} onboarding team approves your app, it must adequately handle the [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows).' intro: 'GitHub recommends testing your app with APIs and webhooks before submitting your listing to {% data variables.product.prodname_marketplace %} so you can provide an ideal experience for customers. Before an onboarding expert approves your app, it must adequately handle the billing flows.' redirect_from: - /apps/marketplace/testing-apps-apis-and-webhooks/ - /apps/marketplace/integrating-with-the-github-marketplace-api/testing-github-marketplace-apps/ @@ -13,7 +13,7 @@ versions: ### Testing apps You can use a [draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/) to simulate each of the [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows). A listing in the draft state means that it has not been submitted for approval. Any purchases you make using a draft {% data variables.product.prodname_marketplace %} listing will _not_ create real transactions, and GitHub will not charge your credit card. You can use a draft {% data variables.product.prodname_marketplace %} listing to simulate each of the billing flows. A listing in the draft state means that it has not been submitted for approval. Any purchases you make using a draft {% data variables.product.prodname_marketplace %} listing will _not_ create real transactions, and GitHub will not charge your credit card. For more information, see "[Drafting a listing for your app](/developers/github-marketplace/drafting-a-listing-for-your-app)" and "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." #### Using a development app with a draft listing to test changes 2 .../developers/github-marketplace/webhook-events-for-the-github-marketplace-api.md @@ -1,6 +1,6 @@ --- title: Webhook events for the GitHub Marketplace API intro: 'A {% data variables.product.prodname_marketplace %} app receives information about changes to a user''s plan from the Marketplace purchase event webhook. A Marketplace purchase event is triggered when a user purchases, cancels, or changes their payment plan. For details on how to respond to each of these types of events, see "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)."' intro: 'A {% data variables.product.prodname_marketplace %} app receives information about changes to a user''s plan from the Marketplace purchase event webhook. A Marketplace purchase event is triggered when a user purchases, cancels, or changes their payment plan.' redirect_from: - /apps/marketplace/setting-up-github-marketplace-webhooks/about-webhook-payloads-for-a-github-marketplace-listing/ - /apps/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/ 4 content/developers/webhooks-and-events/webhook-events-and-payloads.md @@ -445,7 +445,7 @@ Key | Type | Description #### Webhook payload object {% data reusables.webhooks.installation_properties %} {% data reusables.webhooks.app_desc %} {% data reusables.webhooks.app_always_desc %} {% data reusables.webhooks.sender_desc %} #### Webhook payload example @@ -469,7 +469,7 @@ Key | Type | Description #### Webhook payload object {% data reusables.webhooks.installation_repositories_properties %} {% data reusables.webhooks.app_desc %} {% data reusables.webhooks.app_always_desc %} {% data reusables.webhooks.sender_desc %} #### Webhook payload example 54 ...ssions/collaborating-with-your-community-using-discussions/about-discussions.md @@ -0,0 +1,54 @@ --- title: About discussions intro: Use discussions to ask and answer questions, share information, make announcements, and conduct or participate in a conversation about a project on {% data variables.product.product_name %}. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About discussions With {% data variables.product.prodname_discussions %}, the community for your project can create and participate in conversations within the project's repository. Discussions empower a project's maintainers, contributors, and visitors to gather and accomplish the following goals in a central location, without third-party tools. - Share announcements and information, gather feedback, plan, and make decisions - Ask questions, discuss and answer the questions, and mark the discussions as answered - Foster an inviting atmosphere for visitors and contributors to discuss goals, development, administration, and workflows  You don't need to close a discussion like you close an issue or a pull request. If a repository administrator or project maintainer enables discussions for a repository, anyone who visits the repository can create and participate in discussions for the repository. Repository administrators and project maintainers can manage discussions and discussion categories in a repository, and pin discussions to increase the visibility of the discussion. Moderators and collaborators can mark comments as answers, lock discussions, and convert issues to discussions. For more information, see "[Repository permission levels for an organization](/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization)." For more information about management of discussions for your repository, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." ### About categories and formats for discussions {% data reusables.discussions.you-can-categorize-discussions %} {% data reusables.discussions.about-categories-and-formats %} {% data reusables.discussions.repository-category-limit %} For discussions with a question/answer format, an individual comment within the discussion can be marked as the discussion's answer. {% data reusables.discussions.github-recognizes-members %} For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)." ### Best practices for discussions As a community member or maintainer, start a discussion to ask a question or discuss information that affects the community. For more information, see "[Collaborating with maintainers using discussions](/discussions/collaborating-with-your-community-using-discussions/collaborating-with-maintainers-using-discussions)." Participate in a discussion to ask and answer questions, provide feedback, and engage with the project's community. For more information, see "[Participating in a discussion](/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion)." You can spotlight discussions that contain important, useful, or exemplary conversations among members in the community. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#pinning-a-discussion)." {% data reusables.discussions.you-can-convert-an-issue %} For more information, see "[Moderating discussions in your repository](/discussions/managing-discussions-for-your-community/moderating-discussions#converting-an-issue-to-a-discussion)." ### Sharing feedback You can share your feedback about {% data variables.product.prodname_discussions %} with {% data variables.product.company_short %}. To join the conversation, see [`github/feedback`](https://github.com/github/feedback/discussions?discussions_q=category%3A%22Discussions+Feedback%22). ### Further reading - "[About writing and formatting on {% data variables.product.prodname_dotcom %}](/github/writing-on-github/about-writing-and-formatting-on-github)" - "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)" - "[About notifications](/github/managing-subscriptions-and-notifications-on-github/about-notifications)" - "[Moderating comments and conversations](/github/building-a-strong-community/moderating-comments-and-conversations)" - "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)" 50 ...community-using-discussions/collaborating-with-maintainers-using-discussions.md @@ -0,0 +1,50 @@ --- title: Collaborating with maintainers using discussions shortTitle: Collaborating with maintainers intro: You can contribute to the goals, plans, health, and community for a project on {% data variables.product.product_name %} by communicating with the maintainers of the project in a discussion. permissions: People with read permissions to a repository can start and participate in discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About collaboration with maintainers using discussions {% data reusables.discussions.about-discussions %} If you use or contribute to a project, you can start a discussion to make suggestions and engage with maintainers and community members about your plans, questions, ideas, and feedback. For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." {% data reusables.discussions.about-categories-and-formats %} Repository administrators and project maintainers can delete a discussion. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#deleting-a-discussion)." {% data reusables.discussions.github-recognizes-members %} These members appear in a list of the most helpful contributors to the project's discussions. As your project grows, you can grant higher access permissions to active members of your community. For more information, see "[Granting higher permissions to top contributors](/discussions/guides/granting-higher-permissions-to-top-contributors)"  For more information about participation in discussions, see "[Participating in a discussion](/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion)." ### Prerequisites To collaborate with maintainers using discussions, a repository administrator or project maintainer must enable discussions for the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Starting a discussion {% data reusables.discussions.starting-a-discussion %} ### Filtering the list of discussions You can search for discussions and filter the list of discussions in a repository. For more information, see "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. In the **Search all discussions** field, type a search query. Optionally, to the right of the search field, click a button to further filter the results.  1. In the list of discussions, click the discussion you want to view.  ### Converting an issue to a discussion {% data reusables.discussions.you-can-convert-an-issue %} For more information, see "[Moderating discussions in your repository](/discussions/managing-discussions-for-your-community/moderating-discussions#converting-an-issue-to-a-discussion#converting-an-issue-to-a-discussion)." ### Further reading - "[About writing and formatting on {% data variables.product.prodname_dotcom %}](/github/writing-on-github/about-writing-and-formatting-on-github)" - "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)" 14 content/discussions/collaborating-with-your-community-using-discussions/index.md @@ -0,0 +1,14 @@ --- title: Collaborating with your community using discussions shortTitle: Collaborating using discussions intro: Gather and discuss your project with community members and other maintainers. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} {% link_in_list /about-discussions %} {% link_in_list /participating-in-a-discussion %} {% link_in_list /collaborating-with-maintainers-using-discussions %} 31 ...borating-with-your-community-using-discussions/participating-in-a-discussion.md @@ -0,0 +1,31 @@ --- title: Participating in a discussion intro: You can converse with the community and maintainers in a forum within the repository for a project on {% data variables.product.product_name %}. permissions: People with read permissions to a repository can participate in discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About participation in a discussion {% data reusables.discussions.about-discussions %} For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." In addition to starting or viewing a discussion, you can comment in response to the original comment from the author of the discussion. You can also create a comment thread by replying to an individual comment that another community member made within the discussion, and react to comments with emoji. For more information about reactions, see "[About conversations on {% data variables.product.prodname_dotcom %}](/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github#reacting-to-ideas-in-comments)." You can block users and report disruptive content to maintain a safe and pleasant environment for yourself on {% data variables.product.product_name %}. For more information, see "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)." ### Prerequisites Discussions must be enabled for the repository for you to participate in a discussion in the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Creating a discussion {% data reusables.discussions.starting-a-discussion %} ### Marking a comment as an answer Discussion authors and users with the triage role or greater for a repository can mark a comment as the answer to a discussion in the repository. {% data reusables.discussions.marking-a-comment-as-an-answer %} 49 content/discussions/guides/best-practices-for-community-conversations-on-github.md @@ -0,0 +1,49 @@ --- title: Best practices for community conversations on GitHub shortTitle: Best practices for community conversations intro: 'You can use discussions to brainstorm with your team, and eventually move the conversation to a discussion when you are ready to scope out the work.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Community conversations in {% data variables.product.prodname_discussions %} Since {% data variables.product.prodname_discussions %} is an open forum, there is an opportunity to bring non-code collaboration into a project's repository and gather diverse feedback and ideas more quickly. You can help drive a productive conversation by: - Asking pointed questions and follow-up questions to garner specific feedback - Capture a diverse experience and distill it down to main points - Open an issue to take action based on the conversation, where applicable For more information about opening an issue and cross-referencing a discussion, see "[Opening an issue from a comment](/github/managing-your-work-on-github/opening-an-issue-from-a-comment)." ### Learning about conversations on GitHub You can create and participate in discussions, issues, and pull requests, depending on the type of conversation you'd like to have. You can use {% data variables.product.prodname_discussions %} to discuss big picture ideas, brainstorm, and spike out a project's specific details before committing it to an issue, which can then be scoped. Discussions are useful for teams if: - You are in the discovery phase of a project and are still learning which director your team wants to go in - You want to collect feedback from a wider community about a project - You want to keep bug fixes, feature requests, and general conversations separate Issues are useful for discussing specific details of a project such as bug reports and planned improvements. For more information, see "[About issues](/articles/about-issues)." Pull requests allow you to comment directly on proposed changes. For more information, see "[About pull requests](/articles/about-pull-requests)" and "[Commenting on a pull request](/articles/commenting-on-a-pull-request)." {% data reusables.organizations.team-discussions-purpose %} For more information, see "[About team discussions](/articles/about-team-discussions)." ### Following contributing guidelines Before you open a discussion, check to see if the repository has contributing guidelines. The CONTRIBUTING file includes information about how the repository maintainer would like you to contribute ideas to the project. For more information, see "[Setting up your project for healthy contributions](/github/building-a-strong-community/setting-up-your-project-for-healthy-contributions)." ### Next steps To continue learning about {% data variables.product.prodname_discussions %} and quickly create a discussion for your community, see "[Quickstart for {% data variables.product.prodname_discussions %}](/discussions/quickstart)." ### Further reading - "[Setting up your project for healthy contributions](/articles/setting-up-your-project-for-healthy-contributions)" - "[Using templates to encourage useful issues and pull requests](/github/building-a-strong-community/using-templates-to-encourage-useful-issues-and-pull-requests)" - "[Moderating comments and conversations](/articles/moderating-comments-and-conversations)" - "[Writing on {% data variables.product.prodname_dotcom %}](/articles/writing-on-github)" 21 content/discussions/guides/finding-discussions-across-multiple-repositories.md @@ -0,0 +1,21 @@ --- title: Finding discussions across multiple repositories intro: 'You can easily access every discussion you''ve created or participated in across multiple repositories.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Finding discussions 1. Navigate to {% data variables.product.prodname_dotcom_the_website %}. 1. In the top-right corner of {% data variables.product.prodname_dotcom_the_website %}, click your profile photo, then click **Your enterprises**.  1. Toggle between **Created** and **Commented** to see the discussions you've created or participated in. ### Further reading - "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)" - "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)" - "[Managing discussions for your community](/discussions/managing-discussions-for-your-community)" 32 content/discussions/guides/granting-higher-permissions-to-top-contributors.md @@ -0,0 +1,32 @@ --- title: Granting higher permissions to top contributors intro: 'Repository administrators can promote any community member to a moderator and maintainer.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Introduction The most helpful contributors for the past 30 days are highlighted on the {% data variables.product.prodname_discussions %} dashboard, based on how many comments were marked as answers by other community members. Helpful contributors can help drive a healthy community and moderate and guide the community space in addition to maintainers. ### Step 1: Audit your discussions top contributors {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. Compare the list of contributors with their access permissions to see who qualifies to moderate the discussion. ### Step 2: Review permission levels for discussions People with triage permissions for a repository can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. For more information, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." For more information about repository permission levels and {% data variables.product.prodname_discussions %}, see "[Repository permissions levels for an organization](/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization)." ### Step 3: Change permissions levels for top contributors You can change a contributor's permission levels to give them more access to the tooling they need to moderate GitHub Discussions. To change a person's or team's permission levels, see "[Managing teams and people with access to your repository](/github/administering-a-repository/managing-teams-and-people-with-access-to-your-repository)." ### Step 4: Notify community members of elevated access When you change a collaborators permission level, they will receive a notification for the change. 29 content/discussions/guides/index.md @@ -0,0 +1,29 @@ --- title: Discussions guides shortTitle: Guides intro: 'Discover pathways to get started or learn best practices for participating or monitoring your community''s discussions.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Getting started with discussions {% link_in_list /about-discussions %} {% link_in_list /best-practices-for-community-conversations-on-github %} {% link_in_list /finding-discussions-across-multiple-repositories %} <!-- {% link_in_list /managing-notifications-for-discussions %} --> ### Administering discussions {% link_in_list /granting-higher-permissions-to-top-contributors %} <!--<!-- Commenting out what is only nice to have for discussions release {% link_in_list /updating-your-contributing-guidelines-with-discussions %} --> <!-- ### Discussions and open source projects {% link_in_list /collaborating-on-open-source-projects-in-discussions %} {% link_in_list /welcoming-contributions-to-your-communitys-discussions %} --> 55 content/discussions/index.md @@ -0,0 +1,55 @@ --- title: GitHub Discussions Documentation beta_product: true shortTitle: GitHub Discussions intro: '{% data variables.product.prodname_discussions %} is a collaborative communication forum for the community around an open source project. Community members can ask and answer questions, share updates, have open-ended conversations, and follow along on decisions affecting the community''s way of working.' introLinks: quickstart: /discussions/quickstart featuredLinks: guides: - /discussions/collaborating-with-your-community-using-discussions/about-discussions - /discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion - /discussions/managing-discussions-for-your-community/moderating-discussions gettingStarted: - /discussions/quickstart guideCards: - /discussions/collaborating-with-your-community-using-discussions/about-discussions - /discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion - /discussions/managing-discussions-for-your-community/moderating-discussions popular: - /discussions/guides/granting-higher-permissions-to-top-contributors - /discussions/guides/best-practices-for-community-conversations-on-github - /discussions/guides/finding-discussions-across-multiple-repositories - /discussions/collaborating-with-your-community-using-discussions/collaborating-with-maintainers-using-discussions - /discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository product_video: https://www.youtube-nocookie.com/embed/DbTWBP3_RbM layout: product-landing versions: free-pro-team: '*' --- <!-- {% link_with_intro /quickstart %} --> <!-- {% link_with_intro /discussions-guides %} --> <!-- {% link_with_intro /collaborating-with-your-community-using-discussions %} --> <!-- {% link_with_intro /managing-discussions-for-your-community %} --> <!-- Community examples --> {% assign discussionsCommunityExamples = site.data.variables.discussions_community_examples %} {% if discussionsCommunityExamples %} <div class="my-6 pt-6"> <h2 class="mb-2 font-mktg h1">Communities using discussions</h2> <div class="d-flex flex-wrap gutter"> {% render 'discussions-community-card' for discussionsCommunityExamples as example %} </div> {% if discussionsCommunityExamples.length > 6 %} <button class="js-filter-card-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> {% endif %} <div class="js-filter-card-no-results d-none py-4 text-center text-gray font-mktg"> <div class="mb-3">{% octicon "search" width="24" %}</div> <h3 class="text-normal">Sorry, there is no result for <strong class="js-filter-card-value"></strong></h3> <p class="my-3 f4">It looks like we don't have an example that fits your filter.<br>Try another filter or add your code example</p> <a href="https://github.com/github/docs/blob/main/data/variables/discussions_community_examples.yml">Add your community {% octicon "arrow-right" %}</a> </div> </div> {% endif %} 13 content/discussions/managing-discussions-for-your-community/index.md @@ -0,0 +1,13 @@ --- title: Managing discussions for your community shortTitle: Managing discussions intro: 'You can enable and configure discussions for your repository, and you can use tools on {% data variables.product.product_name %} to moderate conversations among community members.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} {% link_in_list /managing-discussions-in-your-repository %} {% link_in_list /managing-categories-for-discussions-in-your-repository %} {% link_in_list /moderating-discussions %} 64 ...ns-for-your-community/managing-categories-for-discussions-in-your-repository.md @@ -0,0 +1,64 @@ --- title: Managing categories for discussions in your repository intro: You can categorize the discussions in your repository to organize conversations for your community members, and you can choose a format for each category. permissions: Repository administrators and people with write or greater access to a repository can enable discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About categories for discussions {% data reusables.discussions.about-discussions %} {% data reusables.discussions.about-categories-and-formats %} Each category must have a unique name and emoji pairing, and can be accompanied by a detailed description stating its purpose. Categories help maintainers organize how conversations are filed and are customizable to help distinguish categories that are Q&A or more open-ended conversations.{% data reusables.discussions.repository-category-limit %} For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions#about-categories-and-formats-for-discussions)." ### Default categories | Category | Purpose | Type | | :- | :- | :- | | #️⃣ General | Anything and everything relevant to the project | Open-ended discussion | |💡Ideas | Ideas to change or improve the project | Open-ended discussion | | 🙏 Q&A | Questions for the community to answer, with a question/answer format | Question and Answer | | 🙌 Show and tell | Creations, experiments, or tests relevant to the project | Open-ended discussion | ### Creating a category {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.edit-categories %} 1. Click **New category**.  1. Edit the emoji, title, description, and discussion format for the category. For more information about discussion formats, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions#about-categories-and-formats-for-discussions)."  1. Click **Create**.  ### Editing a category You can edit a category to change the category's emoji, title, description, and discussion format. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. To the right of a category in the list, click {% octicon "pencil" aria-label="The pencil icon" %}.  1. {% data reusables.discussions.edit-category-details %}  1. Click **Save changes**.  ### Deleting a category When you delete a category, {% data variables.product.product_name %} will move all discussions in the deleted category to an existing category that you choose. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. To the right of a category in the list, click {% octicon "trash" aria-label="The trash icon" %}.  1. Use the drop-down menu, and choose a new category for any discussions in the category you're deleting.  1. Click **Delete & Move**.  108 ...aging-discussions-for-your-community/managing-discussions-in-your-repository.md @@ -0,0 +1,108 @@ --- title: Managing discussions in your repository intro: You can categorize, spotlight, transfer, or delete the discussions in a repository. permissions: Repository administrators and people with write or greater access to a repository can manage discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About management of discussions {% data reusables.discussions.about-discussions %} For more information about discussions, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." Organization owners can choose the permissions required to create a discussion for repositories owned by the organization. For more information, see "[Managing discussion creation for repositories in your organization](/github/setting-up-and-managing-organizations-and-teams/managing-discussion-creation-for-repositories-in-your-organization)." As a discussions maintainer, you can create community resources to encourage discussions that are aligned with the overall project goal and maintain a friendly open forum for collaborators. Creating a code of conduct or contribution guidelines for collaborators to follow will help facilitate a collaborative and productive forum. For more information on creating community resources, see "[Adding a code of conduct to your project](/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project)," and "[Setting guidelines for repository contributors](/github/building-a-strong-community/setting-guidelines-for-repository-contributors)." For more information on facilitating a healthy discussion, see "[Moderating comments and conversations](/github/building-a-strong-community/moderating-comments-and-conversations)." ### Prerequisites To manage discussions in a repository, discussions must be enabled for the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Changing the category for a discussion You can categorize discussions to help community members find related discussions. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)" article. You can also move a discussion to a different category. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pencil" aria-label="The pencil icon" %} **Edit pinned discussion**.  ### Pinning a discussion You can pin up to four important discussions above the list of discussions for the repository. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pin" aria-label="The pin icon" %} **Pin discussion**.  1. Optionally, customize the look of the pinned discussion.  1. Click **Pin discussion**.  ### Editing a pinned discussion Editing a pinned discussion will not change the discussion's category. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pencil" aria-label="The pencil icon" %} **Edit pinned discussion**.  1. Customize the look of the pinned discussion.  1. Click **Pin discussion**.  ### Unpinning a discussion {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pin" aria-label="The pin icon" %} **Unpin discussion**.  1. Read the warning, then click **Unpin discussion**.  ### Transferring a discussion To transfer a discussion, you must have permissions to create discussions in the repository where you want to transfer the discussion. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "arrow-right" aria-label="The right arrow icon" %} **Transfer discussion**.  1. Select the **Choose a repository** drop-down, and click the repository you want to transfer the discussion to.  1. Click **Transfer discussion**.  ### Deleting a discussion {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "trash" aria-label="The trash arrow icon" %} **Delete discussion**.  1. Read the warning, then click **Delete this discussion**.  ### Converting issues based on labels You can convert all issues with the same label to discussions in bulk. Future issues with this label will also automatically convert to the discussion and category you configure. {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.sidebar-issues %} {% data reusables.project-management.labels %} 1. Next to the label you want to convert to issues, click **Convert issues**. 1. Select the **Choose a category** drop-down menu, and click a category for your discussion. 1. Click **I understand, convert this issue to a discussion**. 40 ...t/discussions/managing-discussions-for-your-community/moderating-discussions.md @@ -0,0 +1,40 @@ --- title: Moderating discussions intro: 'You can promote healthy collaboration by marking comments as answers, locking or unlocking discussions, and converting issues to discussions. and editing or deleting comments, discussions, and categories that don''t align with your community''s code of conduct to discussions.' permissions: People with triage access to a repository can moderate discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About moderating discussions {% data reusables.discussions.about-discussions %} If you have triage permissions for a repository, you can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. ### Marking a comment as an answer {% data reusables.discussions.marking-a-comment-as-an-answer %} ### Locking discussions It's appropriate to lock a conversation when the entire conversation is not constructive or violates your community's code of conduct or {% data variables.product.prodname_dotcom %}'s [Community Guidelines](/github/site-policy/github-community-guidelines). You can also lock a conversation to prevent comments on a discussion you want to use as an announcement to the community. When you lock a conversation, people with write access to the repository will still be able to comment on the discussion. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. In the list of discussions, click the discussion you want to lock.  1. In the right margin of a discussion, click **Lock conversation**. 1. Read the information about locking conversations and click **Lock conversation on this discussion**. 1. When you're ready to unlock the conversation, click **Unlock conversation**, then click **Unlock conversation on this discussion**. ### Converting an issue to a discussion When you convert an issue to a discussion, the discussion is automatically created using the content from the issue. People with write access to a repository can bulk convert issues based on labels. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.sidebar-issues %} 1. In the list of issues, click the issue you'd like to convert. 1. In the right margin of an issue, click **Convert to discussion**. 1. Select the **Choose a category** drop-down menu, and click a category for your discussion. 1. Click **I understand, convert this issue to a discussion**. 62 content/discussions/quickstart.md @@ -0,0 +1,62 @@ --- title: Quickstart for GitHub Discussions intro: 'Enable {% data variables.product.prodname_discussions %} on an existing repository and start conversations with your community.' allowTitleToDifferFromFilename: true versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Introduction {% data variables.product.prodname_discussions %} is a collaborative communication forum for the community around an open source project. Discussions are for conversations that need to be transparent and accessible but do not need to be tracked on a project board and are not related to code, unlike issues. Discussions enable fluid, open conversation in a public forum. Discussions give a space for more collaborative conversations by connecting and giving a more centralized area to connect and find information. ### Enabling {% data variables.product.prodname_discussions %} on your repository Repository owners and people with write access can enable {% data variables.product.prodname_discussions %} for a community on their public repositories. When you first enable a {% data variables.product.prodname_discussions %}, you will be invited to configure a welcome post. {% data reusables.repositories.navigate-to-repo %} 1. Under your repository name, click {% octicon "gear" aria-label="The gear icon" %} **Settings**.  1. Under "Features", click **Set up discussions**.  1. Under "Start a new discussion," edit the template to align with the resources and tone you want to set for your community. 1. Click **Start discussion**.  ### Welcoming contributions to your discussions You can welcome your community and introduce a new way to communicate in a repository by creating a welcome post and pin the post to your {% data variables.product.prodname_discussions %} page. Pinning and locking discussions helps people know that a post is meant as an announcement. You can use announcements as a way to link people to more resources and offer guidance for opening discussions in your community. For more information about pinning a discussion, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#pinning-a-discussion)." ### Setting up community guidelines for contributors You can set contributing guidelines to encourage collaborators to have meaningful, useful conversations that are relevant to the repository. You can also update the repository's README to communicate expectations on when collaborators should open an issue or discussion. For more information about providing guidelines for your project, see "[Adding a code of conduct to your project](/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project)" and "[Setting up your project for healthy contributions](/github/building-a-strong-community/setting-up-your-project-for-healthy-contributions)." ### Creating a new discussion Anyone with access to a repository can create a discussion. {% data reusables.discussions.starting-a-discussion %} ### Organizing discussions into relevant categories Repository owners and people with write access can create new categories to keep discussions organized. Collaborators participating and creating new discussions can group discussions into the most relevant existing categories. Discussions can also be recategorized after they are created. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)" ### Promoting healthy conversations People with write permissions for a repository can help surface important conversations by pinning discussions, deleting discussions that are no longer useful or are damaging to the community, and transferring discussions to more relevant repositories owned by the organization. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." People with triage permissions for a repository can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. For more information, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." ### Next steps Once there is a clear path to scope work out and move an idea from concept to reality, you can create an issue and start tracking your progress. For more information on creating an issue from a discussion, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." 45 content/education/guides.md @@ -0,0 +1,45 @@ --- title: Guides for GitHub Education intro: 'These guides for {% data variables.product.prodname_education %} help you teach and learn both {% data variables.product.product_name %} and software development.' allowTitleToDifferFromFilename: true versions: free-pro-team: '*' --- ### Get started with {% data variables.product.product_name %} Teachers, students, and researchers can use tools from {% data variables.product.product_name %} to enrich a software development curriculum and develop real-world collaboration skills. - [Sign up for a new {% data variables.product.prodname_dotcom %} account](/github/getting-started-with-github/signing-up-for-a-new-github-account) - [Git and {% data variables.product.prodname_dotcom %} quickstart ](/github/getting-started-with-github/quickstart) - [Apply for an educator or researcher discount](/education/teach-and-learn-with-github-education/apply-for-an-educator-or-researcher-discount) - [Apply for a student developer pack](/education/teach-and-learn-with-github-education/apply-for-a-student-developer-pack) ### Run a software development course with {% data variables.product.company_short %} Administer a classroom, assign and review work from your students, and teach the new generation of software developers with {% data variables.product.prodname_classroom %}. - [Basics of setting up {% data variables.product.prodname_classroom %} ](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom) - [Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms) - [Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment) - [Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment) - [Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository) - [Leave feedback with pull requests](/education/manage-coursework-with-github-classroom/leave-feedback-with-pull-requests) - [Use autograding](/education/manage-coursework-with-github-classroom/use-autograding) ### Learn to develop software Incorporate {% data variables.product.prodname_dotcom %} into your education, and use the same tools as the professionals. - [Git and {% data variables.product.prodname_dotcom %} learning resources](/github/getting-started-with-github/git-and-github-learning-resources) - [Use {% data variables.product.prodname_dotcom %} for your schoolwork](/education/teach-and-learn-with-github-education/use-github-for-your-schoolwork) - [Try {% data variables.product.prodname_desktop %}](/desktop) - [Try {% data variables.product.prodname_cli %}](/github/getting-started-with-github/github-cli) ### Contribute to the community Participate in the community, get training from {% data variables.product.company_short %}, and learn or teach new skills. - [{% data variables.product.prodname_education_community %}](https://education.github.community) - [About Campus Experts](/education/teach-and-learn-with-github-education/about-campus-experts) - [About Campus Advisors](/education/teach-and-learn-with-github-education/about-campus-advisors) 43 content/education/index.md @@ -0,0 +1,43 @@ --- title: GitHub Education Documentation shortTitle: Education intro: "{% data variables.product.prodname_education %} helps you teach or learn software development with the tools and support of {% data variables.product.company_short %}'s platform and community." introLinks: quickstart: /education/quickstart featuredLinks: guides: - /education/teach-and-learn-with-github-education/apply-for-a-student-developer-pack - /education/teach-and-learn-with-github-education/apply-for-an-educator-or-researcher-discount - /education/teach-and-learn-with-github-education/use-github-at-your-educational-institution guideCards: - /github/getting-started-with-github/signing-up-for-a-new-github-account - /github/getting-started-with-github/git-and-github-learning-resources - /education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom popular: - /education/teach-and-learn-with-github-education/use-github-for-your-schoolwork - /education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research - /desktop - /github/getting-started-with-github/github-cli - /education/manage-coursework-with-github-classroom/teach-with-github-classroom changelog: - title: 'Try something new at Local Hack Day: Learn' date: '2020-10-15' href: https://github.blog/2020-10-15-try-something-new-at-local-hack-day-learn/ - title: 'Remote Education: Creating community through shared experiences' date: '2020-09-24' href: https://github.blog/2020-09-24-remote-education-creating-community-through-shared-experiences/ - title: 'Remote Education: A series of best practices for online campus communities' date: '2020-09-10' href: https://github.blog/2020-09-10-remote-education-a-series-of-best-practices-for-online-campus-communities/ - title: Welcome to the inaugural class of MLH Fellows date: '2020-06-24' href: https://github.blog/2020-06-24-welcome-to-the-inaugural-class-of-mlh-fellows/ layout: product-landing versions: free-pro-team: '*' --- <!-- {% link_with_intro /teach-and-learn-with-github-education %} --> <!-- {% link_with_intro /manage-coursework-with-github-classroom %} --> 31 ...work-with-github-classroom/about-using-makecode-arcade-with-github-classroom.md @@ -0,0 +1,31 @@ --- title: About using MakeCode Arcade with GitHub Classroom shortTitle: About using MakeCode Arcade intro: You can configure MakeCode Arcade as the online IDE for assignments in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/student-experience-makecode --- ### About MakeCode Arcade MakeCode Arcade is an online integrated development environment (IDE) for developing retro arcade games using drag-and-drop block programming and JavaScript. Students can write, edit, run, test, and debug code in a browser with MakeCode Arcade. For more information about online IDEs and {% data variables.product.prodname_classroom %}, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." {% data reusables.classroom.readme-contains-button-for-online-ide %} The first time the student clicks the button to visit MakeCode Arcade, the student must sign into MakeCode Arcade with {% data variables.product.product_name %} credentials. After signing in, the student will have access to a development environment containing the code from the assignment repository, fully configured on MakeCode Arcade. For more information about working on MakeCode Arcade, see the [MakeCode Arcade Tour](https://arcade.makecode.com/ide-tour) and [documentation](https://arcade.makecode.com/docs) on the MakeCode Arcade website. MakeCode Arcade does not support multiplayer-editing for group assignments. Instead, students can collaborate with Git and {% data variables.product.product_name %} features like branches and pull requests. ### About submission of assignments with MakeCode Arcade By default, MakeCode Arcade is configured to push to the assignment repository on {% data variables.product.product_location %}. After making progress on an assignment with MakeCode Arcade, students should push changes to {% data variables.product.product_location %} using the {% octicon "mark-github" aria-label="The GitHub mark" %}{% octicon "arrow-up" aria-label="The up arrow icon" %} button at the bottom of the screen.  ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 33 ...ge-coursework-with-github-classroom/about-using-replit-with-github-classroom.md @@ -0,0 +1,33 @@ --- title: About using Repl.it with GitHub Classroom shortTitle: About using Repl.it intro: You can configure Repl.it as the online integrated development environment (IDE) for assignments in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/student-experience-replit --- ### About Repl.it Repl.it is an online integrated development environment (IDE) that supports multiple programming languages. Students can write, edit, run, test, and debug code in a browser with Repl.it. For more information about online IDEs and {% data variables.product.prodname_classroom %}, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." {% data reusables.classroom.readme-contains-button-for-online-ide %} The first time the student clicks the button to visit Repl.it, the student must sign into Repl.it with {% data variables.product.product_name %} credentials. After signing in, the student will have access to a development environment containing the code from the assignment repository, fully configured on Repl.it. For more information about working on Repl.it, see the [Repl.it Quickstart Guide](https://docs.repl.it/misc/quick-start#the-repl-environment). For group assignments, students can use Repl.it Multiplayer to work collaboratively. For more information, see the [Repl.it Multiplayer](https://repl.it/site/multiplayer) website. ### About submission of assignments with Repl.it By default, Repl.it is configured to push to the assignment repository on {% data variables.product.product_location %}. After making progress on an assignment with Repl.it, students should push changes to {% data variables.product.product_location %} using the version control functionality in the left sidebar.  For more information about using Git on Repl.it, see the [Repl.it + Git Tutorial](https://repl.it/talk/learn/Replit-Git-Tutorial/23331) on the Repl.it website. ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 33 ...anage-coursework-with-github-classroom/basics-of-setting-up-github-classroom.md @@ -0,0 +1,33 @@ --- title: Basics of setting up GitHub Classroom shortTitle: '{% data variables.product.prodname_classroom %} basics' intro: Learn how to set up your classroom, manage assignments, and configure time-saving automation. versions: free-pro-team: '*' --- ### Videos about {% data variables.product.prodname_classroom %} You can watch a series of short video tutorials about the configuration and use of {% data variables.product.prodname_classroom %}. To watch all videos as part of a continuous playlist, see the [{% data variables.product.prodname_classroom %} Getting Started Guide](https://www.youtube.com/playlist?list=PLIRjfNq867bewk3ZGV6Z7a16YDNRCpK3u) on YouTube. For more information about terminology for {% data variables.product.prodname_classroom %}, see "[Glossary](/education/manage-coursework-with-github-classroom/glossary)". 1. <a href="https://youtu.be/xVVeqIDgCvM" target="_blank">Getting started</a> {% octicon "link-external" aria-label="The external link icon" %} 2. <a href="https://youtu.be/DTzrKduaHj8" target="_blank">Adding your student roster</a> {% octicon "link-external" aria-label="The external link icon" %} 3. Creating assignments - <a href="https://youtu.be/6QzKZ63KLss" target="_blank">Creating an assignment using a {% data variables.product.prodname_dotcom %} repository</a> {% octicon "link-external" aria-label="The external link icon" %} - <a href="https://youtu.be/Qmwh6ijsQJU" target="_blank">Creating an assignment using Microsoft MakeCode as your online IDE</a> {% octicon "link-external" aria-label="The external link icon" %} - <a href="https://youtu.be/p_g5sQ7hUis" target="_blank">Creating an assignment using Repl.it as your online IDE</a> {% octicon "link-external" aria-label="The external link icon" %} 4. <a href="https://youtu.be/ObaFRGp_Eko" target="_blank">How students complete assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 5. <a href="https://youtu.be/g45OJn3UyCU" target="_blank">How teachers review assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 6. <a href="https://youtu.be/QxrA3taZdNM" target="_blank">Creating group assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 7. <a href="https://youtu.be/tJK2cmoh1KM" target="_blank">Next steps to get started</a> {% octicon "link-external" aria-label="The external link icon" %} 8. <a href="https://youtu.be/X87v3SFQxLU" target="_blank">{% data variables.product.prodname_dotcom %} Teacher Toolbox</a> {% octicon "link-external" aria-label="The external link icon" %} ### Next steps For more information about teaching with {% data variables.product.prodname_classroom %}, see "[Teach with {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/teach-with-github-classroom)." ### Further reading - "[Teach and learn with {% data variables.product.prodname_education %}](/education/teach-and-learn-with-github-education)" 51 ...with-github-classroom/configure-default-settings-for-assignment-repositories.md @@ -0,0 +1,51 @@ --- title: Configure default settings for assignment repositories shortTitle: Configure defaults for assignment repositories intro: You can use the Probot Settings app to configure the default settings for repositories that {% data variables.product.prodname_classroom %} creates for an assignment. permissions: Organization owners can configure default settings for assignment repositories by installing a {% data variables.product.prodname_github_app %} for the organization. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/probot-settings --- ### About configuration of defaults for assignment repositories {% data variables.product.prodname_classroom %} creates a repository that belongs for each student or team that accepts an assignment. The repository belongs to the organization that you use for {% data variables.product.prodname_classroom %}. Assignment repositories can be empty, or you can use a template repository. For more information, see "[Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository)." {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} With the Probot Settings app, you can create a file named _.github/settings.yml_ in a repository that contains a list of settings for the repository, and then install a {% data variables.product.prodname_github_app %} for your organization that automatically applies the settings to the repository. You can include _.github/settings.yml_ in a template repository that you use for an assignment in {% data variables.product.prodname_classroom %}. When an individual or team accepts the assignment, {% data variables.product.prodname_classroom %} creates the assignment repository, and the Settings app automatically applies the settings from _.github/settings.yml_. Probot is a a project, framework, and collection of free apps to automate {% data variables.product.product_name %}. A Probot app can listen to repository events, like the creation of new commits, comments, and issues, and automatically respond to the event. For more information, see the [Probot website](https://probot.github.io) and the [Settings app website](https://probot.github.io/apps/settings/). For more information about {% data variables.product.prodname_github_apps %}, see "[About apps](/developers/apps/about-apps)." ### Adding the Settings app to your organization After you install the Probot Settings app for your organization, the app will apply the settings that you define in _.github/settings.yml_ for any repository in your organization, including new assignment repositories that {% data variables.product.prodname_classroom %} creates. 1. Navigate to the [Settings app page](https://github.com/apps/settings). 1. Click **Install**, then click the organization that you use for {% data variables.product.prodname_classroom %}. Provide the app full access to all repositories owned by the organization.  ### Configuring default settings for an assignment repository 1. Create a template repository that contains a _.github/settings.yml_ file. For a complete list of settings, see the [README](https://github.com/probot/settings#github-settings) for the `probot/settings` repository. For more information about using a template repository for starter code in {% data variables.product.prodname_classroom %}, see "[Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository)." {% warning %} **Warning:** Do not define `collaborators` in the _.github/settings.yml_ file for your template repository. {% data variables.product.prodname_classroom %} automatically grants teachers and teaching assistants access to assignment repositories. {% endwarning %} 1. Create an assignment using the template repository containing _.github/settings.yml_ as the starter code. {% data reusables.classroom.for-more-information-about-assignment-creation %} The Probot Settings app for your organization will now apply the settings you define in _.github/settings.yml_ within the template repository to every assignment repository that {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} creates for a student or team. ### Further reading - [Probot apps](https://probot.github.io/apps/) - [Probot documentation](https://probot.github.io/docs/) 142 ...th-github-classroom/connect-a-learning-management-system-to-github-classroom.md @@ -0,0 +1,142 @@ --- title: Connect a learning management system to GitHub Classroom intro: You can configure an LTI-compliant learning management system (LMS) to connect to {% data variables.product.prodname_classroom %} so that you can import a roster for your classroom. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/configuring-a-learning-management-system-for-github-classroom - /education/manage-coursework-with-github-classroom/connect-to-lms - /education/manage-coursework-with-github-classroom/generate-lms-credentials - /education/manage-coursework-with-github-classroom/setup-canvas - /education/manage-coursework-with-github-classroom/setup-generic-lms - /education/manage-coursework-with-github-classroom/setup-moodle --- ### About configuration of your LMS You can connect a learning management system (LMS) to {% data variables.product.prodname_classroom %}, and {% data variables.product.prodname_classroom %} can import a roster of student identifiers from the LMS. To connect your LMS to {% data variables.product.prodname_classroom %}, you must enter configuration credentials for {% data variables.product.prodname_classroom %} in your LMS. ### Prerequisites To configure an LMS to connect to {% data variables.product.prodname_classroom %}, you must first create a classroom. For more information, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-classroom)." ### Supported LMSes {% data variables.product.prodname_classroom %} supports import of roster data from LMSes that implement Learning Tools Interoperability (LTI) standards. - LTI version 1.0 and/or 1.1 - LTI Names and Roles Provisioning 1.X Using LTI helps keep your information safe and secure. LTI is an industry-standard protocol and GitHub Classroom's use of LTI is certified by the Instructional Management System (IMS) Global Learning Consortium. For more information, see [Learning Tools Interoperability](https://www.imsglobal.org/activity/learning-tools-interoperability) and [About IMS Global Learning Consortium](http://www.imsglobal.org/aboutims.html) on the IMS Global Learning Consortium website. {% data variables.product.company_short %} has tested import of roster data from the following LMSes into {% data variables.product.prodname_classroom %}. - Canvas - Google Classroom - Moodle - Sakai Currently, {% data variables.product.prodname_classroom %} doesn't support import of roster data from Blackboard or Brightspace ### Generating configuration credentials for your classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. If your classroom already has a roster, you can either update the roster or delete the roster and create a new roster. - For more information about deleting and creating a roster, see "[Deleting a roster for a classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#deleting-a-roster-for-a-classroom)" and "[Creating a roster for your classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-roster-for-your-classroom)." - For more information about updating a roster, see "[Adding students to the roster for your classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#adding-students-to-the-roster-for-your-classroom)." 1. In the list of LMSes, click your LMS. If your LMS is not supported, click **Other LMS**.  1. Read about connecting your LMS, then click **Connect to _LMS_**. 1. Copy the "Consumer Key", "Shared Secret", and "Launch URL" for the connection to the classroom.  ### Configuring a generic LMS You must configure the privacy settings for your LMS to allow external tools to receive roster information. 1. Navigate to your LMS. 1. Configure an external tool. 1. Provide the configuration credentials you generated in {% data variables.product.prodname_classroom %}. - Consumer key - Shared secret - Launch URL (sometimes called "tool URL" or similar) ### Configuring Canvas You can configure {% data variables.product.prodname_classroom %} as an external app for Canvas to import roster data into your classroom. For more information about Canvas, see the [Canvas website](https://www.instructure.com/canvas/). 1. Sign into [Canvas](https://www.instructure.com/canvas/#login). 1. Select the Canvas course to integrate with {% data variables.product.prodname_classroom %}. 1. In the left sidebar, click **Settings**. 1. Click the **Apps** tab. 1. Click **View app configurations**. 1. Click **+App**. 1. Select the **Configuration Type** drop-down menu, and click **By URL**. 1. Paste the configuration credentials from {% data variables.product.prodname_classroom %}. For more information, see "[Generating configuration credentials for your classroom](#generating-configuration-credentials-for-your-classroom)." | Field in Canvas app configuration | Value or setting | | :- | :- | | **Consumer Key** | Consumer key from {% data variables.product.prodname_classroom %} | | **Shared Secret** | Shared secret from {% data variables.product.prodname_classroom %} | | **Allow this tool to access the IMS Names and Role Provisioning Service** | Enabled | | **Configuration URL** | Launch URL from {% data variables.product.prodname_classroom %} | {% note %} **Note**: If you don't see a checkbox in Canvas labeled "Allow this tool to access the IMS Names and Role Provisioning Service", then your Canvas administrator must contact Canvas support to enable membership service configuration for your Canvas account. Without enabling this feature, you won't be able to sync the roster from Canvas. For more information, see [How do I contact Canvas Support?](https://community.canvaslms.com/t5/Canvas-Basics-Guide/How-do-I-contact-Canvas-Support/ta-p/389767) on the Canvas website. {% endnote %} 1. Click **Submit**. 1. In the left sidebar, click **Home**. 1. To prompt Canvas to send a confirmation email, in the left sidebar, click **GitHub Classroom**. Follow the instructions in the email to finish linking {% data variables.product.prodname_classroom %}. ### Configuring Moodle You can configure {% data variables.product.prodname_classroom %} as an activity for Moodle to import roster data into your classroom. For more information about Moodle, see the [Moodle website](https://moodle.org). You must be using Moodle version 3.0 or greater. 1. Sign into [Moodle](https://moodle.org/login/index.php). 1. Select the Moodle course to integrate with {% data variables.product.prodname_classroom %}. 1. Click **Turn editing on**. 1. Wherever you'd like {% data variables.product.prodname_classroom %} to be available in Moodle, click **Add an activity or resource**. 1. Choose **External tool** and click **Add**. 1. In the "Activity name" field, type "GitHub Classroom". 1. In the **Preconfigured tool** field, to the right of the drop-down menu, click **+**. 1. Under "External tool configuration", paste the configuration credentials from {% data variables.product.prodname_classroom %}. For more information, see "[Generating configuration credentials for your classroom](#generating-configuration-credentials-for-your-classroom)." | Field in Moodle app configuration | Value or setting | | :- | :- | | **Tool name** | {% data variables.product.prodname_classroom %} - _YOUR CLASSROOM NAME_<br/><br/>**Note**: You can use any name, but we suggest this value for clarity. | | **Tool URL** | Launch URL from {% data variables.product.prodname_classroom %} | | **LTI version** | LTI 1.0/1.1 | | **Default launch container** | New window | | **Consumer key** | Consumer key from {% data variables.product.prodname_classroom %} | | **Shared secret** | Shared secret from {% data variables.product.prodname_classroom %} | 1. Scroll to and click **Services**. 1. To the right of "IMS LTI Names and Role Provisioning", select the drop-down menu and click **Use this service to retrieve members' information as per privacy settings**. 1. Scroll to and click **Privacy**. 1. To the right of **Share launcher's name with tool** and **Share launcher's email with tool**, select the drop-down menus to click **Always**. 1. At the bottom of the page, click **Save changes**. 1. In the **Preconfigure tool** menu, click **GitHub Classroom - _YOUR CLASSROOM NAME_**. 1. Under "Common module settings", to the right of "Availability", select the drop-down menu and click **Hide from students**. 1. At the bottom of the page, click **Save and return to course**. 1. Navigate to anywhere you chose to display {% data variables.product.prodname_classroom %}, and click the {% data variables.product.prodname_classroom %} activity. ### Importing a roster from your LMS For more information about importing the roster from your LMS into {% data variables.product.prodname_classroom %}, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-roster-for-your-classroom)." ### Disconnecting your LMS {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. Under "Connect to a learning management system (LMS)", click **Connection Settings**.  1. Under "Delete Connection to your learning management system", click **Disconnect from your learning management system**.  145 .../education/manage-coursework-with-github-classroom/create-a-group-assignment.md @@ -0,0 +1,145 @@ --- title: Create a group assignment intro: 'You can create a collaborative assignment for teams of students who participate in your course.' versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/create-group-assignments --- ### About group assignments {% data reusables.classroom.assignments-group-definition %} Students can work together on a group assignment in a shared repository, like a team of professional developers. When a student accepts a group assignment, the student can create a new team or join an existing team. {% data variables.product.prodname_classroom %} saves the teams for an assignment as a set. You can name the set of teams for a specific assignment when you create the assignment, and you can reuse that set of teams for a later assignment. {% data reusables.classroom.classroom-creates-group-repositories %} {% data reusables.classroom.about-assignments %} You can decide how many teams one assignment can have, and how many members each team can have. Each team that a student creates for an assignment is a team within your organization on {% data variables.product.product_name %}. The visibility of the team is secret. Teams that you create on {% data variables.product.product_name %} will not appear in {% data variables.product.prodname_classroom %}. For more information, see "[About teams](/github/setting-up-and-managing-organizations-and-teams/about-teams)." For a video demonstration of the creation of a group assignment, see "[Basics of setting up {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom)." ### Prerequisites {% data reusables.classroom.assignments-classroom-prerequisite %} ### Creating an assignment {% data reusables.classroom.assignments-guide-create-the-assignment %} ### Setting up the basics for an assignment Name your assignment, decide whether to assign a deadline, define teams, and choose the visibility of assignment repositories. - [Naming an assignment](#naming-an-assignment) - [Assigning a deadline for an assignment](#assigning-a-deadline-for-an-assignment) - [Choosing an assignment type](#choosing-an-assignment-type) - [Defining teams for an assignment](#defining-teams-for-an-assignment) - [Choosing a visibility for assignment repositories](#choosing-a-visibility-for-assignment-repositories) #### Naming an assignment For a group assignment, {% data variables.product.prodname_classroom %} names repositories by the repository prefix and the name of the team. By default, the repository prefix is the assignment title. For example, if you name an assignment "assignment-1" and the team's name on {% data variables.product.product_name %} is "student-team", the name of the assignment repository for members of the team will be `assignment-1-student-team`. {% data reusables.classroom.assignments-type-a-title %} #### Assigning a deadline for an assignment {% data reusables.classroom.assignments-guide-assign-a-deadline %} #### Choosing an assignment type Under "Individual or group assignment", select the drop-down menu, then click **Group assignment**. You can't change the assignment type after you create the assignment. If you'd rather create a individual assignment, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)." #### Defining teams for an assignment If you've already created a group assignment for the classroom, you can reuse a set of teams for the new assignment. To create a new set with the teams that your students create for the assignment, type the name for the set. Optionally, type the maximum number of team members and total teams. {% tip %} **Tips**: - We recommend including details about the set of teams in the name for the set. For example, if you want to use the set of teams for one assignment, name the set after the assignment. If you want to reuse the set throughout a semester or course, name the set after the semester or course. - If you'd like to assign students to a specific team, give your students a name for the team and provide a list of members. {% endtip %}  #### Choosing a visibility for assignment repositories {% data reusables.classroom.assignments-guide-choose-visibility %} {% data reusables.classroom.assignments-guide-click-continue-after-basics %} ### Adding starter code and configuring a development environment {% data reusables.classroom.assignments-guide-intro-for-environment %} - [Choosing a template repository](#choosing-a-template-repository) - [Choosing an online integrated development environment (IDE)](#choosing-an-online-integrated-development-environment-ide) #### Choosing a template repository By default, a new assignment will create an empty repository for each team that a student creates. {% data reusables.classroom.you-can-choose-a-template-repository %} For more information about template repositories, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." {% data reusables.classroom.assignments-guide-choose-template-repository %} #### Choosing an online integrated development environment (IDE) {% data reusables.classroom.about-online-ides %} For more information, see "[Integrate {% data variables.product.prodname_classroom %} with an IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)." {% data reusables.classroom.assignments-guide-choose-an-online-ide %} {% data reusables.classroom.assignments-guide-click-continue-after-starter-code-and-feedback %} ### Providing feedback Optionally, you can automatically grade assignments and create a space for discussing each submission with the team. - [Testing assignments automatically](#testing-assignments-automatically) - [Preventing changes to important files](#preventing-changes-to-important-files) - [Creating a pull request for feedback](#creating-a-pull-request-for-feedback) #### Testing assignments automatically {% data reusables.classroom.assignments-guide-using-autograding %} #### Preventing changes to important files {% data reusables.classroom.assignments-guide-prevent-changes %} #### Creating a pull request for feedback {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} {% data reusables.classroom.assignments-guide-create-review-pull-request %} {% data reusables.classroom.assignments-guide-click-create-assignment-button %} ### Inviting students to an assignment {% data reusables.classroom.assignments-guide-invite-students-to-assignment %} You can see the teams that are working on or have submitted an assignment in the **Teams** tab for the assignment. {% data reusables.classroom.assignments-to-prevent-submission %} <div class="procedural-image-wrapper"> <img alt="Group assignment" class="procedural-image-wrapper" src="/assets/images/help/classroom/assignment-group-hero.png"> </div> ### Next steps - After you create the assignment and your students form teams, team members can start work on the assignment using Git and {% data variables.product.product_name %}'s features. Students can clone the repository, push commits, manage branches, create and review pull requests, address merge conflicts, and discuss changes with issues. Both you and the team can review the commit history for the repository. For more information, see "[Getting started with {% data variables.product.prodname_dotcom %}](/github/getting-started-with-github)," "[Creating, cloning, and archiving repositories](/github/creating-cloning-and-archiving-repositories)," "[Using Git](/github/using-git)," and "[Collaborating with issues and pull requests](/github/collaborating-with-issues-and-pull-requests)," and the free course on [managing merge conflicts](https://lab.github.com/githubtraining/managing-merge-conflicts) from {% data variables.product.prodname_learning %}. - When a team finishes an assignment, you can review the files in the repository, or you can review the history and visualizations for the repository to better understand how the team collaborated. For more information, see "[Visualizing repository data with graphs](/github/visualizing-repository-data-with-graphs)." - You can provide feedback for an assignment by commenting on individual commits or lines in a pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)" and "[Opening an issue from code](/github/managing-your-work-on-github/opening-an-issue-from-code)." For more information about creating saved replies to provide feedback for common errors, see "[About saved replies](/github/writing-on-github/about-saved-replies)." ### Further reading - "[Use {% data variables.product.prodname_dotcom %} in your classroom and research](/education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research)" - "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)" - [Using Existing Teams in Group Assignments?](https://education.github.community/t/using-existing-teams-in-group-assignments/6999) in the {% data variables.product.prodname_education %} Community 19 ...sework-with-github-classroom/create-an-assignment-from-a-template-repository.md @@ -0,0 +1,19 @@ --- title: Create an assignment from a template repository intro: You can create an assignment from a template repository to provide starter code, documentation, and other resources to your students. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/using-template-repos-for-assignments --- You can use a template repository on {% data variables.product.product_name %} as starter code for an assignment on {% data variables.product.prodname_classroom %}. Your template repository can contain boilerplate code, documentation, and other resources for your students. For more information, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." To use the template repository for your assignment, the template repository must be owned by your organization, or the visibility of the template repository must be public. {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} For more information, see "[Configure default settings for assignment repositories](/education/manage-coursework-with-github-classroom/configure-default-settings-for-assignment-repositories)." ### Further reading - "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" - "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)" 124 ...tion/manage-coursework-with-github-classroom/create-an-individual-assignment.md @@ -0,0 +1,124 @@ --- title: Create an individual assignment intro: You can create an assignment for students in your course to complete individually. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/creating-an-individual-assignment - /education/manage-coursework-with-github-classroom/create-an-individual-assignment --- ### About individual assignments {% data reusables.classroom.assignments-individual-definition %} {% data reusables.classroom.classroom-creates-individual-repositories %} {% data reusables.classroom.about-assignments %} For a video demonstration of the creation of an individual assignment, see "[Basics of setting up {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom)." ### Prerequisites {% data reusables.classroom.assignments-classroom-prerequisite %} ### Creating an assignment {% data reusables.classroom.assignments-guide-create-the-assignment %} ### Setting up the basics for an assignment Name your assignment, decide whether to assign a deadline, and choose the visibility of assignment repositories. - [Naming an assignment](#naming-an-assignment) - [Assigning a deadline for an assignment](#assigning-a-deadline-for-an-assignment) - [Choosing an assignment type](#choosing-an-assignment-type) - [Choosing a visibility for assignment repositories](#choosing-a-visibility-for-assignment-repositories) #### Naming an assignment For an individual assignment, {% data variables.product.prodname_classroom %} names repositories by the repository prefix and the student's {% data variables.product.product_name %} username. By default, the repository prefix is the assignment title. For example, if you name an assignment "assignment-1" and the student's username on {% data variables.product.product_name %} is @octocat, the name of the assignment repository for @octocat will be `assignment-1-octocat`. {% data reusables.classroom.assignments-type-a-title %} #### Assigning a deadline for an assignment {% data reusables.classroom.assignments-guide-assign-a-deadline %} #### Choosing an assignment type Under "Individual or group assignment", select the drop-down menu, and click **Individual assignment**. You can't change the assignment type after you create the assignment. If you'd rather create a group assignment, see "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." #### Choosing a visibility for assignment repositories {% data reusables.classroom.assignments-guide-choose-visibility %} {% data reusables.classroom.assignments-guide-click-continue-after-basics %} ### Adding starter code and configuring a development environment {% data reusables.classroom.assignments-guide-intro-for-environment %} - [Choosing a template repository](#choosing-a-template-repository) - [Choosing an online integrated development environment (IDE)](#choosing-an-online-integrated-development-environment-ide) #### Choosing a template repository By default, a new assignment will create an empty repository for each student on the roster for the classroom. {% data reusables.classroom.you-can-choose-a-template-repository %} For more information about template repositories, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." {% data reusables.classroom.assignments-guide-choose-template-repository %} {% data reusables.classroom.assignments-guide-click-continue-after-starter-code-and-feedback %} #### Choosing an online integrated development environment (IDE) {% data reusables.classroom.about-online-ides %} For more information, see "[Integrate {% data variables.product.prodname_classroom %} with an IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)." {% data reusables.classroom.assignments-guide-choose-an-online-ide %} ### Providing feedback for an assignment Optionally, you can automatically grade assignments and create a space for discussing each submission with the student. - [Testing assignments automatically](#testing-assignments-automatically) - [Preventing changes to important files](#preventing-changes-to-important-files) - [Creating a pull request for feedback](#creating-a-pull-request-for-feedback) #### Testing assignments automatically {% data reusables.classroom.assignments-guide-using-autograding %} #### Preventing changes to important files {% data reusables.classroom.assignments-guide-prevent-changes %} #### Creating a pull request for feedback {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} {% data reusables.classroom.assignments-guide-create-review-pull-request %} {% data reusables.classroom.assignments-guide-click-create-assignment-button %} ### Inviting students to an assignment {% data reusables.classroom.assignments-guide-invite-students-to-assignment %} You can see whether a student has joined the classroom and accepted or submitted an assignment in the **All students** tab for the assignment. {% data reusables.classroom.assignments-to-prevent-submission %} <div class="procedural-image-wrapper"> <img alt="Individual assignment" class="procedural-image-wrapper" src="/assets/images/help/classroom/assignment-individual-hero.png"> </div> ### Next steps - Once you create the assignment, students can start work on the assignment using Git and {% data variables.product.product_name %}'s features. Students can clone the repository, push commits, manage branches, create and review pull requests, address merge conflicts, and discuss changes with issues. Both you and student can review the commit history for the repository. For more information, see "[Getting started with {% data variables.product.prodname_dotcom %}](/github/getting-started-with-github)," "[Creating, cloning, and archiving repositories](/github/creating-cloning-and-archiving-repositories)," "[Using Git](/github/using-git)," and "[Collaborating with issues and pull requests](/github/collaborating-with-issues-and-pull-requests)." - When a student finishes an assignment, you can review the files in the repository, or you can review the history and visualizations for the repository to better understand the student's work. For more information, see "[Visualizing repository data with graphs](/github/visualizing-repository-data-with-graphs)." - You can provide feedback for an assignment by commenting on individual commits or lines in a pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)" and "[Opening an issue from code](/github/managing-your-work-on-github/opening-an-issue-from-code)." For more information about creating saved replies to provide feedback for common errors, see "[About saved replies](/github/writing-on-github/about-saved-replies)." ### Further reading - "[Use {% data variables.product.prodname_dotcom %} in your classroom and research](/education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research)" - "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)" 9 ...on/manage-coursework-with-github-classroom/get-started-with-github-classroom.md @@ -0,0 +1,9 @@ --- title: Get started with GitHub Classroom shortTitle: Get started intro: Learn how to configure and use {% data variables.product.prodname_classroom %} to administer your course. mapTopic: true versions: free-pro-team: '*' --- 52 content/education/manage-coursework-with-github-classroom/glossary.md @@ -0,0 +1,52 @@ --- title: Glossary intro: You can review explanations of terminology for {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' --- ### assignment An assignment is coursework in {% data variables.product.prodname_classroom %}. A teacher can assign an assignment to an individual student or a group of students. Teachers can import starter code for the assignment, assign students, and create a deadline for each assignment. For more information, see the definitions for "[individual assignment](#individual-assignment)" and "[group assignment](#group-assignment)." --- ### classroom A classroom is the basic unit of {% data variables.product.prodname_classroom %}. Teachers can use a classroom to organize and manage students, teaching assistants, and assignments for a single course. A classroom belongs to an organization on {% data variables.product.prodname_dotcom_the_website %}. To administer a classroom, you must be an organization owner for the organization on {% data variables.product.prodname_dotcom %}. For more information, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms)." --- ### {% data variables.product.prodname_classroom %} {% data variables.product.prodname_classroom %} is a web application for educators that provides course administration tools integrated with {% data variables.product.prodname_dotcom %}. For more information, see the [{% data variables.product.prodname_classroom %}](https://classroom.github.com/) website. --- ### group assignment {% data reusables.classroom.assignments-group-definition %} For more information, see "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." --- ### identifier An identifier in {% data variables.product.prodname_classroom %} is a unique ID for a student participating in a course. For example, an identifier can be a student name, alphanumeric ID, or email address. --- ### individual assignment {% data reusables.classroom.assignments-individual-definition %} For more information, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)." --- ### roster A roster allows a teacher to manage students and assignment submissions in a classroom on {% data variables.product.prodname_classroom %}. Teachers can create a roster by entering a list of student identifiers, or by connecting {% data variables.product.prodname_classroom %} to a learning management system (LMS). For more information about identifiers, see the definition of "[identifier](#identifier)." For more information about connecting {% data variables.product.prodname_classroom %} to an LMS, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)." --- ### Further reading - "[{% data variables.product.prodname_dotcom %} glossary](/github/getting-started-with-github/github-glossary)" 32 content/education/manage-coursework-with-github-classroom/index.md @@ -0,0 +1,32 @@ --- title: Manage coursework with GitHub Classroom shortTitle: '{% data variables.product.prodname_classroom %}' intro: With {% data variables.product.prodname_classroom %}, you can use {% data variables.product.product_name %} to administer or participate in a course about software development. versions: free-pro-team: '*' --- ### Table of Contents {% topic_link_in_list /get-started-with-github-classroom %} {% link_in_list /basics-of-setting-up-github-classroom %} {% link_in_list /glossary %} {% topic_link_in_list /teach-with-github-classroom %} {% link_in_list /manage-classrooms %} {% link_in_list /create-an-individual-assignment %} {% link_in_list /create-a-group-assignment %} {% link_in_list /create-an-assignment-from-a-template-repository %} {% link_in_list /leave-feedback-with-pull-requests %} {% link_in_list /use-autograding %} {% link_in_list /configure-default-settings-for-assignment-repositories %} {% link_in_list /connect-a-learning-management-system-to-github-classroom %} {% topic_link_in_list /integrate-github-classroom-with-an-ide %} {% link_in_list /integrate-github-classroom-with-an-online-ide %} {% link_in_list /about-using-makecode-arcade-with-github-classroom %} {% link_in_list /about-using-replit-with-github-classroom %} {% link_in_list /run-student-code-in-an-online-ide %} {% topic_link_in_list /learn-with-github-classroom %} {% link_in_list /view-autograding-results %} 8 ...nage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide.md @@ -0,0 +1,8 @@ --- title: Integrate GitHub Classroom with an IDE shortTitle: Integrate with an IDE intro: You can help your students write, test, and debug code by preconfiguring a development environment for assignment repositories on {% data variables.product.prodname_classroom %}. mapTopic: true versions: free-pro-team: '*' --- 42 ...ursework-with-github-classroom/integrate-github-classroom-with-an-online-ide.md @@ -0,0 +1,42 @@ --- title: Integrate GitHub Classroom with an online IDE shortTitle: Integrate with an online IDE intro: You can preconfigure a supported online integrated development environment (IDE) for assignments you create in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/online-ide-integrations --- ### About integration with an online IDE {% data reusables.classroom.about-online-ides %} After a student accepts an assignment with an online IDE, the README file in the student's assignment repository will contain a button to open the assignment in the IDE. The student can begin working immediately, and no additional configuration is necessary.  ### Supported online IDEs {% data variables.product.prodname_classroom %} supports the following online IDEs. You can learn more about the student experience for each IDE. | IDE | More information | | :- | :- | | Microsoft MakeCode Arcade | "[About using MakeCode Arcade with {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/about-using-makecode-arcade-with-github-classroom)" | | Repl.it | "[About using Repl.it with GitHub Classroom](/education/manage-coursework-with-github-classroom/about-using-replit-with-github-classroom)" | ### Configuring an online IDE for an assignment You can choose the online IDE you'd like to use for an assignment when you create an assignment. To learn how to create a new assignment that uses an online IDE, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" or "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." ### Authorizing the OAuth app for an online IDE The first time you configure an assignment with an online IDE, you must authorize the OAuth app for the online IDE for your organization.  For all repositories, grant the app **read** access to metadata, administration, and code, and **write** access to administration and code. For more information, see "[Authorizing OAuth Apps](/github/authenticating-to-github/authorizing-oauth-apps)." ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 7 ...ducation/manage-coursework-with-github-classroom/learn-with-github-classroom.md @@ -0,0 +1,7 @@ --- title: Learn with GitHub Classroom intro: You can participate in coursework in {% data variables.product.prodname_classroom %} and see results from your teacher. mapTopic: true versions: free-pro-team: '*' --- 33 ...on/manage-coursework-with-github-classroom/leave-feedback-with-pull-requests.md @@ -0,0 +1,33 @@ --- title: Leave feedback with pull requests intro: You can leave feedback for your students in a special pull request within the repository for each assignment. permissions: People with read permissions to a repository can leave feedback in a pull request for the repository. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/leaving-feedback-in-github --- ### About feedback pull requests for assignments {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} When you enable the pull request for feedback for an assignment, {% data variables.product.prodname_classroom %} will create a special pull request titled **Feedback** in the assignment repository for each student or team. The pull request automatically shows every commit that a student pushed to the assignment repository's default branch. ### Prerequisites To create and access the feedback pull request, you must enable the feedback pull request when you create the assignment. {% data reusables.classroom.for-more-information-about-assignment-creation %} ### Leaving feedback in a pull request for an assignment {% data reusables.classroom.sign-into-github-classroom %} 1. In the list of classrooms, click the classroom with the assignment you want to review.  {% data reusables.classroom.click-assignment-in-list %} 1. To the right of the submission, click **Review**.  1. Review the pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)." ### Further reading - "[Integrate {% data variables.product.prodname_classroom %} with an IDE](http://localhost:4000/en/free-pro-team@latest/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)" 121 content/education/manage-coursework-with-github-classroom/manage-classrooms.md @@ -0,0 +1,121 @@ --- title: Manage classrooms intro: You can create and manage a classroom for each course that you teach using {% data variables.product.prodname_classroom %}. permissions: Organization owners can manage a classroom for an organization. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/archive-a-classroom --- ### About classrooms {% data reusables.classroom.about-classrooms %}  ### About management of classrooms {% data variables.product.prodname_classroom %} uses organization accounts on {% data variables.product.product_name %} to manage permissions, administration, and security for each classroom that you create. Each organization can have multiple classrooms. After you create a classroom, {% data variables.product.prodname_classroom %} will prompt you to invite teaching assistants (TAs) and admins to the classroom. Each classroom can have one or more admins. Admins can be teachers, TAs, or any other course administrator who you'd like to have control over your classrooms on {% data variables.product.prodname_classroom %}. Invite TAs and admins to your classroom by inviting the user accounts on {% data variables.product.product_name %} to your organization as organization owners and sharing the URL for your classrom. Organization owners can administer any classroom for the organization. For more information, see "[Permission levels for an organization](/github/setting-up-and-managing-organizations-and-teams/permission-levels-for-an-organization)" and "[Inviting users to join your organization](/github/setting-up-and-managing-organizations-and-teams/inviting-users-to-join-your-organization)." When you're done using a classroom, you can archive the classroom and refer to the classroom, roster, and assignments later, or you can delete the classroom if you no longer need the classroom. ### About classroom rosters Each classroom has a roster. A roster is a list of identifiers for the students who participate in your course. When you first share the URL for an assignment with a student, the student must sign into {% data variables.product.product_name %} with a user account to link the user account to an identifier for the classroom. After the student links a user account, you can see the associated user account in the roster. You can also see when the student accepts or submits an assignment.  ### Prerequisites You must have an organization account on {% data variables.product.product_name %} to manage classrooms on {% data variables.product.prodname_classroom %}. For more information, see "[Types of {% data variables.product.company_short %} accounts](/github/getting-started-with-github/types-of-github-accounts#organization-accounts)" and "[Creating a new organization from scratch](/github/setting-up-and-managing-organizations-and-teams/creating-a-new-organization-from-scratch)." You must authorize the OAuth app for {% data variables.product.prodname_classroom %} for your organization to manage classrooms for your organization account. For more information, see "[Authorizing OAuth Apps](/github/authenticating-to-github/authorizing-oauth-apps)." ### Creating a classroom {% data reusables.classroom.sign-into-github-classroom %} 1. Click **New classroom**.  {% data reusables.classroom.guide-create-new-classroom %} After you create a classroom, you can begin creating assignments for students. For more information, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" or "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." ### Creating a roster for your classroom You can create a roster of the students who participate in your course. If your course already has a roster, you can update the students on the roster or delete the roster. For more information, see "[Adding a student to the roster for your classroom](#adding-students-to-the-roster-for-your-classroom)" or "[Deleting a roster for a classroom](#deleting-a-roster-for-a-classroom)." {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. To connect {% data variables.product.prodname_classroom %} to your LMS and import a roster, click {% octicon "mortar-board" aria-label="The mortar board icon" %} **Import from a learning management system** and follow the instructions. For more information, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)."  1. To create a roster manually, type your student identifiers. Optionally, click **Upload a CSV or text file** to upload a file containing the identifiers.  1. Click **Create roster**.  ### Adding students to the roster for your classroom Your classroom must have an existing roster to add students to the roster. For more information about creating a roster, see "[Creating a roster for your classrom](#creating-a-roster-for-your-classroom)." {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. To the right of "Classroom roster", click **Update students**.  1. Follow the instructions to add students to the roster. - To import students from an LMS, click **Sync from a learning management system**. For more information about importing a roster from an LMS, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)." - To manually add students, under "Manually add students", click **Upload a CSV or text file** or type the identifiers for the students, then click **Add roster entries**.  ### Renaming a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. Under "Classroom name", type a new name for the classroom.  1. Click **Rename classroom**.  ### Archiving or unarchiving a classroom You can archive a classroom that you no longer use on {% data variables.product.prodname_classroom %}. When you archive a classroom, you can't create new assignments or edit existing assignments for the classroom. Students can't accept invitations to assignments in archived classrooms. {% data reusables.classroom.sign-into-github-classroom %} 1. To the right of a classroom's name, select the {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} drop-down menu, then click **Archive**.  1. To unarchive a classroom, to the right of a classroom's name, select the {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} drop-down menu, then click **Unarchive**.  ### Deleting a roster for a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. Under "Delete this roster", click **Delete roster**.  1. Read the warnings, then click **Delete roster**.  ### Deleting a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. To the right of "Delete this classroom", click **Delete classroom**.  1. **Read the warnings**. 1. To verify that you're deleting the correct classroom, type the name of the classroom you want to delete.  1. Click **Delete classroom**.  22 ...on/manage-coursework-with-github-classroom/run-student-code-in-an-online-ide.md @@ -0,0 +1,22 @@ --- title: Run student code in an online IDE intro: You can run the code from a student assignment within the online integrated development environment (IDE) that you configured for the assignment. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/running-student-code --- ### About student code and online IDEs If you configure an online integrated development environment (IDE) for an assignment, you can run the code within the online IDE. You don't need to clone the assignment repository to your computer. For more information about online IDEs, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." ### Running student code in the online IDE {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-assignment-in-list %} 1. To the right of the submission, click **View IDE**.  8 ...ducation/manage-coursework-with-github-classroom/teach-with-github-classroom.md @@ -0,0 +1,8 @@ --- title: Teach with GitHub Classroom intro: Learn how to set up your classroom and assignments. mapTopic: true versions: free-pro-team: '*' --- 93 content/education/manage-coursework-with-github-classroom/use-autograding.md 30 ...t/education/manage-coursework-with-github-classroom/view-autograding-results.md 90 content/education/quickstart.md 1 ...github-education/about-campus-advisors.md → ...github-education/about-campus-advisors.md 1 ...-github-education/about-campus-experts.md → ...-github-education/about-campus-experts.md 1 ...ducation-for-educators-and-researchers.md → ...ducation-for-educators-and-researchers.md 5 ...on/about-github-education-for-students.md → ...on/about-github-education-for-students.md 9 ...ithub-education/about-github-education.md → ...ithub-education/about-github-education.md 5 .../applying-for-a-student-developer-pack.md → ...ion/apply-for-a-student-developer-pack.md 14 ...for-an-educator-or-researcher-discount.md → ...for-an-educator-or-researcher-discount.md 26 content/education/teach-and-learn-with-github-education/index.md 3 ...github-at-your-educational-institution.md → ...github-at-your-educational-institution.md 3 ...ation/using-github-for-your-schoolwork.md → ...ucation/use-github-for-your-schoolwork.md 3 ...-github-in-your-classroom-and-research.md → ...-github-in-your-classroom-and-research.md 5 ...-for-a-student-developer-pack-approved.md → ...-for-a-student-developer-pack-approved.md 3 ...ucator-or-researcher-discount-approved.md → ...ucator-or-researcher-discount-approved.md 20 ...ering-a-repository/enabling-or-disabling-github-discussions-for-a-repository.md 5 content/github/administering-a-repository/index.md 2 content/github/authenticating-to-github/reviewing-your-security-log.md 1 content/github/collaborating-with-issues-and-pull-requests/index.md 74 ...with-issues-and-pull-requests/reviewing-dependency-changes-in-a-pull-request.md 19 ...g-with-issues-and-pull-requests/reviewing-proposed-changes-in-a-pull-request.md 10 content/github/creating-cloning-and-archiving-repositories/about-repositories.md 15 content/github/customizing-your-github-workflow/about-github-marketplace.md 2 content/github/getting-started-with-github/git-and-github-learning-resources.md 4 content/github/getting-started-with-github/github-glossary.md 6 content/github/getting-started-with-github/signing-up-for-a-new-github-account.md 1 content/github/index.md 2 ...b/managing-security-vulnerabilities/about-alerts-for-vulnerable-dependencies.md 25 ...hub/managing-security-vulnerabilities/about-managing-vulnerable-dependencies.md 1 content/github/managing-security-vulnerabilities/index.md 4 ...nerabilities/viewing-and-updating-vulnerable-dependencies-in-your-repository.md 3 ...criptions-and-notifications-on-github/managing-notifications-from-your-inbox.md 6 content/github/managing-your-work-on-github/about-issues.md 3 content/github/searching-for-information-on-github/about-searching-on-github.md 5 content/github/searching-for-information-on-github/index.md 114 content/github/searching-for-information-on-github/searching-discussions.md 2 ...ithub/searching-for-information-on-github/searching-issues-and-pull-requests.md 2 ...nd-managing-billing-and-payments-on-github/about-billing-for-github-sponsors.md 4 ...-billing-and-payments-on-github/discounted-subscriptions-for-github-accounts.md 19 ...ing-up-and-managing-billing-and-payments-on-github/downgrading-a-sponsorship.md 16 ...tting-up-and-managing-billing-and-payments-on-github/upgrading-a-sponsorship.md 4 content/github/setting-up-and-managing-organizations-and-teams/index.md 27 ...and-teams/managing-discussion-creation-for-repositories-in-your-organization.md 25 ...izations-and-teams/managing-updates-from-accounts-your-organization-sponsors.md 3 ...p-and-managing-organizations-and-teams/permission-levels-for-an-organization.md 14 ...ing-organizations-and-teams/repository-permission-levels-for-an-organization.md 86 ...naging-organizations-and-teams/reviewing-the-audit-log-for-your-organization.md 1 content/github/setting-up-and-managing-your-github-user-account/index.md 24 ...etting-up-and-managing-your-github-user-account/managing-your-theme-settings.md 12 content/github/site-policy/github-additional-product-terms.md 8 ...porting-the-open-source-community-with-github-sponsors/about-github-sponsors.md 17 ...community-with-github-sponsors/attributing-sponsorships-to-your-organization.md 28 ...e-open-source-community-with-github-sponsors/changing-your-sponsorship-tiers.md 22 ...th-github-sponsors/configuring-webhooks-for-events-in-your-sponsored-account.md 17 ...ting-the-open-source-community-with-github-sponsors/contacting-your-sponsors.md 25 ...munity-with-github-sponsors/editing-your-profile-details-for-github-sponsors.md 1 content/github/supporting-the-open-source-community-with-github-sponsors/index.md 12 ...ce-community-with-github-sponsors/managing-your-payouts-from-github-sponsors.md 18 ...he-open-source-community-with-github-sponsors/managing-your-sponsorship-goal.md 39 ...ing-the-open-source-community-with-github-sponsors/managing-your-sponsorship.md 10 ...munity-with-github-sponsors/setting-up-github-sponsors-for-your-organization.md 10 ...munity-with-github-sponsors/setting-up-github-sponsors-for-your-user-account.md 62 ...-source-community-with-github-sponsors/sponsoring-an-open-source-contributor.md 27 ...source-community-with-github-sponsors/viewing-your-sponsors-and-sponsorships.md 23 content/github/teaching-and-learning-with-github-education/index.md This file was deleted. 7 ...nt/github/visualizing-repository-data-with-graphs/about-the-dependency-graph.md 1 content/github/working-with-github-support/index.md 10 content/graphql/README.md 58 ...tting-started-with-github-container-registry/about-github-container-registry.md This file was deleted. 15 content/packages/getting-started-with-github-container-registry/index.md This file was deleted. 95 content/packages/guides/about-github-container-registry.md 2 ...ol-and-visibility-for-container-images.md → ...ol-and-visibility-for-container-images.md 5 ...che-maven-for-use-with-github-packages.md → ...che-maven-for-use-with-github-packages.md 1 ...ng-docker-for-use-with-github-packages.md → ...ng-docker-for-use-with-github-packages.md 1 ...otnet-cli-for-use-with-github-packages.md → ...otnet-cli-for-use-with-github-packages.md 1 ...ng-gradle-for-use-with-github-packages.md → ...ng-gradle-for-use-with-github-packages.md 1 ...uring-npm-for-use-with-github-packages.md → ...uring-npm-for-use-with-github-packages.md 1 ...-rubygems-for-use-with-github-packages.md → ...-rubygems-for-use-with-github-packages.md 2 ...ting-a-repository-to-a-container-image.md → ...ting-a-repository-to-a-container-image.md 10 content/packages/guides/container-guides-for-github-packages.md 2 ...er-registry/deleting-a-container-image.md → ...ages/guides/deleting-a-container-image.md 2 ...ry/enabling-improved-container-support.md → ...es/enabling-improved-container-support.md 33 content/packages/guides/index.md 2 ...b-container-registry-for-docker-images.md → ...b-container-registry-for-docker-images.md 10 content/packages/guides/package-client-guides-for-github-packages.md 2 ...stry/pushing-and-pulling-docker-images.md → ...ides/pushing-and-pulling-docker-images.md 1 ...ng-github-packages-with-github-actions.md → ...ng-github-packages-with-github-actions.md 46 content/packages/index.md 60 ...anaging-packages/about-github-packages.md → ...-github-packages/about-github-packages.md 13 ...concepts-for-github-container-registry.md → ...ages/core-concepts-for-github-packages.md 16 content/packages/learn-github-packages/index.md 1 ...managing-packages/publishing-a-package.md → ...n-github-packages/publishing-a-package.md 3 ...d-managing-packages/deleting-a-package.md → ...ges/manage-packages/deleting-a-package.md 8 ...publishing-and-managing-packages/index.md → content/packages/manage-packages/index.md 1 ...managing-packages/installing-a-package.md → ...s/manage-packages/installing-a-package.md 1 ...and-managing-packages/viewing-packages.md → ...kages/manage-packages/viewing-packages.md 11 content/packages/managing-container-images-with-github-container-registry/index.md This file was deleted. 109 content/packages/quickstart.md 20 content/packages/using-github-packages-with-your-projects-ecosystem/index.md This file was deleted. 10 content/rest/README.md 18 content/rest/overview/resources-in-the-rest-api.md 2 content/rest/overview/troubleshooting.md 10 content/rest/reference/enterprise-admin.md 2 data/products.yml 2 data/reusables/accounts/create-account.md 2 data/reusables/actions/actions-not-verified.md 7 data/reusables/actions/visualization-beta.md 5 data/reusables/audit_log/audit-log-api-info.md 1 data/reusables/audit_log/audit-log-git-events-retention.md 1 data/reusables/classroom/about-assignments.md 1 data/reusables/classroom/about-autograding.md 1 data/reusables/classroom/about-classrooms.md 1 data/reusables/classroom/about-online-ides.md 1 data/reusables/classroom/assignments-classroom-prerequisite.md 2 data/reusables/classroom/assignments-click-pencil.md 1 data/reusables/classroom/assignments-group-definition.md 5 data/reusables/classroom/assignments-guide-assign-a-deadline.md 5 data/reusables/classroom/assignments-guide-choose-an-online-ide.md 5 data/reusables/classroom/assignments-guide-choose-template-repository.md 9 data/reusables/classroom/assignments-guide-choose-visibility.md 7 data/reusables/classroom/assignments-guide-click-continue-after-basics.md 7 ...s/classroom/assignments-guide-click-continue-after-starter-code-and-feedback.md 5 data/reusables/classroom/assignments-guide-click-create-assignment-button.md 5 data/reusables/classroom/assignments-guide-create-review-pull-request.md 5 data/reusables/classroom/assignments-guide-create-the-assignment.md 1 data/reusables/classroom/assignments-guide-intro-for-environment.md 3 data/reusables/classroom/assignments-guide-invite-students-to-assignment.md 7 data/reusables/classroom/assignments-guide-prevent-changes.md 23 data/reusables/classroom/assignments-guide-using-autograding.md 1 data/reusables/classroom/assignments-individual-definition.md 1 data/reusables/classroom/assignments-to-prevent-submission.md 5 data/reusables/classroom/assignments-type-a-title.md 1 data/reusables/classroom/classroom-creates-group-repositories.md 1 data/reusables/classroom/classroom-creates-individual-repositories.md 1 data/reusables/classroom/classroom-enables-invitation-urls.md 2 data/reusables/classroom/click-assignment-in-list.md 2 data/reusables/classroom/click-classroom-in-list.md 2 data/reusables/classroom/click-settings.md 2 data/reusables/classroom/click-students.md 1 data/reusables/classroom/for-more-information-about-assignment-creation.md 6 data/reusables/classroom/guide-create-new-classroom.md 5 data/reusables/classroom/invitation-url-warning.md 1 data/reusables/classroom/readme-contains-button-for-online-ide.md 1 data/reusables/classroom/sign-into-github-classroom.md 1 data/reusables/classroom/use-add-test-drop-down-to-click-grading-method.md 1 data/reusables/classroom/you-can-choose-a-template-repository.md 1 data/reusables/classroom/you-can-create-a-pull-request-for-feedback.md 1 data/reusables/classroom/you-may-want-to-predefine-repository-settings.md 1 data/reusables/discussions/about-categories-and-formats.md 1 data/reusables/discussions/about-discussions.md 5 data/reusables/discussions/beta.md 2 data/reusables/discussions/click-discussion-in-list.md 2 data/reusables/discussions/discussions-tab.md 2 data/reusables/discussions/edit-categories.md 1 data/reusables/discussions/edit-category-details.md 8 ...les/discussions/enabling-or-disabling-github-discussions-for-your-repository.md 1 data/reusables/discussions/github-recognizes-members.md 16 data/reusables/discussions/marking-a-comment-as-an-answer.md 1 data/reusables/discussions/repository-category-limit.md 10 data/reusables/discussions/starting-a-discussion.md 1 data/reusables/discussions/you-can-categorize-discussions.md 1 data/reusables/discussions/you-can-convert-an-issue.md 1 data/reusables/discussions/you-can-use-discussions.md 1 data/reusables/discussions/you-cannot-convert-a-discussion.md 2 data/reusables/education/about-github-education-link.md 2 data/reusables/education/apply-for-team.md 2 data/reusables/education/click-get-teacher-benefits.md 6 data/reusables/education/educator-requirements.md 1 data/reusables/gated-features/discussions.md 1 data/reusables/marketplace/app-transfer-to-org-for-verification.md 5 data/reusables/marketplace/free-plan-note.md 2 data/reusables/marketplace/launch-with-free.md 8 data/reusables/marketplace/marketplace-billing-ui-requirements.md 2 data/reusables/package_registry/billing-for-container-registry.md 2 data/reusables/package_registry/container-registry-beta-billing-note.md 2 data/reusables/package_registry/container-registry-beta.md 2 data/reusables/package_registry/docker_registry_deprecation_status.md 2 data/reusables/package_registry/feature-preview-for-container-registry.md 2 data/reusables/package_registry/required-scopes.md 2 data/reusables/package_registry/viewing-packages.md 3 data/reusables/repositories/dependency-review.md 7 data/reusables/repositories/navigate-to-job-superlinter.md 4 data/reusables/repositories/view-failed-job-results-superlinter.md 4 data/reusables/repositories/view-specific-line-superlinter.md 2 data/reusables/search/date_gt_lt.md 2 data/reusables/sponsors/billing-switcher.md 2 data/reusables/sponsors/change-tier.md 2 data/reusables/sponsors/choose-updates.md 2 data/reusables/sponsors/developer-sponsored-choose-updates.md This file was deleted. 4 data/reusables/sponsors/manage-developer-sponsorship.md This file was deleted. 4 data/reusables/sponsors/manage-org-sponsorship.md This file was deleted. 2 data/reusables/sponsors/manage-sponsorship.md 1 data/reusables/sponsors/manage-updates-for-orgs.md 2 data/reusables/sponsors/maximum-tier.md 4 data/reusables/sponsors/navigate-to-org-sponsors-dashboard.md This file was deleted. 2 ...onsors/navigate-to-sponsored-developer.md → ...sponsors/navigate-to-sponsored-account.md 1 data/reusables/sponsors/navigate-to-sponsored-org.md This file was deleted. 2 ...ors/navigate-to-dev-sponsors-dashboard.md → ...ponsors/navigate-to-sponsors-dashboard.md 2 data/reusables/sponsors/no-fees.md 5 data/reusables/sponsors/org-sponsors-release-phase.md 2 data/reusables/sponsors/pay-prorated-amount.md 2 data/reusables/sponsors/prorated-sponsorship.md 2 data/reusables/sponsors/sponsor-account.md 7 data/reusables/sponsors/sponsorship-dashboard.md 2 data/reusables/sponsors/sponsorship-details.md 1 data/reusables/webhooks/app_always_desc.md 3 data/ui.yml 7 data/variables/action_code_examples.yml 37 data/variables/discussions_community_examples.yml 6 data/variables/product.yml 21 includes/all-articles.html 4 includes/breadcrumbs.html 2 includes/code-example-card.html 14 includes/discussions-community-card.html 2 includes/header-notification.html 90 javascripts/filter-cards.js 92 javascripts/filter-code-examples.js This file was deleted. 4 javascripts/index.js 64 layouts/product-landing.html 68 lib/data-directory.js 28 lib/filename-to-key.js 7 lib/frontmatter.js 2 lib/liquid-tags/data.js 25 lib/page.js 54 lib/pages.js 21 lib/redirects/get-docs-path-from-developer-path.js 41 lib/redirects/precompile.js 231 lib/rest/static/decorated/api.github.com.json 495 lib/rest/static/dereferenced/api.github.com.deref.json 17 lib/rewrite-local-links.js 10 lib/site-data.js 24 lib/warm-server.js 5 middleware/breadcrumbs.js 38 middleware/categories-for-support-team.js 6 middleware/contextualizers/early-access-links.js 103 middleware/csp.js 69 middleware/early-access-breadcrumbs.js 1 middleware/index.js 45 package-lock.json 3 package.json 4 script/check-s3-images.js 4 script/early-access/clone-locally 41 script/early-access/create-branch 7 server.js 2 stylesheets/article.scss 4 tests/browser/browser.js 10 tests/content/category-pages.js 2 tests/content/crowdin-config.js 3 tests/content/featured-links.js 5 tests/content/glossary.js 42 tests/content/remove-liquid-statements.js 39 tests/content/site-data-references.js 4 tests/content/site-data.js 22 tests/fixtures/rest-redirects.json 10 tests/graphql/build-changelog-test.js 9 tests/helpers/conditional-runs.js 20 tests/meta/orphan-tests.js 23 tests/rendering/breadcrumbs.js 4 tests/rendering/rest.js 3 tests/rendering/server.js 47 tests/routing/developer-site-redirects.js 10 tests/routing/redirects.js 15 tests/unit/data-directory/filename-to-key.js 1 tests/unit/data-directory/fixtures/README.md 1 tests/unit/data-directory/fixtures/bar.yaml 1 tests/unit/data-directory/fixtures/foo.json 1 tests/unit/data-directory/fixtures/nested/baz.md 40 tests/unit/data-directory/index.js 19 tests/unit/early-access.js 4 tests/unit/find-page.js 57 tests/unit/liquid-helpers.js 140 tests/unit/page.js 2 tests/unit/pages.js 0 comments on commit 1a56ed1 Leave a comment You’re not receiving notifications from this thread. © 2021 GitHub, Inc. Terms Privacy Security Status Docs Contact GitHub Pricing API Training Blog About
jettbrains
W3C Strategic Highlights September 2019 This report was prepared for the September 2019 W3C Advisory Committee Meeting (W3C Member link). See the accompanying W3C Fact Sheet — September 2019. For the previous edition, see the April 2019 W3C Strategic Highlights. For future editions of this report, please consult the latest version. A Chinese translation is available. ☰ Contents Introduction Future Web Standards Meeting Industry Needs Web Payments Digital Publishing Media and Entertainment Web & Telecommunications Real-Time Communications (WebRTC) Web & Networks Automotive Web of Things Strengthening the Core of the Web HTML CSS Fonts SVG Audio Performance Web Performance WebAssembly Testing Browser Testing and Tools WebPlatform Tests Web of Data Web for All Security, Privacy, Identity Internationalization (i18n) Web Accessibility Outreach to the world W3C Developer Relations W3C Training Translations W3C Liaisons Introduction This report highlights recent work of enhancement of the existing landscape of the Web platform and innovation for the growth and strength of the Web. 33 working groups and a dozen interest groups enable W3C to pursue its mission through the creation of Web standards, guidelines, and supporting materials. We track the tremendous work done across the Consortium through homogeneous work-spaces in Github which enables better monitoring and management. We are in the middle of a period where we are chartering numerous working groups which demonstrate the rapid degree of change for the Web platform: After 4 years, we are nearly ready to publish a Payment Request API Proposed Recommendation and we need to soon charter follow-on work. In the last year we chartered the Web Payment Security Interest Group. In the last year we chartered the Web Media Working Group with 7 specifications for next generation Media support on the Web. We have Accessibility Guidelines under W3C Member review which includes Silver, a new approach. We have just launched the Decentralized Identifier Working Group which has tremendous potential because Decentralized Identifier (DID) is an identifier that is globally unique, resolveable with high availability, and cryptographically verifiable. We have Privacy IG (PING) under W3C Member review which strengthens our focus on the tradeoff between privacy and function. We have a new CSS charter under W3C Member review which maps the group's work for the next three years. In this period, W3C and the WHATWG have succesfully completed the negotiation of a Memorandum of Understanding rooted in the mutual belief that that having two distinct specifications claiming to be normative is generally harmful for the Web community. The MOU, signed last May, describes how the two organizations are to collaborate on the development of a single authoritative version of the HTML and DOM specifications. W3C subsequently rechartered the HTML Working Group to assist the W3C community in raising issues and proposing solutions for the HTML and DOM specifications, and for the production of W3C Recommendations from WHATWG Review Drafts. As the Web evolves continuously, some groups are looking for ways for specifications to do so as well. So-called "evergreen recommendations" or "living standards" aim to track continuous development (and maintenance) of features, on a feature-by-feature basis, while getting review and patent commitments. We see the maturation and further development of an incredible number of new technologies coming to the Web. Continued progress in many areas demonstrates the vitality of the W3C and the Web community, as the rest of the report illustrates. Future Web Standards W3C has a variety of mechanisms for listening to what the community thinks could become good future Web standards. These include discussions with the Membership, discussions with other standards bodies, the activities of thousands of participants in over 300 community groups, and W3C Workshops. There are lots of good ideas. The W3C strategy team has been identifying promising topics and invites public participation. Future, recent and under consideration Workshops include: Inclusive XR (5-6 November 2019, Seattle, WA, USA) to explore existing and future approaches on making Virtual and Augmented Reality experiences more inclusive, including to people with disabilities; W3C Workshop on Data Models for Transportation (12-13 September 2019, Palo Alto, CA, USA) W3C Workshop on Web Games (27-28 June 2019, Redmond, WA, USA), view report Second W3C Workshop on the Web of Things (3-5 June 2019, Munich, Germany) W3C Workshop on Web Standardization for Graph Data; Creating Bridges: RDF, Property Graph and SQL (4-6 March 2019, Berlin, Germany), view report Web & Machine Learning. The Strategy Funnel documents the staff's exploration of potential new work at various phases: Exploration and Investigation, Incubation and Evaluation, and eventually to the chartering of a new standards group. The Funnel view is a GitHub Project where new area are issues represented by “cards” which move through the columns, usually from left to right. Most cards start in Exploration and move towards Chartering, or move out of the funnel. Public input is welcome at any stage but particularly once Incubation has begun. This helps W3C identify work that is sufficiently incubated to warrant standardization, to review the ecosystem around the work and indicate interest in participating in its standardization, and then to draft a charter that reflects an appropriate scope. Ongoing feedback can speed up the overall standardization process. Since the previous highlights document, W3C has chartered a number of groups, and started discussion on many more: Newly Chartered or Rechartered Web Application Security WG (03-Apr) Web Payment Security IG (17-Apr) Patent and Standards IG (24-Apr) Web Applications WG (14-May) Web & Networks IG (16-May) Media WG (23-May) Media and Entertainment IG (06-Jun) HTML WG (06-Jun) Decentralized Identifier WG (05-Sep) Extended Privacy IG (PING) (30-Sep) Verifiable Claims WG (30-Sep) Service Workers WG (31-Dec) Dataset Exchange WG (31-Dec) Web of Things Working Group (31-Dec) Web Audio Working Group (31-Dec) Proposed charters / Advance Notice Accessibility Guidelines WG Privacy IG (PING) RDF Literal Direction WG Timed Text WG CSS WG Web Authentication WG Closed Internationalization Tag Set IG Meeting Industry Needs Web Payments All Web Payments specifications W3C's payments standards enable a streamlined checkout experience, enabling a consistent user experience across the Web with lower front end development costs for merchants. Users can store and reuse information and more quickly and accurately complete online transactions. The Web Payments Working Group has republished Payment Request API as a Candidate Recommendation, aiming to publish a Proposed Recommendation in the Fall 2019, and is discussing use cases and features for Payment Request after publication of the 1.0 Recommendation. Browser vendors have been finalizing implementation of features added in the past year (view the implementation report). As work continues on the Payment Handler API and its implementation (currently in Chrome and Edge Canary), one focus in 2019 is to increase adoption in other browsers. Recently, Mastercard demonstrated the use of Payment Request API to carry out EMVCo's Secure Remote Commerce (SRC) protocol whose payment method definition is being developed with active participation by Visa, Mastercard, American Express, and Discover. Payment method availability is a key factor in merchant considerations about adopting Payment Request API. The ability to get uniform adoption of a new payment method such as Secure Remote Commerce (SRC) also depends on the availability of the Payment Handler API in browsers, or of proprietary alternatives. Web Monetization, which the Web Payments Working Group will discuss again at its face-to-face meeting in September, can be used to enable micropayments as an alternative revenue stream to advertising. Since the beginning of 2019, Amazon, Brave Software, JCB, Certus Cybersecurity Solutions and Netflix have joined the Web Payments Working Group. In April, W3C launched the Web Payment Security Group to enable W3C, EMVCo, and the FIDO Alliance to collaborate on a vision for Web payment security and interoperability. Participants will define areas of collaboration and identify gaps between existing technical specifications in order to increase compatibility among different technologies, such as: How do SRC, FIDO, and Payment Request relate? The Payment Services Directive 2 (PSD2) regulations in Europe are scheduled to take effect in September 2019. What is the role of EMVCo, W3C, and FIDO technologies, and what is the current state of readiness for the deadline? How can we improve privacy on the Web at the same time as we meet industry requirements regarding user identity? Digital Publishing All Digital Publishing specifications, Publication milestones The Web is the universal publishing platform. Publishing is increasingly impacted by the Web, and the Web increasingly impacts Publishing. Topic of particular interest to Publishing@W3C include typography and layout, accessibility, usability, portability, distribution, archiving, offline access, print on demand, and reliable cross referencing. And the diverse publishing community represented in the groups consist of the traditional "trade" publishers, ebook reading system manufacturers, but also publishers of audio book, scholarly journals or educational materials, library scientists or browser developers. The Publishing Working Group currently concentrates on Audiobooks which lack a comprehensive standard, thus incurring extra costs and time to publish in this booming market. Active development is ongoing on the future standard: Publication Manifest Audiobook profile for Web Publications Lightweight Packaging Format The BD Comics Manga Community Group, the Synchronized Multimedia for Publications Community Group, the Publishing Community Group and a future group on archival, are companions to the working group where specific work is developed and incubated. The Publishing Community Group is a recently launched incubation channel for Publishing@W3C. The goal of the group is to propose, document, and prototype features broadly related to: publications on the Web reading modes and systems and the user experience of publications The EPUB 3 Community Group has successfully completed the revision of EPUB 3.2. The Publishing Business Group fosters ongoing participation by members of the publishing industry and the overall ecosystem in the development of Web infrastructure to better support the needs of the industry. The Business Group serves as an additional conduit to the Publishing Working Group and several Community Groups for feedback between the publishing ecosystem and W3C. The Publishing BG has played a vital role in fostering and advancing the adoption and continued development of EPUB 3. In particular the BG provided critical support to the update of EPUBCheck to validate EPUB content to the new EPUB 3.2 specification. This resulted in the development, in conjunction with the EPUB3 Community Group, of a new generation of EPUBCheck, i.e., EPUBCheck 4.2 production-ready release. Media and Entertainment All Media specifications The Media and Entertainment vertical tracks media-related topics and features that create immersive experiences for end users. HTML5 brought standard audio and video elements to the Web. Standardization activities since then have aimed at turning the Web into a professional platform fully suitable for the delivery of media content and associated materials, enabling missing features to stream video content on the Web such as adaptive streaming and content protection. Together with Microsoft, Comcast, Netflix and Google, W3C received an Technology & Engineering Emmy Award in April 2019 for standardization of a full TV experience on the Web. Current goals are to: Reinforce core media technologies: Creation of the Media Working Group, to develop media-related specifications incubated in the WICG (e.g. Media Capabilities, Picture-in-picture, Media Session) and maintain maintain/evolve Media Source Extensions (MSE) and Encrypted Media Extensions (EME). Improve support for Media Timed Events: data cues incubation. Enhance color support (HDR, wide gamut), in scope of the CSS WG and in the Color on the Web CG. Reduce fragmentation: Continue annual releases of a common and testable baseline media devices, in scope of the Web Media APIs CG and in collaboration with the CTA WAVE Project. Maintain the Road-map of Media Technologies for the Web which highlights Web technologies that can be used to build media applications and services, as well as known gaps to enable additional use cases. Create the future: Discuss perspectives for Media and Entertainment for the Web. Bring the power of GPUs to the Web (graphics, machine learning, heavy processing), under incubation in the GPU for the Web CG. Transition to a Working Group is under discussion. Determine next steps after the successful W3C Workshop on Web Games of June 2019. View the report. Timed Text The Timed Text Working Group develops and maintains formats used for the representation of text synchronized with other timed media, like audio and video, and notably works on TTML, profiles of TTML, and WebVTT. Recent progress includes: A robust WebVTT implementation report poises the specification for publication as a proposed recommendation. Discussions around re-chartering, notably to add a TTML Profile for Audio Description deliverable to the scope of the group, and clarify that rendering of captions within XR content is also in scope. Immersive Web Hardware that enables Virtual Reality (VR) and Augmented Reality (AR) applications are now broadly available to consumers, offering an immersive computing platform with both new opportunities and challenges. The ability to interact directly with immersive hardware is critical to ensuring that the web is well equipped to operate as a first-class citizen in this environment. The Immersive Web Working Group has been stabilizing the WebXR Device API while the companion Immersive Web Community Group incubates the next series of features identified as key for the future of the Immersive Web. W3C plans a workshop focused on the needs and benefits at the intersection of VR & Accessibility (Inclusive XR), on 5-6 November 2019 in Seattle, WA, USA, to explore existing and future approaches on making Virtual and Augmented Reality experiences more inclusive. Web & Telecommunications The Web is the Open Platform for Mobile. Telecommunication service providers and network equipment providers have long been critical actors in the deployment of Web technologies. As the Web platform matures, it brings richer and richer capabilities to extend existing services to new users and devices, and propose new and innovative services. Real-Time Communications (WebRTC) All Real-Time Communications specifications WebRTC has reshaped the whole communication landscape by making any connected device a potential communication end-point, bringing audio and video communications anywhere, on any network, vastly expanding the ability of operators to reach their customers. WebRTC serves as the corner-stone of many online communication and collaboration services. The WebRTC Working Group aims to bringing WebRTC 1.0 (and companion specification Media Capture and Streams) to Recommendation by the end of 2019. Intense efforts are focused on testing (supported by a dedicated hackathon at IETF 104) and interoperability. The group is considering pushing features that have not gotten enough traction to separate modules or to a later minor revision of the spec. Beyond WebRTC 1.0, the WebRTC Working Group will focus its efforts on WebRTC NV which the group has started documenting by identifying use cases. Web & Networks Recently launched, in the wake of the May 2018 Web5G workshop, the Web & Networks Interest Group is chaired by representatives from AT&T, China Mobile and Intel, with a goal to explore solutions for web applications to achieve better performance and resource allocation, both on the device and network. The group's first efforts are around use cases, privacy & security requirements and liaisons. Automotive All Automotive specifications To create a rich application ecosystem for vehicles and other devices allowed to connect to the vehicle, the W3C Automotive Working Group is delivering a service specification to expose all common vehicle signals (engine temperature, fuel/charge level, range, tire pressure, speed, etc.) The Vehicle Information Service Specification (VISS), which is a Candidate Recommendation, is seeing more implementations across the industry. It provides the access method to a common data model for all the vehicle signals –presently encapsulating a thousand or so different data elements– and will be growing to accommodate the advances in automotive such as autonomous and driver assist technologies and electrification. The group is already working on a successor to VISS, leveraging the underlying data model and the VIWI submission from Volkswagen, for a more robust means of accessing vehicle signals information and the same paradigm for other automotive needs including location-based services, media, notifications and caching content. The Automotive and Web Platform Business Group acts as an incubator for prospective standards work. One of its task forces is using W3C VISS in performing data sampling and off-boarding the information to the cloud. Access to the wealth of information that W3C's auto signals standard exposes is of interest to regulators, urban planners, insurance companies, auto manufacturers, fleet managers and owners, service providers and others. In addition to components needed for data sampling and edge computing, capturing user and owner consent, information collection methods and handling of data are in scope. The upcoming W3C Workshop on Data Models for Transportation (September 2019) is expected to focus on the need of additional ontologies around transportation space. Web of Things All Web of Things specifications W3C's Web of Things work is designed to bridge disparate technology stacks to allow devices to work together and achieve scale, thus enabling the potential of the Internet of Things by eliminating fragmentation and fostering interoperability. Thing descriptions expressed in JSON-LD cover the behavior, interaction affordances, data schema, security configuration, and protocol bindings. The Web of Things complements existing IoT ecosystems to reduce the cost and risk for suppliers and consumers of applications that create value by combining multiple devices and information services. There are many sectors that will benefit, e.g. smart homes, smart cities, smart industry, smart agriculture, smart healthcare and many more. The Web of Things Working Group is finishing the initial Web of Things standards, with support from the Web of Things Interest Group: Web of Things Architecture Thing Descriptions Strengthening the Core of the Web HTML The HTML Working Group was chartered early June to assist the W3C community in raising issues and proposing solutions for the HTML and DOM specifications, and to produce W3C Recommendations from WHATWG Review Drafts. A few days before, W3C and the WHATWG signed a Memorandum of Understanding outlining the agreement to collaborate on the development of a single version of the HTML and DOM specifications. Issues and proposed solutions for HTML and DOM done via the newly rechartered HTML Working Group in the WHATWG repositories The HTML Working Group is targetting November 2019 to bring HTML and DOM to Candidate Recommendations. CSS All CSS specifications CSS is a critical part of the Open Web Platform. The CSS Working Group gathers requirements from two large groups of CSS users: the publishing industry and application developers. Within W3C, those groups are exemplified by the Publishing groups and the Web Platform Working Group. The former requires things like better pagination support and advanced font handling, the latter needs intelligent (and fast!) scrolling and animations. What we know as CSS is actually a collection of almost a hundred specifications, referred to as ‘modules’. The current state of CSS is defined by a snapshot, updated once a year. The group also publishes an index defining every term defined by CSS specifications. Fonts All Fonts specifications The Web Fonts Working Group develops specifications that allow the interoperable deployment of downloadable fonts on the Web, with a focus on Progressive Font Enrichment as well as maintenance of WOFF Recommendations. Recent and ongoing work includes: Early API experiments by Adobe and Monotype have demonstrated the feasibility of a font enrichment API, where a server delivers a font with minimal glyph repertoire and the client can query the full repertoire and request additional subsets on-the-fly. In other experiments, the Brotli compression used in WOFF 2 was extended to support shared dictionaries and patch update. Metrics to quantify improvement are a current hot discussion topic. The group will meet at ATypi 2019 in Japan, to gather requirements from the international typography community. The group will first produce a report summarizing the strengths and weaknesses of each prototype solution by Q2 2020. SVG All SVG specifications SVG is an important and widely-used part of the Open Web Platform. The SVG Working Group focuses on aligning the SVG 2.0 specification with browser implementations, having split the specification into a currently-implemented 2.0 and a forward-looking 2.1. Current activity is on stabilization, increased integration with the Open Web Platform, and test coverage analysis. The Working Group was rechartered in March 2019. A new work item concerns native (non-Web-browser) uses of SVG as a non-interactive, vector graphics format. Audio The Web Audio Working Group was extended to finish its work on the Web Audio API, expecting to publish it as a Recommendation by year end. The specification enables synthesizing audio in the browser. Audio operations are performed with audio nodes, which are linked together to form a modular audio routing graph. Multiple sources — with different types of channel layout — are supported. This modular design provides the flexibility to create complex audio functions with dynamic effects. The first version of Web Audio API is now feature complete and is implemented in all modern browsers. Work has started on the next version, and new features are being incubated in the Audio Community Group. Performance Web Performance All Web Performance specifications There are currently 18 specifications in development in the Web Performance Working Group aiming to provide methods to observe and improve aspects of application performance of user agent features and APIs. The W3C team is looking at related work incubated in the W3C GPU for the Web (WebGPU) Community Group which is poised to transition to a W3C Working Group. A preliminary draft charter is available. WebAssembly All WebAssembly specifications WebAssembly improves Web performance and power by being a virtual machine and execution environment enabling loaded pages to run native (compiled) code. It is deployed in Firefox, Edge, Safari and Chrome. The specification will soon reach Candidate Recommendation. WebAssembly enables near-native performance, optimized load time, and perhaps most importantly, a compilation target for existing code bases. While it has a small number of native types, much of the performance increase relative to Javascript derives from its use of consistent typing. WebAssembly leverages decades of optimization for compiled languages and the byte code is optimized for compactness and streaming (the web page starts executing while the rest of the code downloads). Network and API access all occurs through accompanying Javascript libraries -- the security model is identical to that of Javascript. Requirements gathering and language development occur in the Community Group while the Working Group manages test development, community review and progression of specifications on the Recommendation Track. Testing Browser testing plays a critical role in the growth of the Web by: Improving the reliability of Web technology definitions; Improving the quality of implementations of these technologies by helping vendors to detect bugs in their products; Improving the data available to Web developers on known bugs and deficiencies of Web technologies by publishing results of these tests. Browser Testing and Tools The Browser Testing and Tools Working Group is developing WebDriver version 2, having published last year the W3C Recommendation of WebDriver. WebDriver acts as a remote control interface that enables introspection and control of user agents, provides a platform- and language-neutral wire protocol as a way for out-of-process programs to remotely instruct the behavior of Web, and emulates the actions of a real person using the browser. WebPlatform Tests The WebPlatform Tests project now provides a mechanism which allows to fully automate tests that previously needed to be run manually: TestDriver. TestDriver enables sending trusted key and mouse events, sending complex series of trusted pointer and key interactions for things like in-content drag-and-drop or pinch zoom, and even file upload. Since 2014 W3C began work on this coordinated open-source effort to build a cross-browser test suite for the Web Platform, which WHATWG, and all major browsers adopted. Web of Data All Data specifications There have been several great success stories around the standardization of data on the web over the past year. Verifiable Claims seems to have significant uptake. It is also significant that the Distributed Identifier WG charter has received numerous favorable reviews, and was just recently launched. JSON-LD has been a major success with the large deployment on Web sites via schema.org. JSON-LD 1.1 completed technical work, about to transition to CR More than 25% of websites today include schema.org data in JSON-LD The Web of Things description is in CR since May, making use of JSON-LD Verifiable Credentials data model is in CR since July, also making use of JSON-LD Continued strong interest in decentralized identifiers Engagement from the TAG with reframing core documents, such as Ethical Web Principles, to include data on the web within their scope Data is increasingly important for all organizations, especially with the rise of IoT and Big Data. W3C has a mature and extensive suite of standards relating to data that were developed over two decades of experience, with plans for further work on making it easier for developers to work with graph data and knowledge graphs. Linked Data is about the use of URIs as names for things, the ability to dereference these URIs to get further information and to include links to other data. There are ever-increasing sources of open Linked Data on the Web, as well as data services that are restricted to the suppliers and consumers of those services. The digital transformation of industry is seeking to exploit advanced digital technologies. This will facilitate businesses to integrate horizontally along the supply and value chains, and vertically from the factory floor to the office floor. W3C is seeking to make it easier to support enterprise-wide data management and governance, reflecting the strategic importance of data to modern businesses. Traditional approaches to data have focused on tabular databases (SQL/RDBMS), Comma Separated Value (CSV) files, and data embedded in PDF documents and spreadsheets. We're now in midst of a major shift to graph data with nodes and labeled directed links between them. Graph data is: Faster than using SQL and associated JOIN operations More favorable to integrating data from heterogeneous sources Better suited to situations where the data model is evolving In the wake of the recent W3C Workshop on Graph Data we are in the process of launching a Graph Standardization Business Group to provide a business perspective with use cases and requirements, to coordinate technical standards work and liaisons with external organizations. Web for All Security, Privacy, Identity All Security specifications, all Privacy specifications Authentication on the Web As the WebAuthn Level 1 W3C Recommendation published last March is seeing wide implementation and adoption of strong cryptographic authentication, work is proceeding on Level 2. The open standard Web API gives native authentication technology built into native platforms, browsers, operating systems (including mobile) and hardware, offering protection against hacking, credential theft, phishing attacks, thus aiming to end the era of passwords as a security construct. You may read more in our March press release. Privacy An increasing number of W3C specifications are benefitting from Privacy and Security review; there are security and privacy aspects to every specification. Early review is essential. Working with the TAG, the Privacy Interest Group has updated the Self-Review Questionnaire: Security and Privacy. Other recent work of the group includes public blogging further to the exploration of anti-patterns in standards and permission prompts. Security The Web Application Security Working Group adopted Feature Policy, aiming to allow developers to selectively enable, disable, or modify the behavior of some of these browser features and APIs within their application; and Fetch Metadata, aiming to provide servers with enough information to make a priori decisions about whether or not to service a request based on the way it was made, and the context in which it will be used. The Web Payment Security Interest Group, launched last April, convenes members from W3C, EMVCo, and the FIDO Alliance to discuss cooperative work to enhance the security and interoperability of Web payments (read more about payments). Internationalization (i18n) All Internationalization specifications, educational articles related to Internationalization, spec developers checklist Only a quarter or so current Web users use English online and that proportion will continue to decrease as the Web reaches more and more communities of limited English proficiency. If the Web is to live up to the "World Wide" portion of its name, and for the Web to truly work for stakeholders all around the world engaging with content in various languages, it must support the needs of worldwide users as they engage with content in the various languages. The growth of epublishing also brings requirements for new features and improved typography on the Web. It is important to ensure the needs of local communities are captured. The W3C Internationalization Initiative was set up to increase in-house resources dedicated to accelerating progress in making the World Wide Web "worldwide" by gathering user requirements, supporting developers, and education & outreach. For an overview of current projects see the i18n radar. W3C's Internationalization efforts progressed on a number of fronts recently: Requirements: New African and European language groups will work on the gap analysis, errata and layout requirements. Gap analysis: Japanese, Devanagari, Bengali, Tamil, Lao, Khmer, Javanese, and Ethiopic updated in the gap-analysis documents. Layout requirements document: notable progress tracked in the Southeast Asian Task Force while work continues on Chinese layout requirements. Developer support: Spec reviews: the i18n WG continues active review of specifications of the WHATWG and other W3C Working Groups. Short review checklist: easy way to begin a self-review to help spec developers understand what aspects of their spec are likely to need attention for internationalization, and points them to more detailed checklists for the relevant topics. It also helps those reviewing specs for i18n issues. Strings on the Web: Language and Direction Metadata lays out issues and discusses potential solutions for passing information about language and direction with strings in JSON or other data formats. The document was rewritten for clarity, and expanded. The group is collaborating with the JSON-LD and Web Publishing groups to develop a plan for updating RDF, JSON-LD and related specifications to handle metadata for base direction of text (bidi). User-friendly test format: a new format was developed for Internationalization Test Suite tests, which displays helpful information about how the test works. This particularly useful because those tests are pointed to by educational materials and gap-analysis documents. Web Platform Tests: a large number of tests in the i18n test suite have been ported to the WPT repository, including: css-counter-styles, css-ruby, css-syntax, css-test, css-text-decor, css-writing-modes, and css-pseudo. Education & outreach: (for all educational materials, see the HTML & CSS Authoring Techniques) Web Accessibility All Accessibility specifications, WAI resources The Web Accessibility Initiative supports W3C's Web for All mission. Recent achievements include: Education and training: Inaccessibility of CAPTCHA updated to bring our analysis and recommendations up to date with CAPTCHA practice today, concluding two years of extensive work and invaluable input from the public (read more on the W3C Blog Learn why your web content and applications should be accessible. The Education and Outreach Working Group has completed revision and updating of the Business Case for Digital Accessibility. Accessibility guidelines: The Accessibility Guidelines Working Group has continued to update WCAG Techniques and Understanding WCAG 2.1; and published a Candidate Recommendation of Accessibility Conformance Testing Rules Format 1.0 to improve inter-rater reliability when evaluating conformance of web content to WCAG An updated charter is being developed to host work on "Silver", the next generation accessibility guidelines (WCAG 2.2) There are accessibility aspects to most specifications. Check your work with the FAST checklist. Outreach to the world W3C Developer Relations To foster the excellent feedback loop between Web Standards development and Web developers, and to grow participation from that diverse community, recent W3C Developer Relations activities include: @w3cdevs tracks the enormous amount of work happening across W3C W3C Track during the Web Conference 2019 in San Francisco Tech videos: W3C published the 2019 Web Games Workshop videos The 16 September 2019 Developer Meetup in Fukuoka, Japan, is open to all and will combine a set of technical demos prepared by W3C groups, and a series of talks on a selected set of W3C technologies and projects W3C is involved with Mozilla, Google, Samsung, Microsoft and Bocoup in the organization of ViewSource 2019 in Amsterdam (read more on the W3C Blog) W3C Training In partnership with EdX, W3C's MOOC training program, W3Cx offers a complete "Front-End Web Developer" (FEWD) professional certificate program that consists of a suite of five courses on the foundational languages that power the Web: HTML5, CSS and JavaScript. We count nearly 900K students from all over the world. Translations Many Web users rely on translations of documents developed at W3C whose official language is English. W3C is extremely grateful to the continuous efforts of its community in ensuring our various deliverables in general, and in our specifications in particular, are made available in other languages, for free, ensuring their exposure to a much more diverse set of readers. Last Spring we developed a more robust system, a new listing of translations of W3C specifications and updated the instructions on how to contribute to our translation efforts. W3C Liaisons Liaisons and coordination with numerous organizations and Standards Development Organizations (SDOs) is crucial for W3C to: make sure standards are interoperable coordinate our respective agenda in Internet governance: W3C participates in ICANN, GIPO, IGF, the I* organizations (ICANN, IETF, ISOC, IAB). ensure at the government liaison level that our standards work is officially recognized when important to our membership so that products based on them (often done by our members) are part of procurement orders. W3C has ARO/PAS status with ISO. W3C participates in the EU MSP and Rolling Plan on Standardization ensure the global set of Web and Internet standards form a compatible stack of technologies, at the technical and policy level (patent regime, fragmentation, use in policy making) promote Standards adoption equally by the industry, the public sector, and the public at large Coralie Mercier, Editor, W3C Marketing & Communications $Id: Overview.html,v 1.60 2019/10/15 12:05:52 coralie Exp $ Copyright © 2019 W3C ® (MIT, ERCIM, Keio, Beihang) Usage policies apply.
klonnet23
{ "releases": { "2.0.4": [ "[Fixed] Refresh for Enterprise repositories did not handle API error querying branches - #7713", "[Fixed] Missing \"Discard all changes\" context menu in Changes header - #7696", "[Fixed] \"Select all\" keyboard shortcut not firing on Windows - #7759" ], "2.0.4-beta1": [ "[Fixed] Refresh for Enterprise repositories did not handle API error querying branches - #7713", "[Fixed] Missing \"Discard all changes\" context menu in Changes header - #7696", "[Fixed] \"Select all\" keyboard shortcut not firing on Windows - #7759" ], "2.0.4-beta0": [ "[Added] Extend crash reports with more information about application state for troubleshooting - #7693", "[Fixed] Crash when attempting to update pull requests with partially updated repository information - #7688", "[Fixed] Crash when loading repositories after signing in through the welcome flow - #7699" ], "2.0.3": [ "[Fixed] Crash when loading repositories after signing in through the welcome flow - #7699" ], "2.0.2": [ "[Added] Extend crash reports with more information about application state for troubleshooting - #7693" ], "2.0.1": [ "[Fixed] Crash when attempting to update pull requests with partially updated repository information - #7688" ], "2.0.0": [ "[New] You can now choose to bring your changes with you to a new branch or stash them on the current branch when switching branches - #6107", "[New] Rebase your current branch onto another branch using a guided flow - #5953", "[New] Repositories grouped by owner, and recent repositories listed at top - #6923 #7132", "[New] Suggested next steps now includes suggestion to create a pull request after publishing a branch - #7505", "[Added] .resx syntax highlighting - #7235. Thanks @say25!", "[Added] \"Exit\" menu item now has accelerator and access key - #6507. Thanks @AndreiMaga!", "[Added] Help menu entry to view documentation about keyboard shortcuts - #7184", "[Added] \"Discard all changes\" action under Branch menu - #7394. Thanks @ahuth!", "[Fixed] \"Esc\" key does not close Repository or Branch list - #7177. Thanks @roottool!", "[Fixed] Attempting to revert commits not on current branch results in an error - #6300. Thanks @msftrncs!", "[Fixed] Emoji rendering in app when account name has special characters - #6909", "[Fixed] Files staged outside Desktop for deletion are incorrectly marked as modified after committing - #4133", "[Fixed] Horizontal scroll bar appears unnecessarily when switching branches - #7212", "[Fixed] Icon accessibility labels fail when multiple icons are visible at the same time - #7174", "[Fixed] Incorrectly encoding URLs affects issue filtering - #7506", "[Fixed] License templates do not end with newline character - #6999", "[Fixed] Conflicts banners do not hide after aborting operation outside Desktop - #7046", "[Fixed] Missing tooltips for change indicators in the sidebar - #7174", "[Fixed] Mistaken classification of all crashes being related to launch - #7126", "[Fixed] Unable to switch keyboard layout and retain keyboard focus while using commit form - #6366. Thanks @AndreiMaga!", "[Fixed] Prevent console errors due to underlying component unmounts - #6970", "[Fixed] Menus disabled by activity in inactive repositories - #6313", "[Fixed] Race condition with Git remote lookup may cause push to incorrect remote - #6986", "[Fixed] Restore GitHub Desktop to main screen if external monitor removed - #7418 #2107. Thanks @say25!", "[Fixed] Tab Bar focus ring outlines clip into other elements - #5802. Thanks @Daniel-McCarthy!", "[Improved] \"Automatically Switch Theme\" on macOS checks theme on launch - #7116. Thanks @say25!", "[Improved] \"Add\" button in repository list should always be visible - #6646", "[Improved] Pull Requests list loads and updates pull requests from GitHub more quickly - #7501 #7163", "[Improved] Indicator hidden in Pull Requests list when there are no open pull requests - #7258", "[Improved] Manually refresh pull requests instead of having to wait for a fetch - #7027", "[Improved] Accessibility attributes for dialog - #6496. Thanks @HirdayGupta!", "[Improved] Alignment of icons in repository list - #7133", "[Improved] Command line interface warning when using \"github open\" with a remote URL - #7452. Thanks @msztech!", "[Improved] Error message when unable to publish private repository to an organization - #7472", "[Improved] Initiate cloning by pressing \"Enter\" when a repository is selected - #6570. Thanks @Daniel-McCarthy!", "[Improved] Lowercase pronoun in \"Revert this commit\" menu item - #7534", "[Improved] Styles for manual resolution button in \"Resolve Conflicts\" dialog - #7302", "[Improved] Onboarding language for blank slate components - #6638. Thanks @jamesgeorge007!", "[Improved] Explanation for manually conflicted text files in diff viewer - #7611", "[Improved] Visual progress on \"Remove Repository\" and \"Discard Changes\" dialogs - #7015. Thanks @HashimotoYT!", "[Improved] Menu items now aware of force push state and preference to confirm repository removal - #4976 #7138", "[Removed] Branch and pull request filter text persistence - #7437", "[Removed] \"Discard all changes\" context menu item from Changes list - #7394. Thanks @ahuth!" ], "1.7.1-beta1": [ "[Fixed] Tab Bar focus ring outlines clip into other elements - #5802. Thanks @Daniel-McCarthy!", "[Improved] Show explanation for manually conflicted text files in diff viewer - #7611", "[Improved] Alignment of entries in repository list - #7133" ], "1.7.0-beta9": [ "[Fixed] Add warning when renaming a branch with a stash - #7283", "[Fixed] Restore Desktop to main screen when external monitor removed - #7418 #2107. Thanks @say25!", "[Improved] Performance for bringing uncommitted changes to another branch - #7474" ], "1.7.0-beta8": [ "[Added] Accelerator and access key to \"Exit\" menu item - #6507. Thanks @AndreiMaga!", "[Fixed] Pressing \"Shift\" + \"Alt\" in Commit summary moves input-focus to app menu - #6366. Thanks @AndreiMaga!", "[Fixed] Incorrectly encoding URLs affects issue filtering - #7506", "[Improved] Command line interface warns with helpful message when given a remote URL - #7452. Thanks @msztech!", "[Improved] Lowercase pronoun in \"Revert this commit\" menu item - #7534", "[Improved] \"Pull Requests\" list reflects pull requests from GitHub more quickly - #7501", "[Removed] Branch and pull request filter text persistence - #7437" ], "1.7.0-beta7": [ "[Improved] Error message when unable to publish private repository to an organization - #7472", "[Improved] \"Stashed changes\" button accessibility improvements - #7274", "[Improved] Performance improvements for bringing changes to another branch - #7471", "[Improved] Performance improvements for detecting conflicts from a restored stash - #7476" ], "1.7.0-beta6": [ "[Fixed] Stash viewer does not disable restore button when changes present - #7409", "[Fixed] Stash viewer does not center \"no content\" text - #7299", "[Fixed] Stash viewer pane width not remembered between sessions - #7416", "[Fixed] \"Esc\" key does not close Repository or Branch list - #7177. Thanks @roottool!", "[Fixed] Stash not cleaned up when it conflicts with working directory contents - #7383", "[Improved] Branch names remain accurate in dialog when stashing and switching branches - #7402", "[Improved] Moved \"Discard all changes\" to Branch menu to prevent unintentionally discarding all changes - #7394. Thanks @ahuth!", "[Improved] UI responsiveness when using keyboard to choose branch in rebase flow - #7407" ], "1.7.0-beta5": [ "[Fixed] Handle warnings if stash creation encounters file permission issue - #7351", "[Fixed] Add \"View stash entry\" action to suggested next steps - #7353", "[Fixed] Handle and recover from failed rebase flow starts - #7223", "[Fixed] Reverse button order when viewing a stash on macOS - #7273", "[Fixed] Prevent console errors due to underlying component unmounts - #6970", "[Fixed] Rebase success banner always includes base branch name - #7220", "[Improved] Added explanatory text for \"Restore\" button for stashes - #7303", "[Improved] Ask for confirmation before discarding stash - #7348", "[Improved] Order stashed changes files alphabetically - #7327", "[Improved] Clarify \"Overwrite Stash Confirmation\" dialog text - #7361", "[Improved] Message shown in rebase setup when target branch is already rebased - #7343", "[Improved] Update stashing prompt verbiage - #7393.", "[Improved] Update \"Start Rebase\" dialog verbiage - #7391", "[Improved] Changes list now reflects what will be committed when handling rebase conflicts - #7006" ], "1.7.0-beta4": [ "[Fixed] Manual conflict resolution choice not updated when resolving rebase conflicts - #7255", "[Fixed] Menu items don't display the expected verbiage for force push and removing a repository - #4976 #7138" ], "1.7.0-beta3": [ "[New] Users can choose to bring changes with them to a new branch or stash them on the current branch when switching branches - #6107", "[Added] GitHub Desktop keyboard shortcuts available in Help menu - #7184", "[Added] .resx file extension highlighting support - #7235. Thanks @say25!", "[Fixed] Attempting to revert commits not on current branch results in an error - #6300. Thanks @msftrncs!", "[Improved] Warn users before rebase if operation will require a force push after rebase complete - #6963", "[Improved] Do not show the number of pull requests when there are no open pull requests - #7258", "[Improved] Accessibility attributes for dialog - #6496. Thanks @HirdayGupta!", "[Improved] Initiate cloning by pressing \"Enter\" when a repository is selected - #6570. Thanks @Daniel-McCarthy!", "[Improved] Manual Conflicts button styling - #7302", "[Improved] \"Add\" button in repository list should always be visible - #6646" ], "1.7.0-beta2": [ "[New] Rebase your current branch onto another branch using a guided flow - #5953", "[Fixed] Horizontal scroll bar appears unnecessarily when switching branches - #7212", "[Fixed] License templates do not end with newline character - #6999", "[Fixed] Merge/Rebase conflicts banners do not clear when aborting the operation outside Desktop - #7046", "[Fixed] Missing tooltips for change indicators in the sidebar - #7174", "[Fixed] Icon accessibility labels fail when multiple icons are visible at the same time - #7174", "[Improved] Pull requests load faster and PR build status updates automatically - #7163" ], "1.7.0-beta1": [ "[New] Recently opened repositories appear at the top of the repository list - #7132", "[Fixed] Error when selecting diff text while diff is updating - #7131", "[Fixed] Crash when unable to create log file on disk - #7096", "[Fixed] Race condition with remote lookup could cause push to go to incorrect remote - #6986", "[Fixed] Mistaken classification of all crashes being related to launch - #7126", "[Fixed] Prevent menus from being disabled by activity in inactive repositories - #6313", "[Fixed] \"Automatically Switch Theme\" on macOS does not check theme on launch - #7116. Thanks @say25!", "[Fixed] Clicking \"Undo\" doesn't repopulate summary in commit form - #6390. Thanks @humphd!", "[Fixed] Emoji rendering in app broken when account name has special characters - #6909", "[Fixed] Files staged outside Desktop for deletion are incorrectly marked as modified after committing - #4133", "[Improved] Visual feedback on \"Remove Repository\" and \"Discard Changes\" dialogs to show progress - #7015. Thanks @HashimotoYT!", "[Improved] Onboarding language for blank slate components - #6638. Thanks @jamesgeorge007!", "[Improved] Manually refresh pull requests instead of having to wait for a fetch - #7027" ], "1.6.6": [ "[Fixed] Clicking \"Undo\" doesn't repopulate summary in commit form - #6390. Thanks @humphd!", "[Fixed] Handle error when unable to create log file for app - #7096", "[Fixed] Crash when selecting text while the underlying diff changes - #7131" ], "1.6.6-test1": [ "[Fixed] Clicking \"Undo\" doesn't repopulate summary in commit form - #6390. Thanks @humphd!", "[Fixed] Handle error when unable to create log file for app - #7096", "[Fixed] Crash when selecting text while the underlying diff changes - #7131" ], "1.6.5": [ "[Fixed] Publish Repository does not let you publish to an organization on your Enterprise account - #7052" ], "1.6.5-beta2": [ "[Fixed] Publish Repository does not let you choose an organization on your Enterprise account - #7052" ], "1.6.5-beta1": [ "[Fixed] Publish Repository does not let you choose an organization on your Enterprise account - #7052" ], "1.6.4": [ "[Fixed] Embedded Git not working for core.longpath usage in some environments - #7028", "[Fixed] \"Recover missing repository\" can get stuck in a loop - #7038" ], "1.6.4-beta1": [ "[Fixed] Embedded Git not working for core.longpath usage in some environments - #7028", "[Fixed] \"Recover missing repository\" can get stuck in a loop - #7038" ], "1.6.4-beta0": [ "[Removed] Option to discard when files would be overwritten by a checkout - #7016" ], "1.6.3": [ "[New] Display \"pull with rebase\" if a user has set this option in their Git config - #6553 #3422", "[Fixed] Context menu does not open when right clicking on the edges of files in Changes list - #6296. Thanks @JQuinnie!", "[Fixed] Display question mark in image when no commit selected in dark theme - #6915. Thanks @say25!", "[Fixed] No left padding for :emoji:/@user/#issue autocomplete forms. - #6895. Thanks @murrelljenna!", "[Fixed] Reinstate missing image and update illustration in dark theme when no local changes exist - #6894", "[Fixed] Resizing the diff area preserves text selection range - #2677", "[Fixed] Text selection in wrapped diff lines now allows selection of individual lines - #1551", "[Improved] Add option to fetch when a user needs to pull changes from the remote before pushing - #2738 #5451", "[Improved] Enable Git protocol v2 for fetch/push/pull operations - #6142", "[Improved] Moving mouse pointer outside visible diff while selecting a range of lines in a partial commit now automatically scrolls the diff - #658", "[Improved] Sign in form validates both username and password - #6952. Thanks @say25!", "[Improved] Update GitHub logo in \"About\" dialog - #5619. Thanks @HashimotoYT!" ], "1.6.3-beta4": [ "[Improved] Update GitHub logo in \"About\" dialog - #5619. Thanks @HashimotoYT!", "[Improved] Sign in form validates both username and password - #6952. Thanks @say25!" ], "1.6.3-beta3": [ "[New] Display \"pull with rebase\" if a user has set this option in their Git config - #6553 #3422", "[Added] Provide option to discard when files would be overwritten by a checkout - #6755. Thanks @mathieudutour!", "[Fixed] No left padding for :emoji:/@user/#issue autocomplete forms. - #6895. Thanks @murrelljenna!", "[Fixed] Reinstate missing image and fix illustration to work in the dark theme when there are no local changes - #6894", "[Fixed] Display question mark image when there is no commit selected in dark theme - #6915. Thanks @say25!", "[Improved] Group and filter repositories by owner - #6923", "[Improved] Add option to fetch when a user needs to pull changes from the remote before pushing - #2738 #5451" ], "1.6.3-beta2": [ "[Fixed] Text selection in wrapped diff lines now allows selection of individual lines - #1551", "[Fixed] Resizing the diff area preserves text selection range - #2677", "[Improved] Moving the mouse pointer outside of the visible diff while selecting a range of lines in a partial commit will now automatically scroll the diff - #658" ], "1.6.3-beta1": [ "[New] Branches that have been merged and deleted on GitHub.com will now be pruned after two weeks - #750", "[Fixed] Context menu doesn't open when right clicking on the edges of files in Changes list - #6296. Thanks @JQuinnie!", "[Improved] Enable Git protocol v2 for fetch/push/pull operations - #6142", "[Improved] Upgrade to Electron v3 - #6391" ], "1.6.2": [ "[Added] Allow users to also resolve manual conflicts when resolving merge conflicts - #6062", "[Added] Automatic switching between Dark and Light modes on macOS - #5037. Thanks @say25!", "[Added] Crystal and Julia syntax highlighting - #6710. Thanks @KennethSweezy!", "[Added] Lua and Fortran syntax highlighting - #6700. Thanks @SimpleBinary!", "[Fixed] Abbreviated commits are not long enough for large repositories - #6662. Thanks @say25!", "[Fixed] App menu bar visible on hover on Windows when in \"Let’s get started\" mode - #6669", "[Fixed] Fix pointy corners on commit message text area - #6635. Thanks @lisavogtsf!", "[Fixed] Inconsistent \"Reveal in …\" labels for context menus - #6466. Thanks @say25!", "[Fixed] Merge conflict conflict did not ask user to resolve some binary files - #6693", "[Fixed] Prevent concurrent fetches between user and status indicator checks - #6121 #5438 #5328", "[Fixed] Remember scroll positions in History and Changes lists - #5177 #5059. Thanks @Daniel-McCarthy!", "[Improved] Guided merge conflict resolution only commits changes relevant to the merge - #6349", "[Improved] Use higher contrast color for links in \"Merge Conflicts\" dialog - #6758", "[Improved] Add link to all release notes in Release Notes dialog - #6443. Thanks @koralcem!", "[Improved] Arrow for renamed/copied changes when viewing commit - #6519. Thanks @koralcem!", "[Improved] Updated verbiage for ignoring the files - #6689. Thanks @PaulViola!" ], "1.6.2-beta3": [ "[Improved] Guided merge conflict resolution only commits changes relevant to the merge - #6349" ], "1.6.2-beta2": [ "[Added] Allow users to also resolve manual conflicts when resolving merge conflicts - #6062", "[Added] Crystal and Julia syntax highlighting - #6710. Thanks @KennethSweezy!", "[Fixed] Fix pointy corners on commit message text area - #6635. Thanks @lisavogtsf!", "[Fixed] Use higher contrast color for links in \"Merge Conflicts\" dialog - #6758" ], "1.6.2-beta1": [ "[Added] Automatic switching between Dark and Light modes on macOS - #5037. Thanks @say25!", "[Added] Lua and Fortran syntax highlighting - #6700. Thanks @SimpleBinary!", "[Fixed] Abbreviated commits are not long enough for large repositories - #6662. Thanks @say25!", "[Fixed] App menu bar visible on hover on Windows when in \"Let’s get started\" mode - #6669", "[Fixed] Remember scroll positions in History and Changes lists - #5177 #5059. Thanks @Daniel-McCarthy!", "[Fixed] Inconsistent \"Reveal in …\" labels for context menus - #6466. Thanks @say25!", "[Fixed] Prevent concurrent fetches between user and status indicator checks - #6121 #5438 #5328", "[Fixed] Merge conflict conflict did not ask user to resolve some binary files - #6693", "[Improved] Add link to all release notes in Release Notes dialog - #6443. Thanks @koralcem!", "[Improved] Arrow for renamed/copied changes when viewing commit - #6519. Thanks @koralcem!", "[Improved] Menu state updating to address race condition - #6643", "[Improved] Updated verbiage when clicking on changed files to make it more explicit what will occur when you ignore the file(s) - #6689. Thanks @PaulViola!" ], "1.6.2-beta0": [ "[Fixed] Don't show \"No local changes\" view when switching between changed files" ], "1.6.1": [ "[Fixed] Don't show \"No local changes\" view when switching between changed files" ], "1.6.0": [ "[New] Help users add their first repo during onboarding - #6474", "[New] \"No local changes\" view helpfully suggests next actions for you to take - #6445", "[Added] Support JetBrains Webstorm as an external editor - #6077. Thanks @KennethSweezy!", "[Added] Add Visual Basic syntax highlighting - #6461. Thanks @SimpleBinary!", "[Fixed] Automatically locate a missing repository when it cannot be found - #6228. Thanks @msftrncs!", "[Fixed] Don't include untracked files in merge commit - #6411", "[Fixed] Don't show \"Still Conflicted Warning\" when all conflicts are resolved - #6451", "[Fixed] Only execute menu action a single time upon hitting Enter - #5344", "[Fixed] Show autocompletion of GitHub handles and issues properly in commit description field - #6459", "[Improved] Repository list when no repositories found - #5566 #6474", "[Improved] Image diff menu no longer covered by large images - #6520. Thanks @06b!", "[Improved] Enable additional actions during a merge conflict - #6385", "[Improved] Increase contrast on input placeholder color in dark mode - #6556", "[Improved] Don't show merge success banner when attempted merge doesn't complete - #6282", "[Improved] Capitalize menu items appropriately on macOS - #6469" ], "1.6.0-beta3": [ "[Fixed] Autocomplete selection does not overflow text area - #6459", "[Fixed] No local changes views incorrectly rendering ampersands - #6596", "[Improved] Capitalization of menu items on macOS - #6469" ], "1.6.0-beta2": [ "[New] \"No local changes\" view makes it easy to find and accomplish common actions - #6445", "[Fixed] Automatically locate a missing repository when it cannot be found - #6228. Thanks @msftrncs!", "[Improved] Enable additional actions during a merge conflict - #6385", "[Improved] Increase contrast on input placeholder color in dark mode - #6556", "[Improved] Merge success banner no longer shown when attempted merge doesn't complete - #6282" ], "1.6.0-beta1": [ "[New] Help users add their first repo during onboarding - #6474", "[Added] Include ability for users to add new repositories when there are none available - #5566 #6474", "[Added] Support JetBrains Webstorm as an external editor - #6077. Thanks @KennethSweezy!", "[Added] Add Visual Basic syntax highlighting - #6461. Thanks @SimpleBinary!", "[Fixed] Don't include untracked files in merge commit - #6411", "[Fixed] Don't show \"Still Conflicted Warning\" when all conflicts are resolved - #6451", "[Fixed] Enter when using keyboard to navigate app menu executed menu action twice - #5344", "[Improved] Image diff menu no longer covered by large images - #6520. Thanks @06b!" ], "1.5.2-beta0": [], "1.5.1": [ "[Added] Provide keyboard shortcut for getting to commit summary field - #1719. Thanks @bruncun!", "[Added] Add hover states on list items and tabs - #6310", "[Added] Add Dockerfile syntax highlighting - #4533. Thanks @say25!", "[Added] Support Visual SlickEdit as an external editor - #6029. Thanks @texasaggie97!", "[Fixed] Allow repositories to be cloned to empty folders - #5857. Thanks @Daniel-McCarthy!", "[Fixed] Prevent creating branch with detached HEAD from reverting to default branch - #6085", "[Fixed] Fix \"Open In External Editor\" for Atom/VS Code on Windows when paths contain spaces - #6181. Thanks @msftrncs!", "[Fixed] Persist Branch List and Pull Request List filter text - #6002. Thanks @Daniel-McCarthy!", "[Fixed] Retain renamed branches position in recent branches list - #6155. Thanks @gnehcc!", "[Fixed] Prevent avatar duplication when user is co-author and committer - #6135. Thanks @bblarney!", "[Fixed] Provide keyboard selection for the \"Clone a Repository\" dialog - #3596. Thanks @a-golovanov!", "[Fixed] Close License & Open Source Notices dialog upon pressing \"Enter\" in dialog - #6137. Thanks @bblarney!", "[Fixed] Dismiss \"Merge into Branch\" dialog with escape key - #6154. Thanks @altaf933!", "[Fixed] Focus branch selector when comparing to branch from menu - #5600", "[Fixed] Reverse fold/unfold icons for expand/collapse commit summary - #6196. Thanks @HazemAM!", "[Improved] Allow toggling between diff modes - #6231. Thanks @06b!", "[Improved] Show focus around full input field - #6234. Thanks @seokju-na!", "[Improved] Make lists scroll to bring selected items into view - #6279", "[Improved] Consistently order the options for adding a repository - #6396. Thanks @vilanz!", "[Improved] Clear merge conflicts banner after there are no more conflicted files - #6428" ], "1.5.1-beta6": [ "[Improved] Consistently order the options for adding a repository - #6396. Thanks @vilanz!", "[Improved] Clear merge conflicts banner after there are no more conflicted files - #6428" ], "1.5.1-beta5": [ "[Improved] Commit conflicted files warning - #6381", "[Improved] Dismissable merge conflict dialog and associated banner - #6379 #6380", "[Fixed] Fix feature flag for readme overwrite warning so that it shows on beta - #6412" ], "1.5.1-beta4": [ "[Improved] Display warning if existing readme file will be overwritten - #6338. Thanks @Daniel-McCarthy!", "[Improved] Add check for attempts to commit >100 MB files without Git LFS - #997. Thanks @Daniel-McCarthy!", "[Improved] Merge conflicts dialog visual updates - #6377" ], "1.5.1-beta3": [ "[Improved] Maintains state on tabs for different methods of cloning repositories - #5937" ], "1.5.1-beta2": [ "[Improved] Clarified internal documentation - #6348. Thanks @bblarney!" ], "1.5.1-beta1": [ "[Added] Provide keyboard shortcut for getting to commit summary field - #1719. Thanks @bruncun!", "[Added] Add hover states on list items and tabs - #6310", "[Added] Add Dockerfile syntax highlighting - #4533. Thanks @say25!", "[Added] Support Visual SlickEdit as an external editor - #6029. Thanks @texasaggie97!", "[Improved] Allow toggling between diff modes - #6231. Thanks @06b!", "[Improved] Show focus around full input field - #6234. Thanks @seokju-na!", "[Improved] Make lists scroll to bring selected items into view - #6279", "[Fixed] Allow repositories to be cloned to empty folders - #5857. Thanks @Daniel-McCarthy!", "[Fixed] Prevent creating branch with detached HEAD from reverting to default branch - #6085", "[Fixed] Fix 'Open In External Editor' for Atom/VS Code on Windows when paths contain spaces - #6181. Thanks @msftrncs!", "[Fixed] Persist Branch List and Pull Request List filter text - #6002. Thanks @Daniel-McCarthy!", "[Fixed] Retain renamed branches position in recent branches list - #6155. Thanks @gnehcc!", "[Fixed] Prevent avatar duplication when user is co-author and committer - #6135. Thanks @bblarney!", "[Fixed] Provide keyboard selection for the ‘Clone a Repository’ dialog - #3596. Thanks @a-golovanov!", "[Fixed] Close License & Open Source Notices dialog upon pressing \"Enter\" in dialog - #6137. Thanks @bblarney!", "[Fixed] Dismiss \"Merge into Branch\" dialog with escape key - #6154. Thanks @altaf933!", "[Fixed] Focus branch selector when comparing to branch from menu - #5600", "[Fixed] Reverse fold/unfold icons for expand/collapse commit summary - #6196. Thanks @HazemAM!" ], "1.5.1-beta0": [], "1.5.0": [ "[New] Clone, create, or add repositories right from the repository dropdown - #5878", "[New] Drag-and-drop to add local repositories from macOS tray icon - #5048", "[Added] Resolve merge conflicts through a guided flow - #5400", "[Added] Allow merging branches directly from branch dropdown - #5929. Thanks @bruncun!", "[Added] Commit file list now has \"Copy File Path\" context menu action - #2944. Thanks @Amabel!", "[Added] Keyboard shortcut for \"Rename Branch\" menu item - #5964. Thanks @agisilaos!", "[Added] Notify users when a merge is successfully completed - #5851", "[Fixed] \"Compare on GitHub\" menu item enabled when no repository is selected - #6078", "[Fixed] Diff viewer blocks keyboard navigation using reverse tab order - #2794", "[Fixed] Launching Desktop from browser always asks to clone repository - #5913", "[Fixed] Publish dialog displayed on push when repository is already published - #5936", "[Improved] \"Publish Repository\" dialog handles emoji characters - #5980. Thanks @WaleedAshraf!", "[Improved] Avoid repository checks when no path is specified in \"Create Repository\" dialog - #5828. Thanks @JakeHL!", "[Improved] Clarify the direction of merging branches - #5930. Thanks @JQuinnie!", "[Improved] Default commit summary more explanatory and consistent with GitHub.com - #6017. Thanks @Daniel-McCarthy!", "[Improved] Display a more informative message on merge dialog when branch is up to date - #5890", "[Improved] Getting a repository's status only blocks other operations when absolutely necessary - #5952", "[Improved] Display current branch in header of merge dialog - #6027", "[Improved] Sanitize repository name before publishing to GitHub - #3090. Thanks @Daniel-McCarthy!", "[Improved] Show the branch name in \"Update From Default Branch\" menu item - #3018. Thanks @a-golovanov!", "[Improved] Update license and .gitignore templates for initializing a new repository - #6024. Thanks @say25!" ], "1.5.0-beta5": [], "1.5.0-beta4": [ "[Fixed] \"Compare on GitHub\" menu item enabled when no repository is selected - #6078", "[Fixed] Diff viewer blocks keyboard navigation using reverse tab order - #2794", "[Improved] \"Publish Repository\" dialog handles emoji characters - #5980. Thanks @WaleedAshraf!" ], "1.5.0-beta3": [], "1.5.0-beta2": [ "[Added] Resolve merge conflicts through a guided flow - #5400", "[Added] Notify users when a merge is successfully completed - #5851", "[Added] Allow merging branches directly from branch dropdown - #5929. Thanks @bruncun!", "[Improved] Merge dialog displays current branch in header - #6027", "[Improved] Clarify the direction of merging branches - #5930. Thanks @JQuinnie!", "[Improved] Show the branch name in \"Update From Default Branch\" menu item - #3018. Thanks @a-golovanov!", "[Improved] Default commit summary more explanatory and consistent with GitHub.com - #6017. Thanks @Daniel-McCarthy!", "[Improved] Updated license and .gitignore templates for initializing a new repository - #6024. Thanks @say25!" ], "1.5.0-beta1": [ "[New] Repository switcher has a convenient \"Add\" button to add other repositories - #5878", "[New] macOS tray icon now supports drag-and-drop to add local repositories - #5048", "[Added] Keyboard shortcut for \"Rename Branch\" menu item - #5964. Thanks @agisilaos!", "[Added] Commit file list now has \"Copy File Path\" context menu action - #2944. Thanks @Amabel!", "[Fixed] Launching Desktop from browser always asks to clone repository - #5913", "[Fixed] Publish dialog displayed on push when repository is already published - #5936", "[Improved] Sanitize repository name before publishing to GitHub - #3090. Thanks @Daniel-McCarthy!", "[Improved] Getting a repository's status only blocks other operations when absolutely necessary - #5952", "[Improved] Avoid repository checks when no path is specified in \"Create Repository\" dialog - #5828. Thanks @JakeHL!", "[Improved] Display a more informative message on merge dialog when branch is up to date - #5890" ], "1.4.4-beta0": [], "1.4.3": [ "[Added] Add \"Remove Repository\" keyboard shortcut - #5848. Thanks @say25!", "[Added] Add keyboard shortcut to delete a branch - #5018. Thanks @JakeHL!", "[Fixed] Emoji autocomplete not rendering in some situations - #5859", "[Fixed] Release notes text overflowing dialog box - #5854. Thanks @amarsiingh!", "[Improved] Support Python 3 in Desktop CLI on macOS - #5843. Thanks @munir131!", "[Improved] Avoid unnecessarily reloading commit history - #5470", "[Improved] Publish Branch dialog will publish commits when pressing Enter - #5777. Thanks @JKirkYuan!" ], "1.4.3-beta2": [ "[Added] Added keyboard shortcut to delete a branch - #5018. Thanks @JakeHL!", "[Fixed] Fix release notes text overflowing dialog box - #5854. Thanks @amarsiingh!", "[Improved] Avoid unnecessarily reloading commit history - #5470" ], "1.4.3-beta1": [ "[Added] Add \"Remove Repository\" keyboard shortcut - #5848. Thanks @say25!", "[Fixed] Fix emoji autocomplete not rendering in some situations - #5859", "[Fixed] Support Python 3 in Desktop CLI on macOS - #5843. Thanks @munir131!", "[Improved] Publish Branch dialog will publish commits when pressing Enter - #5777. Thanks @JKirkYuan!" ], "1.4.3-beta0": [], "1.4.2": [ "[New] Show resolved conflicts as resolved in Changes pane - #5609", "[Added] Add Terminator, MATE Terminal, and Terminology shells - #5753. Thanks @joaomlneto!", "[Fixed] Update embedded Git to version 2.19.1 for security vulnerability fix", "[Fixed] Always show commit history list when History tab is clicked - #5783. Thanks @JKirkYuan!", "[Fixed] Stop overriding the protocol of a detected GitHub repository - #5721", "[Fixed] Update sign in error message - #5766. Thanks @tiagodenoronha!", "[Fixed] Correct overflowing T&C and License Notices dialogs - #5756. Thanks @amarsiingh!", "[Improved] Add default commit message for single-file commits - #5240. Thanks @lean257!", "[Improved] Refresh commit list faster after reverting commit via UI - #5752", "[Improved] Add repository path to Remove repository dialog - #5805. Thanks @NickCraver!", "[Improved] Display whether user entered incorrect username or email address - #5775. Thanks @tiagodenoronha!", "[Improved] Update Discard Changes dialog text when discarding all changes - #5744. Thanks @Daniel-McCarthy!" ], "1.4.2-beta0": [], "1.4.1-test2": [ "Testing changes to how Desktop performs CI platform checks" ], "1.4.1-test1": [ "Testing changes to how Desktop performs CI platform checks" ], "1.4.1": [ "[Added] Support for opening repository in Cygwin terminal - #5654. Thanks @LordOfTheThunder!", "[Fixed] 'Compare to Branch' menu item not disabled when modal is open - #5673. Thanks @kanishk98!", "[Fixed] Co-author form does not show/hide for newly-added repository - #5490", "[Fixed] Desktop command line always suffixes `.git` to URL when starting a clone - #5529. Thanks @j-f1!", "[Fixed] Dialog styling issue for dark theme users on Windows - #5629. Thanks @cwongmath!", "[Fixed] No message shown when filter returns no results in Clone Repository view - #5637. Thanks @DanielHix!", "[Improved] Branch names cannot start with a '+' character - #5594. Thanks @Daniel-McCarthy!", "[Improved] Clone dialog re-runs filesystem check when re-focusing on Desktop - #5518. Thanks @Daniel-McCarthy!", "[Improved] Commit disabled when commit summary is only spaces - #5677. Thanks @Daniel-McCarthy!", "[Improved] Commit summary expander sometimes shown when not needed - #5700. Thanks @aryyya!", "[Improved] Error handling when looking for merge base of a missing ref - #5612", "[Improved] Warning if branch exists on remote when creating branch - #5141. Thanks @Daniel-McCarthy!" ], "1.4.1-beta1": [ "[Added] Support for opening repository in Cygwin terminal - #5654. Thanks @LordOfTheThunder!", "[Fixed] 'Compare to Branch' menu item not disabled when modal is open - #5673. Thanks @kanishk98!", "[Fixed] No message shown when filter returns no results in Clone Repository view - #5637. Thanks @DanielHix!", "[Fixed] Co-author form does not show/hide for newly-added repository - #5490", "[Fixed] Dialog styling issue for dark theme users on Windows - #5629. Thanks @cwongmath!", "[Fixed] Desktop command line always suffixes `.git` to URL when starting a clone - #5529. Thanks @j-f1!", "[Improved] Commit summary expander sometimes shown when not needed - #5700. Thanks @aryyya!", "[Improved] Commit disabled when commit summary is only spaces - #5677. Thanks @Daniel-McCarthy!", "[Improved] Error handling when looking for merge base of a missing ref - #5612", "[Improved] Clone dialog re-runs filesystem check when re-focusing on Desktop - #5518. Thanks @Daniel-McCarthy!", "[Improved] Branch names cannot start with a '+' character - #5594. Thanks @Daniel-McCarthy!", "[Improved] Warning if branch exists on remote when creating branch - #5141. Thanks @Daniel-McCarthy!" ], "1.4.1-beta0": [], "1.4.0": [ "[New] When an update is available for GitHub Desktop, release notes can be viewed in Desktop - #2774", "[New] Detect merge conflicts when comparing branches - #4588", "[Fixed] Avoid double checkout warning when opening a pull request in Desktop - #5375", "[Fixed] Error when publishing repository is now associated with the right tab - #5422. Thanks @Daniel-McCarthy!", "[Fixed] Disable affected menu items when on detached HEAD - #5500. Thanks @say25!", "[Fixed] Show border when commit description is expanded - #5506. Thanks @aryyya!", "[Fixed] GitLab URL which corresponds to GitHub repository of same name cloned GitHub repository - #4154", "[Fixed] Caret in co-author selector is hidden when dark theme enabled - #5589", "[Fixed] Authenticating to GitHub Enterprise fails when user has no emails defined - #5585", "[Improved] Avoid multiple lookups of default remote - #5399" ], "1.4.0-beta3": [ "[New] When an update is available for GitHub Desktop, the release notes can be viewed in Desktop - #2774", "[New] Detect merge conflicts when comparing branches - #4588", "[Fixed] Avoid double checkout warning when opening a pull request in Desktop - #5375", "[Fixed] Error when publishing repository is now associated with the right tab - #5422. Thanks @Daniel-McCarthy!", "[Fixed] Disable affected menu items when on detached HEAD - #5500. Thanks @say25!", "[Fixed] Show border when commit description is expanded - #5506. Thanks @aryyya!", "[Fixed] GitLab URL which corresponds to GitHub repository of same name cloned GitHub repository - #4154", "[Improved] Avoid multiple lookups of default remote - #5399", "[Improved] Skip optional locks when checking status of repository - #5376" ], "1.4.0-beta2": [ "[New] When an update is available for GitHub Desktop, the release notes can be viewed in Desktop - #2774", "[New] Detect merge conflicts when comparing branches - #4588", "[Fixed] Avoid double checkout warning when opening a pull request in Desktop - #5375", "[Fixed] Error when publishing repository is now associated with the right tab - #5422. Thanks @Daniel-McCarthy!", "[Fixed] Disable affected menu items when on detached HEAD - #5500. Thanks @say25!", "[Fixed] Show border when commit description is expanded - #5506. Thanks @aryyya!", "[Fixed] GitLab URL which corresponds to GitHub repository of same name cloned GitHub repository - #4154", "[Improved] Avoid multiple lookups of default remote - #5399", "[Improved] Skip optional locks when checking status of repository - #5376" ], "1.4.0-beta1": [ "[New] When an update is available for GitHub Desktop, the release notes can be viewed in Desktop - #2774", "[New] Detect merge conflicts when comparing branches - #4588", "[Fixed] Avoid double checkout warning when opening a pull request in Desktop - #5375", "[Fixed] Error when publishing repository is now associated with the right tab - #5422. Thanks @Daniel-McCarthy!", "[Fixed] Disable affected menu items when on detached HEAD - #5500. Thanks @say25!", "[Fixed] Show border when commit description is expanded - #5506. Thanks @aryyya!", "[Fixed] GitLab URL which corresponds to GitHub repository of same name cloned GitHub repository - #4154", "[Improved] Avoid multiple lookups of default remote - #5399", "[Improved] Skip optional locks when checking status of repository - #5376" ], "1.4.0-beta0": [], "1.3.5": [ "[Fixed] Disable delete button while deleting a branch - #5331", "[Fixed] History now avoids calling log.showSignature if set in config - #5466", "[Fixed] Start blocking the ability to add local bare repositories - #4293. Thanks @Daniel-McCarthy!", "[Fixed] Revert workaround for tooltip issue on Windows - #3362. Thanks @divayprakash!", "[Improved] Error message when publishing to missing organisation - #5380. Thanks @Daniel-McCarthy!", "[Improved] Don't hide commit details when commit description is expanded. - #5471. Thanks @aryyya!" ], "1.3.5-beta1": [ "[Fixed] Disable delete button while deleting a branch - #5331", "[Fixed] History now avoids calling log.showSignature if set in config - #5466", "[Fixed] Start blocking the ability to add local bare repositories - #4293. Thanks @Daniel-McCarthy!", "[Fixed] Revert workaround for tooltip issue on Windows - #3362. Thanks @divayprakash!", "[Improved] Error message when publishing to missing organisation - #5380. Thanks @Daniel-McCarthy!", "[Improved] Don't hide commit details when commit summary description is expanded. - #5471. Thanks @aryyya!" ], "1.3.5-beta0": [], "1.3.4": [ "[Improved] Cloning message uses remote repo name not file destination - #5413. Thanks @lisavogtsf!", "[Improved] Support VSCode user scope installation - #5281. Thanks @saschanaz!" ], "1.3.4-beta1": [ "[Improved] Cloning message uses remote repo name not file destination - #5413. Thanks @lisavogtsf!", "[Improved] Support VSCode user scope installation - #5281. Thanks @saschanaz!" ], "1.3.4-beta0": [], "1.3.3": [ "[Fixed] Maximize and restore app on Windows does not fill available space - #5033", "[Fixed] 'Clone repository' menu item label is obscured on Windows - #5348. Thanks @Daniel-McCarthy!", "[Fixed] User can toggle files when commit is in progress - #5341. Thanks @masungwon!", "[Improved] Repository indicator background work - #5317 #5326 #5363 #5241 #5320" ], "1.3.3-beta1": [ "[Fixed] Maximize and restore app on Windows does not fill available space - #5033", "[Fixed] 'Clone repository' menu item label is obscured on Windows - #5348. Thanks @Daniel-McCarthy!", "[Fixed] User can toggle files when commit is in progress - #5341. Thanks @masungwon!", "[Improved] Repository indicator background work - #5317 #5326 #5363 #5241 #5320" ], "1.3.3-test6": ["Testing infrastructure changes"], "1.3.3-test5": ["Testing the new CircleCI config changes"], "1.3.3-test4": ["Testing the new CircleCI config changes"], "1.3.3-test3": ["Testing the new CircleCI config changes"], "1.3.3-test2": ["Testing the new CircleCI config changes"], "1.3.3-test1": ["Testing the new CircleCI config changes"], "1.3.2": [ "[Fixed] Bugfix for background checks not being aware of missing repositories - #5282", "[Fixed] Check the local state of a repository before performing Git operations - #5289", "[Fixed] Switch to history view for default branch when deleting current branch during a compare - #5256", "[Fixed] Handle missing .git directory inside a tracked repository - #5291" ], "1.3.2-beta1": [ "[Fixed] Bugfix for background checks not being aware of missing repositories - #5282", "[Fixed] Check the local state of a repository before performing Git operations - #5289", "[Fixed] Switch to history view for default branch when deleting current branch during a compare - #5256", "[Fixed] Handle missing .git directory inside a tracked repository - #5291" ], "1.3.1": [ "[Fixed] Background Git operations on missing repositories are not handled as expected - #5282" ], "1.3.1-beta1": [ "[Fixed] Background Git operations on missing repositories are not handled as expected - #5282" ], "1.3.1-beta0": [ "[New] Notification displayed in History tab when the base branch moves ahead of the current branch - #4768", "[New] Repository list displays uncommitted changes indicator and ahead/behind information - #2259 #5095", "[Added] Option to move repository to trash when removing from app - #2108. Thanks @say25!", "[Added] Syntax highlighting for PowerShell files - #5081. Thanks @say25!", "[Fixed] \"Discard Changes\" context menu discards correct file when entry is not part of selected group - #4788", "[Fixed] Display local path of selected repository as tooltip - #4922. Thanks @yongdamsh!", "[Fixed] Display root directory name when repository is located at drive root - #4924", "[Fixed] Handle legacy macOS right click gesture - #4942", "[Fixed] History omits latest commit from list - #5243", "[Fixed] Markdown header elements hard to read in dark mode - #5133. Thanks @agisilaos!", "[Fixed] Only perform ahead/behind comparisons when branch selector is open - #5142", "[Fixed] Relax checks for merge commits for GitHub Enterprise repositories - #4329", "[Fixed] Render clickable link in \"squash and merge\" commit message - #5203. Thanks @1pete!", "[Fixed] Return key disabled when no matches found in Compare branch list - #4458", "[Fixed] Selected commit not remembered when switching between History and Changes tabs - #4985", "[Fixed] Selected commit when comparing is reset to latest when Desktop regains focus - #5069", "[Fixed] Support default branch detection for non-GitHub repositories - #4937", "[Improved] Change primary button color to blue for dark theme - #5074", "[Improved] Diff gutter elements should be considered button elements when interacting - #5158", "[Improved] Status parsing significantly more performant when handling thousands of changed files - #2449 #5186" ], "1.3.0": [ "[New] Notification displayed in History tab when the base branch moves ahead of the current branch - #4768", "[New] Repository list displays uncommitted changes indicator and ahead/behind information - #2259 #5095", "[Added] Option to move repository to trash when removing from app - #2108. Thanks @say25!", "[Added] Syntax highlighting for PowerShell files - #5081. Thanks @say25!", "[Fixed] \"Discard Changes\" context menu discards correct file when entry is not part of selected group - #4788", "[Fixed] Display local path of selected repository as tooltip - #4922. Thanks @yongdamsh!", "[Fixed] Display root directory name when repository is located at drive root - #4924", "[Fixed] Handle legacy macOS right click gesture - #4942", "[Fixed] History omits latest commit from list - #5243", "[Fixed] Markdown header elements hard to read in dark mode - #5133. Thanks @agisilaos!", "[Fixed] Only perform ahead/behind comparisons when branch selector is open - #5142", "[Fixed] Relax checks for merge commits for GitHub Enterprise repositories - #4329", "[Fixed] Render clickable link in \"squash and merge\" commit message - #5203. Thanks @1pete!", "[Fixed] Return key disabled when no matches found in Compare branch list - #4458", "[Fixed] Selected commit not remembered when switching between History and Changes tabs - #4985", "[Fixed] Selected commit when comparing is reset to latest when Desktop regains focus - #5069", "[Fixed] Support default branch detection for non-GitHub repositories - #4937", "[Improved] Change primary button color to blue for dark theme - #5074", "[Improved] Diff gutter elements should be considered button elements when interacting - #5158", "[Improved] Status parsing significantly more performant when handling thousands of changed files - #2449 #5186" ], "1.3.0-beta7": [], "1.3.0-beta6": [], "1.3.0-beta5": [ "[Fixed] Ensure commit message is cleared after successful commit - #4046", "[Fixed] History omits latest commit from list - #5243" ], "1.3.0-beta4": [ "[Fixed] Only perform ahead/behind comparisons when branch selector is open - #5142", "[Fixed] Render clickable link in \"squash and merge\" commit message - #5203. Thanks @1pete!", "[Fixed] Selected commit not remembered when switching between History and Changes tabs - #4985", "[Fixed] Selected commit when comparing is reset to latest when Desktop regains focus - #5069" ], "1.3.0-beta3": [ "[Fixed] \"Discard Changes\" context menu discards correct file when entry is not part of selected group - #4788", "[Fixed] Return key disabled when no matches found in Compare branch list - #4458", "[Improved] Status parsing significantly more performant when handling thousands of changed files - #2449 #5186" ], "1.3.0-beta2": [ "[Added] Option to move repository to trash when removing from app - #2108. Thanks @say25!", "[Fixed] Markdown header elements hard to read in dark mode - #5133. Thanks @agisilaos!", "[Improved] Diff gutter elements should be considered button elements when interacting - #5158" ], "1.2.7-test3": ["Test deployment for electron version bump."], "1.3.0-beta1": [ "[New] Notification displayed in History tab when the base branch moves ahead of the current branch - #4768", "[New] Repository list displays uncommitted changes count and ahead/behind information - #2259", "[Added] Syntax highlighting for PowerShell files- #5081. Thanks @say25!", "[Fixed] Display something when repository is located at drive root - #4924", "[Fixed] Relax checks for merge commits for GitHub Enterprise repositories - #4329", "[Fixed] Display local path of selected repository as tooltip - #4922. Thanks @yongdamsh!", "[Fixed] Support default branch detection for non-GitHub repositories - #4937", "[Fixed] Handle legacy macOS right click gesture - #4942", "[Improved] Repository list badge style tweaks and tweaks for dark theme - #5095", "[Improved] Change primary button color to blue for dark theme - #5074" ], "1.2.7-test2": ["Test deployment for electron version bump."], "1.2.7-test1": ["Sanity check deployment for refactored scripts"], "1.2.7-beta0": [ "[Fixed] Visual indicator for upcoming feature should not be shown - #5026" ], "1.2.6": [ "[Fixed] Visual indicator for upcoming feature should not be shown - #5026" ], "1.2.6-beta0": [ "[Fixed] Feature flag for upcoming feature not applied correctly - #5024" ], "1.2.5": [ "[Fixed] Feature flag for upcoming feature not applied correctly - #5024" ], "1.2.4": [ "[New] Dark Theme preview - #4849", "[Added] Syntax highlighting for Cake files - #4935. Thanks @say25!", "[Added] WebStorm support for macOS - #4841. Thanks @mrsimonfletcher!", "[Fixed] Compare tab appends older commits when scrolling to bottom of list - #4964", "[Fixed] Remove temporary directory after Git LFS operation completes - #4414", "[Fixed] Unable to compare when two branches exist - #4947 #4730", "[Fixed] Unhandled errors when refreshing pull requests fails - #4844 #4866", "[Improved] Remove context menu needs to hint if a dialog will be shown - #4975", "[Improved] Upgrade embedded Git LFS - #4602 #4745", "[Improved] Update banner message clarifies that only Desktop needs to be restarted - #4891. Thanks @KennethSweezy!", "[Improved] Discard Changes context menu entry should contain ellipses when user needs to confirm - #4846. Thanks @yongdamsh!", "[Improved] Initializing syntax highlighting components - #4764", "[Improved] Only show overflow shadow when description overflows - #4898", "[Improved] Changes tab displays number of changed files instead of dot - #4772. Thanks @yongdamsh!" ], "1.2.4-beta5": [], "1.2.4-beta4": [ "[Fixed] Compare tab appends older commits when scrolling to bottom of list - #4964", "[Fixed] Remove temporary directory after Git LFS operation completes - #4414", "[Improved] Remove context menu needs to hint if a dialog will be shown - #4975", "[Improved] Upgrade embedded Git LFS - #4602 #4745" ], "1.2.4-test1": [ "Confirming latest Git LFS version addresses reported issues" ], "1.2.4-beta3": [ "[Added] WebStorm support for macOS - #4841. Thanks @mrsimonfletcher!", "[Improved] Update banner message clarifies that only Desktop needs to be restarted - #4891. Thanks @KennethSweezy!" ], "1.2.4-beta2": [], "1.2.4-beta1": [ "[New] Dark Theme preview - #4849", "[Added] Syntax highlighting for Cake files - #4935. Thanks @say25!", "[Fixed] Unable to compare when two branches exist - #4947 #4730", "[Fixed] Unhandled errors when refreshing pull requests fails - #4844 #4866", "[Improved] Discard Changes context menu entry should contain ellipses when user needs to confirm - #4846. Thanks @yongdamsh!", "[Improved] Initializing syntax highlighting components - #4764", "[Improved] Only show overflow shadow when description overflows - #4898", "[Improved] Changes tab displays number of changed files instead of dot - #4772. Thanks @yongdamsh!" ], "1.2.3": [ "[Fixed] No autocomplete when searching for co-authors - #4847", "[Fixed] Error when checking out a PR from a fork - #4842" ], "1.2.3-beta1": [ "[Fixed] No autocomplete when searching for co-authors - #4847", "[Fixed] Error when checking out a PR from a fork - #4842" ], "1.2.3-test1": [ "Confirming switch from uglify-es to babel-minify addresses minification issue - #4871" ], "1.2.2": [ "[Fixed] Make cURL/schannel default to using the Windows certificate store - #4817", "[Fixed] Restore text selection highlighting in diffs - #4818" ], "1.2.2-beta1": [ "[Fixed] Make cURL/schannel default to using the Windows certificate store - #4817", "[Fixed] Text selection highlighting in diffs is back - #4818" ], "1.2.1": [ "[Added] Brackets support for macOS - #4608. Thanks @3raxton!", "[Added] Pull request number and author are included in fuzzy-find filtering - #4653. Thanks @damaneice!", "[Fixed] Decreased the max line length limit - #3740. Thanks @sagaragarwal94!", "[Fixed] Updated embedded Git to 2.17.1 to address upstream security issue - #4791", "[Improved] Display the difference in file size of an image in the diff view - #4380. Thanks @ggajos!" ], "1.2.1-test1": ["Upgraded embedded Git to 2.17.0"], "1.2.1-beta1": [ "[Added] Brackets support for macOS - #4608. Thanks @3raxton!", "[Added] Pull request number and author are included in fuzzy-find filtering - #4653. Thanks @damaneice!", "[Fixed] Decreased the max line length limit - #3740. Thanks @sagaragarwal94!", "[Fixed] Updated embedded Git to 2.17.1 to address upstream security issue - #4791", "[Improved] Display the difference in file size of an image in the diff view - #4380. Thanks @ggajos!" ], "1.2.1-beta0": [], "1.1.2-test6": ["Testing the Webpack v4 output from the project"], "1.2.0": [ "[New] History now has ability to compare to another branch and merge outstanding commits", "[New] Support for selecting more than one file in the changes list - #1712. Thanks @icosamuel!", "[New] Render bitmap images in diffs - #4367. Thanks @MagicMarvMan!", "[Added] Add PowerShell Core support for Windows and macOS - #3791. Thanks @saschanaz!", "[Added] Add MacVim support for macOS - #4532. Thanks @johnelliott!", "[Added] Syntax highlighting for JavaServer Pages (JSP) - #4470. Thanks @damaneice!", "[Added] Syntax highlighting for Haxe files - #4445. Thanks @Gama11!", "[Added] Syntax highlighting for R files - #4455. Thanks @say25!", "[Fixed] 'Open in Shell' on Linux ensures Git is on PATH - #4619. Thanks @ziggy42!", "[Fixed] Pressing 'Enter' on filtered Pull Request does not checkout - #4673", "[Fixed] Alert icon shrinks in rename dialog when branch name is long - #4566", "[Fixed] 'Open in Desktop' performs fetch to ensure branch exists before checkout - #3006", "[Fixed] 'Open in Default Program' on Windows changes the window title - #4446", "[Fixed] Skip fast-forwarding when there are many eligible local branches - #4392", "[Fixed] Image diffs not working for files with upper-case file extension - #4466", "[Fixed] Syntax highlighting not working for files with upper-case file extension - #4462. Thanks @say25!", "[Fixed] Error when creating Git LFS progress causes clone to fail - #4307. Thanks @MagicMarvMan!", "[Fixed] 'Open File in External Editor' always opens a new instance - #4381", "[Fixed] 'Select All' shortcut now works for changes list - #3821", "[Improved] Automatically add valid repository when using command line interface - #4513. Thanks @ggajos!", "[Improved] Always fast-forward the default branch - #4506", "[Improved] Warn when trying to rename a published branch - #4035. Thanks @agisilaos!", "[Improved] Added context menu for files in commit history - #2845. Thanks @crea7or", "[Improved] Discarding all changes always prompts for confirmation - #4459", "[Improved] Getting list of changed files is now more efficient when dealing with thousands of files - #4443", "[Improved] Checking out a Pull Request may skip unnecessary fetch - #4068. Thanks @agisilaos!", "[Improved] Commit summary now has a hint to indicate why committing is disabled - #4429.", "[Improved] Pull request status text now matches format on GitHub - #3521", "[Improved] Add escape hatch to disable hardware acceleration when launching - #3921" ], "1.1.2-beta7": [], "1.1.2-beta6": [ "[Added] Add MacVim support for macOS - #4532. Thanks @johnelliott!", "[Fixed] Open in Shell on Linux ensures Git is available on the user's PATH - #4619. Thanks @ziggy42!", "[Fixed] Keyboard focus issues when navigating Pull Request list - #4673", "[Improved] Automatically add valid repository when using command line interface - #4513. Thanks @ggajos!" ], "1.1.2-test5": ["Actually upgrading fs-extra to v6 in the app"], "1.1.2-test4": ["Upgrading fs-extra to v6"], "1.1.2-beta5": [ "[Added] Syntax highlighting for JavaServer Pages (JSP) - #4470. Thanks @damaneice!", "[Fixed] Prevent icon from shrinking in rename dialog - #4566" ], "1.1.2-beta4": [ "[New] New Compare tab allowing visualization of the relationship between branches", "[New] Support for selecting more than one file in the changes list - #1712. Thanks @icosamuel!", "[Fixed] 'Select All' shortcut now works for changes list - #3821", "[Improved] Always fast-forward the default branch - #4506", "[Improved] Warn when trying to rename a published branch - #4035. Thanks @agisilaos!", "[Improved] Added context menu for files in commit history - #2845. Thanks @crea7or", "[Improved] Discarding all changes always prompts for confirmation - #4459" ], "1.1.2-beta3": [ "[Added] Syntax highlighting for Haxe files - #4445. Thanks @Gama11!", "[Added] Syntax highlighting for R files - #4455. Thanks @say25!", "[Fixed] Fetch to ensure \"Open in Desktop\" has a branch to checkout - #3006", "[Fixed] Handle the click event when opening a binary file - #4446", "[Fixed] Skip fast-forwarding when there are a lot of eligible local branches - #4392", "[Fixed] Image diffs not working for files with upper-case file extension - #4466", "[Fixed] Syntax highlighting not working for files with upper-case file extension - #4462. Thanks @say25!", "[Improved] Getting list of changed files is now more efficient when dealing with thousands of files - #4443", "[Improved] Checking out a Pull Request may skip unnecessary fetch - #4068. Thanks @agisilaos!", "[Improved] Commit summary now has a hint to indicate why committing is disabled - #4429." ], "1.1.2-test3": ["[New] Comparison Branch demo build"], "1.1.2-test2": [ "Refactoring the diff internals to potentially land some SVG improvements" ], "1.1.2-test1": [ "Refactoring the diff internals to potentially land some SVG improvements" ], "1.1.2-beta2": [ "[New] Render bitmap images in diffs - #4367. Thanks @MagicMarvMan!", "[New] Add PowerShell Core support for Windows and macOS - #3791. Thanks @saschanaz!", "[Fixed] Error when creating Git LFS progress causes clone to fail - #4307. Thanks @MagicMarvMan!", "[Fixed] 'Open File in External Editor' does not use existing window - #4381", "[Fixed] Always ask for confirmation when discarding all changes - #4423", "[Improved] Pull request status text now matches format on GitHub - #3521", "[Improved] Add escape hatch to disable hardware acceleration when launching - #3921" ], "1.1.2-beta1": [], "1.1.1": [ "[New] Render WebP images in diffs - #4164. Thanks @agisilaos!", "[Fixed] Edit context menus in commit form input elements - #3886", "[Fixed] Escape behavior for Pull Request list does not match Branch List - #3597", "[Fixed] Keep caret position after inserting completion for emoji/mention - #3835. Thanks @CarlRosell!", "[Fixed] Handle error events when watching files used to get Git LFS output - #4117", "[Fixed] Potential race condition when opening a fork pull request - #4149", "[Fixed] Show placeholder image when no pull requests found - #3973", "[Fixed] Disable commit summary and description inputs while commit in progress - #3893. Thanks @crea7or!", "[Fixed] Ensure pull request cache is cleared after last pull request merged - #4122", "[Fixed] Focus two-factor authentication dialog on input - #4220. Thanks @WaleedAshraf!", "[Fixed] Branches button no longer disabled while on an unborn branch - #4236. Thanks @agisilaos!", "[Fixed] Delete gitignore file when all entries cleared in Repository Settings - #1896", "[Fixed] Add visual indicator that a folder can be dropped on Desktop - #4004. Thanks @agisilaos!", "[Fixed] Attempt to focus the application window on macOS after signing in via the browser - #4126", "[Fixed] Refresh issues when user manually fetches - #4076", "[Improved] Add `Discard All Changes...` to context menu on changed file list - #4197. Thanks @xamm!", "[Improved] Improve contrast for button labels in app toolbar - #4219", "[Improved] Speed up check for submodules when discarding - #4186. Thanks @kmscode!", "[Improved] Make the keychain known issue more clear within Desktop - #4125", "[Improved] Continue past the 'diff too large' message and view the diff - #4050", "[Improved] Repository association might not have expected prefix - #4090. Thanks @mathieudutour!", "[Improved] Add message to gitignore dialog when not on default branch - #3720", "[Improved] Hide Desktop-specific forks in Branch List - #4127", "[Improved] Disregard accidental whitespace when cloning a repository by URL - #4216", "[Improved] Show alert icon in repository list when repository not found on disk - #4254. Thanks @gingerbeardman!", "[Improved] Repository list now closes after removing last repository - #4269. Thanks @agisilaos!", "[Improved] Move forget password link after the password dialog to match expected tab order - #4283. Thanks @iamnapo!", "[Improved] More descriptive text in repository toolbar button when no repositories are tracked - #4268. Thanks @agisilaos!", "[Improved] Context menu in Changes tab now supports opening file in your preferred editor - #4030" ], "1.1.1-beta4": [ "[Improved] Context menu in Changes tab now supports opening file in your preferred editor - #4030" ], "1.1.1-beta3": [], "1.1.1-beta2": [ "[New] Render WebP images in diffs - #4164. Thanks @agisilaos!", "[Fixed] Edit context menus in commit form input elements - #3886", "[Fixed] Escape behavior should match that of Branch List - #3972", "[Fixed] Keep caret position after inserting completion - #3835. Thanks @CarlRosell!", "[Fixed] Handle error events when watching files used to get Git LFS output - #4117", "[Fixed] Potential race condition when opening a fork pull request - #4149", "[Fixed] Show placeholder image when no pull requests found - #3973", "[Fixed] Disable input fields summary and description while commit in progress - #3893. Thanks @crea7or!", "[Fixed] Ensure pull request cache is cleared after last pull request merged - #4122", "[Fixed] Focus two-factor authentication dialog on input - #4220. Thanks @WaleedAshraf!", "[Fixed] Branches button no longer disabled while on an unborn branch - #4236. Thanks @agisilaos!", "[Fixed] Delete gitignore file when entries cleared in Repository Settings - #1896", "[Fixed] Add visual indicator that a folder can be dropped on Desktop - #4004. Thanks @agisilaos!", "[Improved] Add `Discard All Changes...` to context menu on changed file list - #4197. Thanks @xamm!", "[Improved] Improve contrast for button labels in app toolbar - #4219", "[Improved] Speed up check for submodules when discarding - #4186. Thanks @kmscode!", "[Improved] Make the keychain known issue more clear within Desktop - #4125", "[Improved] Continue past the 'diff too large' message and view the diff - #4050", "[Improved] Repository association might not have expected prefix - #4090. Thanks @mathieudutour!", "[Improved] Add message to gitignore dialog when not on default branch - #3720", "[Improved] Hide Desktop-specific forks in Branch List - #4127", "[Improved] Disregard accidental whitespace when cloning a repository by URL - #4216", "[Improved] Show alert icon in repository list when repository not found on disk - #4254. Thanks @gingerbeardman!", "[Improved] Repository list now closes after removing last repository - #4269. Thanks @agisilaos!", "[Improved] Move forget password link to after the password dialog to maintain expected tab order - #4283. Thanks @iamnapo!", "[Improved] More descriptive text in repository toolbar button when no repositories are tracked - #4268. Thanks @agisilaos!" ], "1.1.1-test2": ["[Improved] Electron 1.8.3 upgrade (again)"], "1.1.1-test1": [ "[Improved] Forcing a focus on the window after the OAuth dance is done" ], "1.1.1-beta1": [], "1.1.0": [ "[New] Check out pull requests from collaborators or forks from within Desktop", "[New] View the commit status of the branch when it has an open pull request", "[Added] Add RubyMine support for macOS - #3883. Thanks @gssbzn!", "[Added] Add TextMate support for macOS - #3910. Thanks @caiofbpa!", "[Added] Syntax highlighting for Elixir files - #3774. Thanks @joaovitoras!", "[Fixed] Update layout of branch blankslate image - #4011", "[Fixed] Expanded avatar stack in commit summary gets cut off - #3884", "[Fixed] Clear repository filter when switching tabs - #3787. Thanks @reyronald!", "[Fixed] Avoid crash when unable to launch shell - #3954", "[Fixed] Ensure renames are detected when viewing commit diffs - #3673", "[Fixed] Fetch default remote if it differs from the current - #4056", "[Fixed] Handle Git errors when .gitmodules are malformed - #3912", "[Fixed] Handle error when \"where\" is not on PATH - #3882 #3825", "[Fixed] Ignore action assumes CRLF when core.autocrlf is unset - #3514", "[Fixed] Prevent duplicate entries in co-author autocomplete list - #3887", "[Fixed] Renames not detected when viewing commit diffs - #3673", "[Fixed] Support legacy usernames as co-authors - #3897", "[Improved] Update branch button text from \"New\" to \"New Branch\" - #4032", "[Improved] Add fuzzy search in the repository, branch, PR, and clone FilterLists - #911. Thanks @j-f1!", "[Improved] Tidy up commit summary and description layout in commit list - #3922. Thanks @willnode!", "[Improved] Use smaller default size when rendering Gravatar avatars - #3911", "[Improved] Show fetch progress when initializing remote for fork - #3953", "[Improved] Remove references to Hubot from the user setup page - #4015. Thanks @j-f1!", "[Improved] Error handling around ENOENT - #3954", "[Improved] Clear repository filter text when switching tabs - #3787. Thanks @reyronald!", "[Improved] Allow window to accept single click on focus - #3843", "[Improved] Disable drag-and-drop interaction when a popup is in the foreground - #3996" ], "1.1.0-beta3": [ "[Fixed] Fetch default remote if it differs from the current - #4056" ], "1.1.0-beta2": [ "[Improved] Update embedded Git to improve error handling when using stdin - #4058" ], "1.1.0-beta1": [ "[Improved] Add 'Branch' to 'New' branch button - #4032", "[Improved] Remove references to Hubot from the user setup page - #4015. Thanks @j-f1!" ], "1.0.14-beta5": [ "[Fixed] Improve detection of pull requests associated with current branch - #3991", "[Fixed] Disable drag-and-drop interaction when a popup is in the foreground - #3996", "[Fixed] Branch blank slate image out of position - #4011" ], "1.0.14-beta4": [ "[New] Syntax highlighting for Elixir files - #3774. Thanks @joaovitoras!", "[Fixed] Crash when unable to launch shell - #3954", "[Fixed] Support legacy usernames as co-authors - #3897", "[Improved] Enable fuzzy search in the repository, branch, PR, and clone FilterLists - #911. Thanks @j-f1!", "[Improved] Tidy up commit summary and description layout in commit list - #3922. Thanks @willnode!" ], "1.0.14-test1": ["[Improved] Electron 1.8.2 upgrade"], "1.0.14-beta3": [ "[Added] Add TextMate support for macOS - #3910. Thanks @caiofbpa!", "[Fixed] Handle Git errors when .gitmodules are malformed - #3912", "[Fixed] Clear repository filter when switching tabs - #3787. Thanks @reyronald!", "[Fixed] Prevent duplicate entries in co-author autocomplete list - #3887", "[Improved] Show progress when initializing remote for fork - #3953" ], "1.0.14-beta2": [ "[Added] Add RubyMine support for macOS - #3883. Thanks @gssbzn!", "[Fixed] Allow window to accept single click on focus - #3843", "[Fixed] Expanded avatar list hidden behind commit details - #3884", "[Fixed] Renames not detected when viewing commit diffs - #3673", "[Fixed] Ignore action assumes CRLF when core.autocrlf is unset - #3514", "[Improved] Use smaller default size when rendering Gravatar avatars - #3911" ], "1.0.14-beta1": ["[New] Commit together with co-authors - #3879"], "1.0.13": [ "[New] Commit together with co-authors - #3879", "[New] PhpStorm is now a supported external editor on macOS - #3749. Thanks @hubgit!", "[Improved] Update embedded Git to 2.16.1 - #3617 #3828 #3871", "[Improved] Blank slate view is now more responsive when zoomed - #3777", "[Improved] Documentation fix for Open in Shell resource - #3799. Thanks @saschanaz!", "[Improved] Improved error handling for Linux - #3732", "[Improved] Allow links in unexpanded summary to be clickable - #3719. Thanks @koenpunt!", "[Fixed] Update Electron to 1.7.11 to address security issue - #3846", "[Fixed] Allow double dashes in branch name - #3599. Thanks @JQuinnie!", "[Fixed] Sort the organization list - #3657. Thanks @j-f1!", "[Fixed] Check out PRs from a fork - #3395", "[Fixed] Confirm deleting branch when it has an open PR - #3615", "[Fixed] Defer user/email validation in Preferences - #3722", "[Fixed] Checkout progress did not include branch name - #3780", "[Fixed] Don't block branch switching when in detached HEAD - #3807", "[Fixed] Handle discarding submodule changes properly - #3647", "[Fixed] Show tooltip with additional info about the build status - #3134", "[Fixed] Update placeholders to support Linux distributions - #3150", "[Fixed] Refresh local commit list when switching tabs - #3698" ], "1.0.13-test1": [ "[Improved] Update embedded Git to 2.16.1 - #3617 #3828 #3871", "[Fixed] Update Electron to 1.7.11 to address security issue - #3846", "[Fixed] Allows double dashes in branch name - #3599. Thanks @JQuinnie!", "[Fixed] Pull Request store may not have status defined - #3869", "[Fixed] Render the Pull Request badge when no commit statuses found - #3608" ], "1.0.13-beta1": [ "[New] PhpStorm is now a supported external editor on macOS - #3749. Thanks @hubgit!", "[Improved] Blank slate view is now more responsive when zoomed - #3777", "[Improved] Documentation fix for Open in Shell resource - #3799. Thanks @saschanaz!", "[Improved] Improved error handling for Linux - #3732", "[Improved] Allow links in unexpanded summary to be clickable - #3719. Thanks @koenpunt!", "[Fixed] Sort the organization list - #3657. Thanks @j-f1!", "[Fixed] Check out PRs from a fork - #3395", "[Fixed] Confirm deleting branch when it has an open PR - #3615", "[Fixed] Defer user/email validation in Preferences - #3722", "[Fixed] Checkout progress did not include branch name - #3780", "[Fixed] Don't block branch switching when in detached HEAD - #3807", "[Fixed] Handle discarding submodule changes properly - #3647", "[Fixed] Show tooltip with additional info about the build status - #3134", "[Fixed] Update placeholders to support Linux distributions - #3150", "[Fixed] Refresh local commit list when switching tabs - #3698" ], "1.0.12": [ "[New] Syntax highlighting for Rust files - #3666. Thanks @subnomo!", "[New] Syntax highlighting for Clojure cljc, cljs, and edn files - #3610. Thanks @mtkp!", "[Improved] Prevent creating a branch in the middle of a merge - #3733", "[Improved] Truncate long repo names in panes and modals to fit into a single line - #3598. Thanks @http-request!", "[Improved] Keyboard navigation support in pull request list - #3607", "[Fixed] Inconsistent caret behavior in text boxes when using certain keyboard layouts - #3354", "[Fixed] Only render the organizations list when it has orgs - #1414", "[Fixed] Checkout now handles situations where a ref exists on multiple remotes - #3281", "[Fixed] Retain accounts on desktop when losing connectivity - #3641", "[Fixed] Missing argument in FullScreenInfo that could prevent app from launching - #3727. Thanks @OiYouYeahYou!" ], "1.0.12-beta1": [ "[New] Syntax highlighting for Rust files - #3666. Thanks @subnomo!", "[New] Syntax highlighting for Clojure cljc, cljs, and edn files - #3610. Thanks @mtkp!", "[Improved] Prevent creating a branch in the middle of a merge - #3733", "[Improved] Truncate long repo names in panes and modals to fit into a single line - #3598. Thanks @http-request!", "[Improved] Keyboard navigation support in pull request list - #3607", "[Fixed] Inconsistent caret behavior in text boxes when using certain keyboard layouts - #3354", "[Fixed] Only render the organizations list when it has orgs - #1414", "[Fixed] Checkout now handles situations where a ref exists on multiple remotes - #3281", "[Fixed] Retain accounts on desktop when losing connectivity - #3641", "[Fixed] Missing argument in FullScreenInfo that could prevent app from launching - #3727. Thanks @OiYouYeahYou!" ], "1.0.12-beta0": [ "[New] Highlight substring matches in the \"Branches\" and \"Repositories\" list when filtering - #910. Thanks @JordanMussi!", "[New] Add preview for ico files - #3531. Thanks @serhiivinichuk!", "[New] Fallback to Gravatar for loading avatars - #821", "[New] Provide syntax highlighting for Visual Studio project files - #3552. Thanks @saul!", "[New] Provide syntax highlighting for F# fsx and fsi files - #3544. Thanks @saul!", "[New] Provide syntax highlighting for Kotlin files - #3555. Thanks @ziggy42!", "[New] Provide syntax highlighting for Clojure - #3523. Thanks @mtkp!", "[Improved] Toggle the \"Repository List\" from the menu - #2638. Thanks @JordanMussi!", "[Improved] Prevent saving of disallowed character strings for your name and email - #3204", "[Improved] Error messages now appear at the top of the \"Create a New Repository\" dialog - #3571. Thanks @http-request!", "[Improved] \"Repository List\" header is now \"Github.com\" for consistency - #3567. Thanks @iFun!", "[Improved] Rename the \"Install Update\" button to \"Quit and Install Update\" - #3494. Thanks @say25!", "[Fixed] Fix ordering of commit history when your branch and tracking branch have both changed - #2737", "[Fixed] Prevent creating a branch that starts with a period - #3013. Thanks @JordanMussi!", "[Fixed] Branch names are properly encoded when creating a pull request - #3509", "[Fixed] Re-enable all the menu items after closing a popup - #3533", "[Fixed] Removes option to delete remote branch after it's been deleted - #2964. Thanks @JordanMussi!", "[Fixed] Windows: Detects available editors and shells now works even when the group policy blocks write registry access - #3105 #3405", "[Fixed] Windows: Menu items are no longer truncated - #3547", "[Fixed] Windows: Prevent disabled menu items from being accessed - #3391 #1521", "[Fixed] Preserve the selected pull request when a manual fetch is done - #3524", "[Fixed] Update pull request badge after switching branches or pull requests - #3454", "[Fixed] Restore keyboard arrow navigation for pull request list - #3499" ], "1.0.11": [ "[New] Highlight substring matches in the \"Branches\" and \"Repositories\" list when filtering - #910. Thanks @JordanMussi!", "[New] Add preview for ico files - #3531. Thanks @serhiivinichuk!", "[New] Fallback to Gravatar for loading avatars - #821", "[New] Provide syntax highlighting for Visual Studio project files - #3552. Thanks @saul!", "[New] Provide syntax highlighting for F# fsx and fsi files - #3544. Thanks @saul!", "[New] Provide syntax highlighting for Kotlin files - #3555. Thanks @ziggy42!", "[New] Provide syntax highlighting for Clojure - #3523. Thanks @mtkp!", "[Improved] Toggle the \"Repository List\" from the menu - #2638. Thanks @JordanMussi!", "[Improved] Prevent saving of disallowed character strings for your name and email - #3204", "[Improved] Error messages now appear at the top of the \"Create a New Repository\" dialog - #3571. Thanks @http-request!", "[Improved] \"Repository List\" header is now \"Github.com\" for consistency - #3567. Thanks @iFun!", "[Improved] Rename the \"Install Update\" button to \"Quit and Install Update\" - #3494. Thanks @say25!", "[Fixed] Fix ordering of commit history when your branch and tracking branch have both changed - #2737", "[Fixed] Prevent creating a branch that starts with a period - #3013. Thanks @JordanMussi!", "[Fixed] Branch names are properly encoded when creating a pull request - #3509", "[Fixed] Re-enable all the menu items after closing a popup - #3533", "[Fixed] Removes option to delete remote branch after it's been deleted - #2964. Thanks @JordanMussi!", "[Fixed] Windows: Detects available editors and shells now works even when the group policy blocks write registry access - #3105 #3405", "[Fixed] Windows: Menu items are no longer truncated - #3547", "[Fixed] Windows: Prevent disabled menu items from being accessed - #3391 #1521" ], "1.0.11-test0": [ "[Improved] now with a new major version of electron-packager" ], "1.0.11-beta0": [ "[Improved] Refresh the pull requests list after fetching - #3503", "[Improved] Rename the \"Install Update\" button to \"Quit and Install Update\" - #3494. Thanks @say25!", "[Fixed] URL encode branch names when creating a pull request - #3509", "[Fixed] Windows: detecting available editors and shells now works even when the group policy blocks write registry access - #3105 #3405" ], "1.0.10": [ "[New] ColdFusion Builder is now a supported external editor - #3336 #3321. Thanks @AtomicCons!", "[New] VSCode Insiders build is now a supported external editor - #3441. Thanks @say25!", "[New] BBEdit is now a supported external editor - #3467. Thanks @NiklasBr!", "[New] Hyper is now a supported shell on Windows too - #3455. Thanks @JordanMussi!", "[New] Swift is now syntax highlighted - #3305. Thanks @agisilaos!", "[New] Vue.js is now syntax highlighted - #3368. Thanks @wanecek!", "[New] CoffeeScript is now syntax highlighted - #3356. Thanks @agisilaos!", "[New] Cypher is now syntax highlighted - #3440. Thanks @say25!", "[New] .hpp is now syntax highlighted as C++ - #3420. Thanks @say25!", "[New] ML-like languages are now syntax highlighted - #3401. Thanks @say25!", "[New] Objective-C is now syntax highlighted - #3355. Thanks @koenpunt!", "[New] SQL is now syntax highlighted - #3389. Thanks @say25!", "[Improved] Better message on the 'Publish Branch' button when HEAD is unborn - #3344. Thanks @Venkat5694!", "[Improved] Better error message when trying to push to an archived repository - #3084. Thanks @agisilaos!", "[Improved] Avoid excessive background fetching when switching repositories - #3329", "[Improved] Ignore menu events sent when a modal is shown - #3308", "[Fixed] Parse changed files whose paths include a newline - #3271", "[Fixed] Parse file type changes - #3334", "[Fixed] Windows: 'Open without Git' would present the dialog again instead of actually opening a shell without git - #3290", "[Fixed] Avoid text selection when dragging resizable dividers - #3268", "[Fixed] Windows: Removed the title attribute on the Windows buttons so that they no longer leave their tooltips hanging around - #3348. Thanks @j-f1!", "[Fixed] Windows: Detect VS Code when installed to non-standard locations - #3304", "[Fixed] Hitting Return would select the first item in a filter list when the filter text was empty - #3447", "[Fixed] Add some missing keyboard shortcuts - #3327. Thanks @say25!", "[Fixed] Handle \"304 Not Modified\" responses - #3399", "[Fixed] Don't overwrite an existing .gitattributes when creating a new repository - #3419. Thanks @strafe!" ], "1.0.10-beta3": [ "[New] Change \"Create Pull Request\" to \"Show Pull Request\" when there is already a pull request open for the branch - #2524", "[New] VSCode Insiders build is now a supported external editor - #3441. Thanks @say25!", "[New] BBEdit is now a supported external editor - #3467. Thanks @NiklasBr!", "[New] Hyper is now a supported shell - #3455. Thanks @JordanMussi!", "[New] Cypher is now syntax highlighted - #3440. Thanks @say25!", "[New] .hpp is now syntax highlighted as C++ - #3420. Thanks @say25!", "[New] ML-like languages are now syntax highlighted - #3401. Thanks @say25!", "[Improved] Use the same colors in pull request dropdown as we use on GitHub.com - #3451", "[Improved] Fancy pull request loading animations - #2868", "[Improved] Avoid excessive background fetching when switching repositories - #3329", "[Improved] Refresh the pull request list when the Push/Pull/Fetch button is clicked - #3448", "[Improved] Ignore menu events sent when a modal is shown - #3308", "[Fixed] Hitting Return would select the first item in a filter list when the filter text was empty - #3447", "[Fixed] Add some missing keyboard shortcuts - #3327. Thanks @say25!", "[Fixed] Handle \"304 Not Modified\" responses - #3399", "[Fixed] Don't overwrite an existing .gitattributes when creating a new repository - #3419. Thanks @strafe!" ], "1.0.10-beta2": [ "[New] SQL is now syntax highlighted! - #3389. Thanks @say25!", "[Fixed] Windows: Detect VS Code when installed to non-standard locations - #3304" ], "1.0.10-beta1": [ "[New] Vue.js code is now syntax highlighted! - #3368. Thanks @wanecek!", "[New] CoffeeScript is now syntax highlighted! - #3356. Thanks @agisilaos!", "[New] Highlight .m as Objective-C - #3355. Thanks @koenpunt!", "[Improved] Use smarter middle truncation for branch names - #3357", "[Fixed] Windows: Removed the title attribute on the Windows buttons so that they no longer leave their tooltips hanging around - #3348. Thanks @j-f1!" ], "1.0.10-beta0": [ "[New] ColdFusion Builder is now available as an option for External Editor - #3336 #3321. Thanks @AtomicCons!", "[New] Swift code is now syntax highlighted - #3305. Thanks @agisilaos!", "[Improved] Better message on the 'Publish Branch' button when HEAD is unborn - #3344. Thanks @Venkat5694!", "[Improved] Better error message when trying to push to an archived repository - #3084. Thanks @agisilaos!", "[Fixed] Parse changed files whose paths include a newline - #3271", "[Fixed] Parse file type changes - #3334", "[Fixed] Windows: 'Open without Git' would present the dialog again instead of actually opening a shell without git - #3290", "[Fixed] Avoid text selection when dragging resizable dividers - #3268" ], "1.0.9": [ "[New] ColdFusion Builder is now available as an option for External Editor - #3336 #3321. Thanks @AtomicCons!", "[New] Swift code is now syntax highlighted - #3305. Thanks @agisilaos!", "[Improved] Better message on the 'Publish Branch' button when HEAD is unborn - #3344. Thanks @Venkat5694!", "[Improved] Better error message when trying to push to an archived repository - #3084. Thanks @agisilaos!", "[Fixed] Parse changed files whose paths include a newline - #3271", "[Fixed] Parse file type changes - #3334", "[Fixed] Windows: 'Open without Git' would present the dialog again instead of actually opening a shell without git - #3290", "[Fixed] Avoid text selection when dragging resizable dividers - #3268" ], "1.0.9-beta1": [ "[New] ColdFusion Builder is now available as an option for External Editor - #3336 #3321. Thanks @AtomicCons!", "[New] Swift code is now syntax highlighted - #3305. Thanks @agisilaos!", "[Improved] Better message on the 'Publish Branch' button when HEAD is unborn - #3344. Thanks @Venkat5694!", "[Improved] Better error message when trying to push to an archived repository - #3084. Thanks @agisilaos!", "[Fixed] Parse changed files whose paths include a newline - #3271", "[Fixed] Parse file type changes - #3334", "[Fixed] Windows: 'Open without Git' would present the dialog again instead of actually opening a shell without git - #3290", "[Fixed] Avoid text selection when dragging resizable dividers - #3268" ], "1.0.9-beta0": [ "[Fixed] Crash when rendering diffs for certain types of files - #3249", "[Fixed] Continually being prompted to add the upstream remote, even when it already exists - #3252" ], "1.0.8": [ "[Fixed] Crash when rendering diffs for certain types of files - #3249", "[Fixed] Continually being prompted to add the upstream remote, even when it already exists - #3252" ], "1.0.8-beta0": [ "[New] Syntax highlighted diffs - #3101", "[New] Add upstream to forked repositories - #2364", "[Fixed] Only reset scale of title bar on macOS - #3193", "[Fixed] Filter symbolic refs in the branch list - #3196", "[Fixed] Address path issue with invoking Git Bash - #3186", "[Fixed] Update embedded Git to support repository hooks and better error messages - #3067 #3079", "[Fixed] Provide credentials to LFS repositories when performing checkout - #3167", "[Fixed] Assorted changelog typos - #3174 #3184 #3207. Thanks @strafe, @alanaasmaa and @jt2k!" ], "1.0.7": [ "[New] Syntax highlighted diffs - #3101", "[New] Add upstream to forked repositories - #2364", "[Fixed] Only reset scale of title bar on macOS - #3193", "[Fixed] Filter symbolic refs in the branch list - #3196", "[Fixed] Address path issue with invoking Git Bash - #3186", "[Fixed] Update embedded Git to support repository hooks and better error messages - #3067 #3079", "[Fixed] Provide credentials to LFS repositories when performing checkout - #3167", "[Fixed] Assorted changelog typos - #3174 #3184 #3207. Thanks @strafe, @alanaasmaa and @jt2k!" ], "1.0.7-beta0": [ "[Fixed] The Branches list wouldn't display the branches for non-GitHub repositories - #3169", "[Fixed] Pushing or pulling could error when the temp directory was unavailable - #3046" ], "1.0.6": [ "[Fixed] The Branches list wouldn't display the branches for non-GitHub repositories - #3169", "[Fixed] Pushing or pulling could error when the temp directory was unavailable - #3046" ], "1.0.5": [ "[New] The command line interface now provides some helpful help! - #2372. Thanks @j-f1!", "[New] Create new branches from the Branches foldout - #2784", "[New] Add support for VSCode Insiders - #3012 #3062. Thanks @MSathieu!", "[New] Linux: Add Atom and Sublime Text support - #3133. Thanks @ziggy42!", "[New] Linux: Tilix support - #3117. Thanks @ziggy42!", "[New] Linux: Add Visual Studio Code support - #3122. Thanks @ziggy42!", "[Improved] Report errors when a problem occurs storing tokens - #3159", "[Improved] Bump to Git 2.14.3 - #3146", "[Improved] Don't try to display diffs that could cause the app to hang - #2596", "[Fixed] Handle local user accounts with URL-hostile characters - #3107", "[Fixed] Cloning a repository which uses Git LFS would leave all the files appearing modified - #3146", "[Fixed] Signing in in the Welcome flow could hang - #2769", "[Fixed] Properly replace old Git LFS configuration values - #2984" ], "1.0.5-beta1": [ "[New] Create new branches from the Branches foldout - #2784", "[New] Add support for VSCode Insiders - #3012 #3062. Thanks @MSathieu!", "[New] Linux: Add Atom and Sublime Text support - #3133. Thanks @ziggy42!", "[New] Linux: Tilix support - #3117. Thanks @ziggy42!", "[New] Linux: Add Visual Studio Code support - #3122. Thanks @ziggy42!", "[Improved] Report errors when a problem occurs storing tokens - #3159", "[Improved] Bump to Git 2.14.3 - #3146", "[Improved] Don't try to display diffs that could cause the app to hang - #2596", "[Fixed] Handle local user accounts with URL-hostile characters - #3107", "[Fixed] Cloning a repository which uses Git LFS would leave all the files appearing modified - #3146", "[Fixed] Signing in in the Welcome flow could hang - #2769", "[Fixed] Properly replace old Git LFS configuration values - #2984" ], "1.0.5-test1": [], "1.0.5-test0": [], "1.0.5-beta0": [ "[New] The command line interface now provides some helpful help! - #2372. Thanks @j-f1!" ], "1.0.4": [ "[New] Report Git LFS progress when cloning, pushing, pulling, or reverting - #2226", "[Improved] Increased diff contrast and and line gutter selection - #2586 #2181", "[Improved] Clarify why publishing a branch is disabled in various scenarios - #2773", "[Improved] Improved error message when installing the command Line tool fails - #2979. Thanks @agisilaos!", "[Improved] Format the branch name in \"Create Branch\" like we format branch names elsewhere - #2977. Thanks @j-f1!", "[Fixed] Avatars not updating after signing in - #2911", "[Fixed] Lots of bugs if there was a file named \"HEAD\" in the repository - #3009 #2721 #2938", "[Fixed] Handle duplicate config values when saving user.name and user.email - #2945", "[Fixed] The \"Create without pushing\" button when creating a new pull request wouldn't actually do anything - #2917" ], "1.0.4-beta1": [ "[New] Report Git LFS progress when cloning, pushing, pulling, or reverting - #2226", "[Improved] Increased diff contrast and and line gutter selection - #2586 #2181", "[Improved] Clarify why publishing a branch is disabled in various scenarios - #2773", "[Improved] Improved error message when installing the command Line tool fails - #2979. Thanks @agisilaos!", "[Improved] Format the branch name in \"Create Branch\" like we format branch names elsewhere - #2977. Thanks @j-f1!", "[Fixed] Avatars not updating after signing in - #2911", "[Fixed] Lots of bugs if there was a file named \"HEAD\" in the repository - #3009 #2721 #2938", "[Fixed] Handle duplicate config values when saving user.name and user.email - #2945", "[Fixed] The \"Create without pushing\" button when creating a new pull request wouldn't actually do anything - #2917 #2917" ], "1.0.4-beta0": [ "[Improved] Increase the contrast of the modified file status octicons - #2914", "[Fixed] Showing changed files in Finder/Explorer would open the file - #2909", "[Fixed] macOS: Fix app icon on High Sierra - #2915", "[Fixed] Cloning an empty repository would fail - #2897 #2906", "[Fixed] Catch logging exceptions - #2910" ], "1.0.3": [ "[Improved] Increase the contrast of the modified file status octicons - #2914", "[Fixed] Showing changed files in Finder/Explorer would open the file - #2909", "[Fixed] macOS: Fix app icon on High Sierra - #2915", "[Fixed] Cloning an empty repository would fail - #2897 #2906", "[Fixed] Catch logging exceptions - #2910" ], "1.0.2": [ "[Improved] Better message for GitHub Enterprise users when there is a network error - #2574. Thanks @agisilaos!", "[Improved] Clone error message now suggests networking might be involved - #2872. Thanks @agisilaos!", "[Improved] Include push/pull progress information in the push/pull button tooltip - #2879", "[Improved] Allow publishing a brand new, empty repository - #2773", "[Improved] Make file paths in lists selectable - #2801. Thanks @artivilla!", "[Fixed] Disable LFS hook creation when cloning - #2809", "[Fixed] Use the new URL for the \"Show User Guides\" menu item - #2792. Thanks @db6edr!", "[Fixed] Make the SHA selectable when viewing commit details - #1154", "[Fixed] Windows: Make `github` CLI work in Git Bash - #2712", "[Fixed] Use the initial path provided when creating a new repository - #2883", "[Fixed] Windows: Avoid long path limits when discarding changes - #2833", "[Fixed] Files would get deleted when undoing the first commit - #2764", "[Fixed] Find the repository root before adding it - #2832", "[Fixed] Display warning about an existing folder before cloning - #2777 #2830", "[Fixed] Show contents of directory when showing a repository from Show in Explorer/Finder instead of showing the parent - #2798" ], "1.0.2-beta1": [ "[Improved] Clone error message now suggests networking might be involved - #2872. Thanks @agisilaos!", "[Improved] Include push/pull progress information in the push/pull button tooltip - #2879", "[Improved] Allow publishing a brand new, empty repository - #2773", "[Improved] Make file paths in lists selectable - #2801. Thanks @artivilla!", "[Fixed] Use the initial path provided when creating a new repository - #2883", "[Fixed] Windows: Avoid long path limits when discarding changes - #2833", "[Fixed] Files would get deleted when undoing the first commit - #2764", "[Fixed] Find the repository root before adding it - #2832", "[Fixed] Display warning about an existing folder before cloning - #2777 #2830", "[Fixed] Show contents of directory when showing a repository from Show in Explorer/Finder instead of showing the parent - #2798" ], "1.0.2-beta0": [ "[Improved] Message for GitHub Enterprise users when there is a network error - #2574. Thanks @agisilaos!", "[Fixed] Disable LFS hook creation when cloning - #2809", "[Fixed] Use the new URL for the \"Show User Guides\" menu item - #2792. Thanks @db6edr!", "[Fixed] Make the SHA selectable when viewing commit details - #1154", "[Fixed] Windows: Make `github` CLI work in Git Bash - #2712" ], "1.0.1": [ "[Improved] Message for GitHub Enterprise users when there is a network error - #2574. Thanks @agisilaos!", "[Fixed] Disable LFS hook creation when cloning - #2809", "[Fixed] Use the new URL for the \"Show User Guides\" menu item - #2792. Thanks @db6edr!", "[Fixed] Make the SHA selectable when viewing commit details - #1154", "[Fixed] Windows: Make `github` CLI work in Git Bash - #2712" ], "1.0.1-beta0": [ "[Fixed] Use the loading/disabled state while publishing - #1995", "[Fixed] Lock down menu item states for unborn repositories - #2744 #2573", "[Fixed] Windows: Detecting the available shells and editors when using a language other than English - #2735" ], "1.0.0": [ "[Fixed] Use the loading/disabled state while publishing - #1995", "[Fixed] Lock down menu item states for unborn repositories - #2744 #2573", "[Fixed] Windows: Detecting the available shells and editors when using a language other than English - #2735" ], "1.0.0-beta3": [ "[New] Allow users to create repositories with descriptions - #2719. Thanks @davidcelis!", "[New] Use `lfs clone` for faster cloning of LFS repositories - #2679", "[Improved] Prompt to override existing LFS filters - #2693", "[Fixed] Don't install LFS hooks when checking if a repo uses LFS - #2732", "[Fixed] Ensure nothing is staged as part of undoing the first commit - #2656", "[Fixed] \"Clone with Desktop\" wouldn't include the repository name in the path - #2704" ], "0.9.1": [ "[New] Allow users to create repositories with descriptions - #2719. Thanks @davidcelis!", "[New] Use `lfs clone` for faster cloning of LFS repositories - #2679", "[Improved] Prompt to override existing LFS filters - #2693", "[Fixed] Don't install LFS hooks when checking if a repo uses LFS - #2732", "[Fixed] Ensure nothing is staged as part of undoing the first commit - #2656", "[Fixed] \"Clone with Desktop\" wouldn't include the repository name in the path - #2704" ], "1.0.0-beta2": [ "[New] Allow users to create repositories with descriptions - #2719. Thanks @davidcelis!", "[New] Use `lfs clone` for faster cloning of LFS repositories - #2679", "[Improved] Prompt to override existing LFS filters - #2693", "[Fixed] Don't install LFS hooks when checking if a repo uses LFS - #2732", "[Fixed] Ensure nothing is staged as part of undoing the first commit - #2656", "[Fixed] \"Clone with Desktop\" wouldn't include the repository name in the path - #2704" ], "0.9.0": [ "[New] Allow users to create repositories with descriptions - #2719. Thanks @davidcelis!", "[New] Use `lfs clone` for faster cloning of LFS repositories - #2679", "[Improved] Prompt to override existing LFS filters - #2693", "[Fixed] Don't install LFS hooks when checking if a repo uses LFS - #2732", "[Fixed] Ensure nothing is staged as part of undoing the first commit - #2656", "[Fixed] \"Clone with Desktop\" wouldn't include the repository name in the path - #2704" ], "0.8.2": [ "[New] Ask to install LFS filters when an LFS repository is added - #2227", "[New] Clone GitHub repositories tab - #57", "[New] Option to opt-out of confirming discarding changes - #2681", "[Fixed] Long commit summary truncation - #1742", "[Fixed] Ensure the repository list is always enabled - #2648", "[Fixed] Windows: Detecting the available shells and editors when using a non-ASCII user encoding - #2624", "[Fixed] Clicking the \"Cancel\" button on the Publish Branch dialog - #2646", "[Fixed] Windows: Don't rely on PATH for knowing where to find chcp - #2678", "[Fixed] Relocating a repository now actually does that - #2685", "[Fixed] Clicking autocompletes inserts them - #2674", "[Fixed] Use shift for shortcut chord instead of alt - #2607", "[Fixed] macOS: \"Open in Terminal\" works with repositories with spaces in their path - #2682" ], "1.0.0-beta1": [ "[New] Option to to opt-out of confirming discarding changes - #2681", "[Fixed] Windows: Don't rely on PATH for knowing where to find chcp - #2678", "[Fixed] Relocating a repository now actually does that - #2685", "[Fixed] Clicking autocompletes inserts them - #2674", "[Fixed] Use shift for shortcut chord instead of alt - #2607", "[Fixed] macOS: \"Open in Terminal\" works with repositories with spaces in their path - #2682" ], "1.0.0-beta0": [ "[New] Ask to install LFS filters when an LFS repository is added - #2227", "[New] Clone GitHub repositories tab - #57", "[Fixed] Long commit summary truncation - #1742", "[Fixed] Ensure the repository list is always enabled - #2648", "[Fixed] Windows: Detecting the available shells and editors when using a non-ASCII user encoding - #2624", "[Fixed] Clicking the \"Cancel\" button on the Publish Branch dialog - #2646" ], "0.8.1": [ "[New] 'Open in Shell' now supports multiple shells - #2473", "[New] Windows: Enable adding self-signed certificates - #2581", "[Improved] Enhanced image diffs - #2383", "[Improved] Line diffs - #2461", "[Improved] Octicons updated - #2495", "[Improved] Adds ability to close repository list using shortcut - #2532", "[Improved] Switch default buttons in the Publish Branch dialog - #2515", "[Improved] Bring back \"Contact Support\" - #1472", "[Improved] Persist repository filter text after closing repository list - #2571", "[Improved] Redesigned example commit in the Welcome flow - #2141", "[Improved] Tidy up initial \"external editor\" experience - #2551", "[Fixed] 'Include All' checkbox not in sync with partial selection - #2493", "[Fixed] Copied text from diff removed valid characters - #2499", "[Fixed] Click-focus on Windows would dismiss dialog - #2488", "[Fixed] Branch list not rendered in app - #2531", "[Fixed] Git operations checking certificate store - #2520", "[Fixed] Properly identify repositories whose remotes have a trailing slash - #2584", "[Fixed] Windows: Fix launching the `github` command line tool - #2563", "[Fixed] Use the primary email address if it's public - #2244", "[Fixed] Local branch not checked out after clone - #2561", "[Fixed] Only the most recent 30 issues would autocomplete for GitHub Enterprise repositories - #2541", "[Fixed] Missing \"View on GitHub\" menu item for non-Gitub repositories - #2615", "[Fixed] New tab opened when pressing \"]\" for certain keyboard layouts - #2607", "[Fixed] Windows: Crash when exiting full screen - #1502", "[Fixed] Windows: Detecting the available shells and editors when using a non-ASCII user encoding - #2624", "[Fixed] Ensure the repository list is always accessible - #2648" ], "0.8.1-beta4": [ "[Improved] Persist repository filter text after closing repository list - #2571", "[Improved] Redesigned example commit in the Welcome flow - #2141", "[Improved] Tidy up initial \"external editor\" experience - #2551", "[Fixed] Missing \"View on GitHub\" menu item for non-Gitub repositories - #2615", "[Fixed] New tab opened when pressing \"]\" for certain keyboard layouts - #2607", "[Fixed] Windows: Crash when exiting full screen - #1502" ], "0.8.1-beta3": [ "[New] Windows: Enable adding self-signed certificates - #2581", "[Improved] Adds ability to close repository list using shortcut - #2532", "[Improved] Switch default buttons in the Publish Branch dialog - #2515", "[Improved] Bring back \"Contact Support\" - #1472", "[Fixed] Properly identify repositories whose remotes have a trailing slash - #2584", "[Fixed] Windows: Fix launching the `github` command line tool - #2563", "[Fixed] Use the primary email address if it's public - #2244", "[Fixed] Local branch not checked out after clone - #2561", "[Fixed] Only the most recent 30 issues would autocomplete for GitHub Enterprise repositories - #2541" ], "0.8.1-beta2": [ "[Fixed] Branch list not rendered in app - #2531", "[Fixed] Git operations checking certificate store - #2520" ], "0.8.1-beta1": [ "[New] 'Open in Shell' now supports multiple shells - #2473", "[Improved] Enhanced image diffs - #2383", "[Improved] Line diffs - #2461", "[Improved] Octicons updated - #2495", "[Fixed] 'Include All' checkbox not in sync with partial selection - #2493", "[Fixed] Copied text from diff removed valid characters - #2499", "[Fixed] Click-focus on Windows would dismiss dialog - #2488" ], "0.8.1-beta0": [], "0.8.0": [ "[New] Added commit context menu - #2434", "[New] Added 'Open in External Editor' - #2009", "[New] Can choose whether a branch should be deleted on the remote as well as locally - #2136", "[New] Support authenticating with non-GitHub servers - #852", "[New] Added the ability to revert a commit - #752", "[New] Added a keyboard shortcut for opening the repository in the shell - #2138", "[Improved] Copied diff text no longer includes the line changetype markers - #1499", "[Improved] Fetch if a push fails because they need to pull first - #2431", "[Improved] Discard changes performance - #1889", "[Fixed] Show 'Add Repository' dialog when repository is dragged onto the app - #2442", "[Fixed] Dialog component did not remove event handler - #2469", "[Fixed] Open in External Editor context menu - #2475", "[Fixed] Update to Git 2.14.1 to fix security vulnerability - #2432", "[Fixed] Recent branches disappearing after renaming a branch - #2426", "[Fixed] Changing the default branch on GitHub.com is now reflected in the app - #1489", "[Fixed] Swap around some callouts for no repositories - #2447", "[Fixed] Darker unfocused selection color - #1669", "[Fixed] Increase the max sidebar width - #1588", "[Fixed] Don't say \"Publish this branch to GitHub\" for non-GitHub repositories - #1498", "[Fixed] macOS: Protocol schemes not getting registered - #2429", "[Fixed] Patches which contain the \"no newline\" marker would fail to apply - #2123", "[Fixed] Close the autocompletion popover when it loses focus - #2358", "[Fixed] Clear the selected org when switching Publish Repository tabs - #2386", "[Fixed] 'Create Without Pushing' button throwing an exception while opening a pull request - #2368", "[Fixed] Windows: Don't removing the running app out from under itself when there are updates pending - #2373", "[Fixed] Windows: Respect `core.autocrlf` and `core.safeclrf` when modifying the .gitignore - #1535", "[Fixed] Windows: Fix opening the app from the command line - #2396" ], "0.7.3-beta5": [], "0.7.3-beta4": [], "0.7.3-beta3": [], "0.7.3-beta2": [], "0.7.3-beta1": [], "0.7.3-beta0": [], "0.7.2": ["[Fixed] Issues with auto-updating to 0.7.1."], "0.7.2-beta0": [], "0.7.1": [ "[Improved] Redesigned error and warning dialogs to be clearer - #2277", "[Improved] Create Pull Request dialog shows more feedback while it's working - #2265", "[Improved] Version text is now copiable - #1935", "[Fixed] Preserve existing GitHub API information when API requests fail - #2282", "[Fixed] Pass through error messages as received from the API - #2279", "[Fixed] The Pull and Create Pull Request menu items had the same shortcut - #2274", "[Fixed] Launching the `github` command line tool from a Fish shell - #2299", "[Fixed] Help menu items now work - #2314", "[Fixed] Windows: `github` command line tool not installing after updating - #2312", "[Fixed] Caret position jumping around while changing the path for adding a local repository - #2222", "[Fixed] Error dialogs being closed too easily - #2211", "[Fixed] Windows: Non-ASCII credentials were mangled - #189" ], "0.7.1-beta5": [ "[Improved] Redesigned error and warning dialogs to be clearer - #2277", "[Improved] Create Pull Request dialog shows more feedback while it's working - #2265", "[Fixed] Preserve existing GitHub API information when API requests fail - #2282", "[Fixed] Pass through error messages as received from the API - #2279", "[Fixed] The Pull and Create Pull Request menu items had the same shortcut - #2274", "[Fixed] Launching the `github` command line tool from a Fish shell - #2299", "[Fixed] Help menu items now work - #2314", "[Fixed] Windows: `github` command line tool not installing after updating - #2312", "[Fixed] Caret position jumping around while changing the path for adding a local repository - #2222", "[Fixed] Error dialogs being closed too easily - #2211", "[Fixed] Windows: Non-ASCII credentials were mangled - #189" ], "0.7.1-beta4": [], "0.7.1-beta3": [], "0.7.1-beta2": [], "0.7.1-beta1": [], "0.7.1-beta0": [ "[Improved] Redesigned error and warning dialogs to be clearer - #2277", "[Fixed] Preserve existing GitHub API information when API requests fail - #2282", "[Fixed] Pass through error messages as received from the API - #2279", "[Fixed] The Pull and Create Pull Request menu items had the same shortcut - #2274", "[Fixed] Launching the `github` command line tool from a Fish shell - #2299" ], "0.7.0": [ "[New] Added the Branch > Create Pull Request menu item - #2135", "[New] Added the `github` command line tool - #696", "[Improved] Better error message when publishing a repository fails - #2089", "[Improved] Windows: Don't recreate the desktop shortcut if it's been deleted - #1759", "[Fixed] Cloning a repository's wiki - #1624", "[Fixed] Don't call GitHub Enterprise GitHub.com - #2094", "[Fixed] Don't push after publishing a new repository if the branch is unborn - #2086", "[Fixed] Don't close dialogs when clicking the title bar - #2056", "[Fixed] Windows: Clicking 'Show in Explorer' doesn't bring Explorer to the front - #2127", "[Fixed] Windows: Opening links doesn't bring the browser to the front - #1945", "[Fixed] macOS: Closing the window wouldn't exit fullscreen - #1901", "[Fixed] Scale blankslate images so they look nicer on high resolution displays - #1946", "[Fixed] Windows: Installer not completing or getting stuck in a loop - #1875 #1863", "[Fixed] Move the 'Forgot Password' link to fix the tab order of the sign in view - #2200" ], "0.6.3-beta7": [], "0.6.3-beta6": [], "0.6.3-beta5": [], "0.6.3-beta4": [], "0.6.3-beta3": [], "0.6.3-beta2": [], "0.6.3-beta1": [], "0.6.3-beta0": [], "0.6.2": [ "[New] Link to User Guides from the Help menu - #1963", "[New] Added the 'Open in External Editor' contextual menu item to changed files - #2023", "[New] Added the 'Show' and 'Open Command Prompt' contextual menu items to repositories - #1554", "[New] Windows: Support self-signed or untrusted certificates - #671", "[New] Copy the SHA to the clipboard when clicked - #1501", "[Improved] Provide the option of initializing a new repository when adding a directory that isn't already one - #969", "[Improved] Link to the working directory when there are no changes - #1871", "[Improved] Hitting Enter when selecting a base branch creates the new branch - #1780", "[Improved] Prefix repository names with their owner if they are ambiguous - #1848", "[Fixed] Sort and filter licenses like GitHub.com - #1987", "[Fixed] Long branch names not getting truncated in the Rename Branch dialog - #1891", "[Fixed] Prune old log files - #1540", "[Fixed] Ensure the local path is valid before trying to create a new repository - #1487", "[Fixed] Support cloning repository wikis - #1624", "[Fixed] Disable the Select All checkbox when there are no changes - #1389", "[Fixed] Changed docx files wouldn't show anything in the diff panel - #1990", "[Fixed] Disable the Merge button when there are no commits to merge - #1359", "[Fixed] Username/password authentication not working for GitHub Enterprise - #2064", "[Fixed] Better error messages when an API call fails - #2017", "[Fixed] Create the 'logs' directory if it doesn't exist - #1550", "[Fixed] Enable the 'Remove' menu item for missing repositories - #1776" ], "0.6.1": [ "[Fixed] Properly log stats opt in/out - #1949", "[Fixed] Source maps for exceptions in the main process - #1957", "[Fixed] Styling of the exception dialog - #1956", "[Fixed] Handle ambiguous references - #1947", "[Fixed] Handle non-ASCII text in diffs - #1970", "[Fixed] Uncaught exception when hitting the arrow keys after showing autocompletions - #1971", "[Fixed] Clear the organizations list when publishing a new repository and switching between tabs - #1969", "[Fixed] Push properly when a tracking branch has a different name from the local branch - #1967", "[Improved] Warn when line endings will change - #1906" ], "0.6.0": [ "[Fixed] Issue autocompletion not working for older issues - #1814", "[Fixed] GitHub repository association not working for repositories with some remote URL formats - #1826 #1679", "[Fixed] Don't try to delete a remote branch that no longer exists - #1829", "[Fixed] Tokens created by development builds would be used in production builds but wouldn't work - #1727", "[Fixed] Submodules can now be added - #708", "[Fixed] Properly handle the case where a file is added to the index but removed from the working tree - #1310", "[Fixed] Use a local image for the default avatar - #1621", "[Fixed] Make the file path in diffs selectable - #1768", "[Improved] More logging! - #1823", "[Improved] Better error message when trying to add something that's not a repository - #1747", "[Improved] Copy the shell environment into the app's environment - #1796", "[Improved] Updated to Git 2.13.0 - #1897", "[Improved] Add 'Reveal' to the contextual menu for changed files - #1566", "[Improved] Better handling of large diffs - #1818 #1524", "[Improved] App launch time - #1900" ], "0.5.9": [ "[New] Added Zoom In and Zoom Out - #1217", "[Fixed] Various errors when on an unborn branch - #1450", "[Fixed] Disable push/pull menu items when there is no remote - #1448", "[Fixed] Better error message when the GitHub Enterprise version is too old - #1628", "[Fixed] Error parsing non-JSON responses - #1505 #1522", "[Fixed] Updated the 'Install Git' help documentation link - #1797", "[Fixed] Disable menu items while in the Welcome flow - #1529", "[Fixed] Windows: Fall back to HOME if Document cannot be found - #1825", "[Improved] Close the window when an exception occurs - #1562", "[Improved] Always use merge when pulling - #1627", "[Improved] Move the 'New Branch' menu item into the Branch menu - #1757", "[Improved] Remove Repository's default button is now Cancel - #1751", "[Improved] Only fetch the default remote - #1435", "[Improved] Faster commits with many files - #1405", "[Improved] Measure startup time more reliably - #1798", "[Improved] Prefer the GitHub repository name instead of the name on disk - #664" ], "0.5.8": [ "[Fixed] Switching tabs in Preferences/Settings or Repository Settings would close the dialog - #1724", "[Improved] Standardized colors which improves contrast and readability - #1713" ], "0.5.7": [ "[Fixed] Windows: Handle protocol events which launch the app - #1582", "[Fixed] Opting out of stats reporting in the Welcome flow - #1698", "[Fixed] Commit description text being too light - #1695", "[Fixed] Exception on startup if the app was activated too quickly - #1564", "[Improved] Default directory for cloning now - #1663", "[Improved] Accessibility support - #1289", "[Improved] Lovely blank slate illustrations - #1708" ], "0.5.6": [ "[Fixed] macOS: The buttons in the Untrusted Server dialog not doing anything - #1622", "[Fixed] Better warning in Rename Branch when the branch will be created with a different name than was entered - #1480", "[Fixed] Provide a tooltip for commit summaries in the History list - #1483", "[Fixed] Prevent the Update Available banner from getting squished - #1632", "[Fixed] Title bar not responding to double-clicks - #1590 #1655", "[Improved] Discard All Changes is now accessible by right-clicking the file column header - #1635" ], "0.5.5": [ "[Fixed] Save the default path after creating a new repository - #1486", "[Fixed] Only let the user launch the browser once for the OAuth flow - #1427", "[Fixed] Don't linkify invalid URLs - #1456", "[Fixed] Excessive padding in the Merge Branch dialog - #1577", "[Fixed] Octicon pixel alignment issues - #1584", "[Fixed] Windows: Invoking some menu items would break the window's snapped state - #1603", "[Fixed] macOS: Errors authenticating while pushing - #1514", "[Fixed] Don't linkify links in the History list or in Undo - #1548 #1608 #1474", "[Fixed] Diffs not working when certain git config values were set - #1559" ], "0.5.4": [ "[Fixed] The release notes URL pointed to the wrong page - #1503", "[Fixed] Only create the `logs` directory if it doesn't already exist - #1510", "[Fixed] Uncaught exception creating a new repository if you aren't a member of any orgs - #1507", "[Fixed] Only report the first uncaught exception - #1517", "[Fixed] Include the name of the default branch in the New Branch dialog - #1449", "[Fixed] Uncaught exception if a network error occurred while loading user email addresses - #1522 #1508", "[Fixed] Uncaught exception while performing a contextual menu action - #1532", "[Improved] Move all error logging to the main process - #1473", "[Improved] Stats reporting reliability - #1561" ], "0.5.3": [ "[Fixed] Display of large image diffs - #1494", "[Fixed] Discard Changes spacing - #1495" ], "0.5.2": [ "[Fixed] Display errors that happen while publishing a repository - #1396", "[Fixed] Menu items not updating - #1462", "[Fixed] Always select the first changed file - #1306", "[Fixed] macOS: Use Title Case consistently - #1477 #1481", "[Fixed] Create Branch padding - #1479", "[Fixed] Bottom padding in commit descriptions - #1345", "[Improved] Dialog polish - #1451", "[Improved] Store logs in a logs directory - #1370", "[Improved] New Welcome illustrations - #1471", "[Improved] Request confirmation before removing a repository - #1233", "[Improved] Windows icon polish - #1457" ], "0.5.1": [ "[New] Windows: A nice little gif while installing the app - #1440", "[Fixed] Disable pinch zoom - #1431", "[Fixed] Don't show carriage return indicators in diffs - #1444", "[Fixed] History wouldn't update after switching branches - #1446", "[Improved] Include more information in exception reports - #1429", "[Improved] Updated Terms and Conditions - #1438", "[Improved] Sub-pixel anti-aliasing in some lists - #1452", "[Improved] Windows: A new application identifier, less likely to collide with other apps - #1441" ], "0.5.0": [ "[Added] Menu item for showing the app logs - #1349", "[Fixed] Don't let the two-factor authentication dialog be submitted while it's empty - #1386", "[Fixed] Undo Commit showing the wrong commit - #1373", "[Fixed] Windows: Update the icon used for the installer - #1410", "[Fixed] Undoing the first commit - #1401", "[Fixed] A second window would be opened during the OAuth dance - #1382", "[Fixed] Don't include the comment from the default merge commit message - #1367", "[Fixed] Show progress while committing - #923", "[Fixed] Windows: Merge Branch sizing would be wrong on high DPI monitors - #1210", "[Fixed] Windows: Resize the app from the top left corner - #1424", "[Fixed] Changing the destination path for cloning a repository now appends the repository's name - #1408", "[Fixed] The blank slate view could be visible briefly when the app launched - #1398", "[Improved] Performance updating menu items - #1321", "[Improved] Windows: Dim the title bar when the app loses focus - #1189" ], "0.0.39": ["[Fixed] An uncaught exception when adding a user - #1394"], "0.0.38": [ "[New] Shiny new icon! - #1221", "[New] More helpful blank slate view - #871", "[Fixed] Don't allow Undo while pushing/pulling/fetching - #1047", "[Fixed] Updating the default branch on GitHub wouldn't be reflected in the app - #1028 #1314", "[Fixed] Long repository names would overflow their container - #1331", "[Fixed] Removed development menu items in production builds - #1031 #1251 #1323 #1340", "[Fixed] Create Branch no longer changes as it's animating closed - #1304", "[Fixed] Windows: Cut / Copy / Paste menu items not working - #1379", "[Improved] Show a better error message when the user tries to authenticate with a personal access token - #1313", "[Improved] Link to the repository New Issue page from the Help menu - #1349", "[Improved] Clone in Desktop opens the Clone dialog - #918" ], "0.0.37": [ "[Fixed] Better display of the 'no newline at end of file' indicator - #1253", "[Fixed] macOS: Destructive dialogs now use the expected button order - #1315", "[Fixed] Display of submodule paths - #785", "[Fixed] Incomplete stats submission - #1337", "[Improved] Redesigned welcome flow - #1254", "[Improved] App launch time - #1225", "[Improved] Handle uncaught exceptions - #1106" ], "0.0.36": [ "[Fixed] Bugs around associating an email address with a GitHub user - #975", "[Fixed] Use the correct reference name for an unborn branch - #1283", "[Fixed] Better diffs for renamed files - #980", "[Fixed] Typo in Create Branch - #1303", "[Fixed] Don't allow whitespace-only branch names - #1288", "[Improved] Focus ring polish - #1287", "[Improved] Less intrusive update notifications - #1136", "[Improved] Faster launch time on Windows - #1309", "[Improved] Faster git information refreshing - #1305", "[Improved] More consistent use of sentence case on Windows - #1316", "[Improved] Autocomplete polish - #1241" ], "0.0.35": [ "[New] Show push/pull/fetch progress - #1238", "[Fixed] macOS: Add the Zoom menu item - #1260", "[Fixed] macOS: Don't show the titlebar while full screened - #1247", "[Fixed] Windows: Updates would make the app unresponsive - #1269", "[Fixed] Windows: Keyboard navigation in menus - #1293", "[Fixed] Windows: Repositories list item not working - #1293", "[Fixed] Auto updater errors not being propagated properly - #1266", "[Fixed] Only show the current branch tooltip on the branches button - #1275", "[Fixed] Double path truncation - #1270", "[Fixed] Sometimes toggling a file's checkbox would get undone - #1248", "[Fixed] Uncaught exception when internet connectivity was lost - #1048", "[Fixed] Cloned repositories wouldn't be associated with their GitHub repository - #1285", "[Improved] Better performance on large repositories - #1281", "[Improved] Commit summary is now expandable when the summary is long - #519", "[Improved] The SHA in historical commits is now selectable - #1154", "[Improved] The Create Branch dialog was polished and refined - #1137" ], "0.0.34": [ "[New] macOS: Users can choose whether to accept untrusted certificates - #671", "[New] Windows: Users are prompted to install git when opening a shell if it is not installed - #813", "[New] Checkout progress is shown if branch switching takes a while - #1208", "[New] Commit summary and description are automatically populated for merge conflicts - #1228", "[Fixed] Cloning repositories while not signed in - #1163", "[Fixed] Merge commits are now created as merge commits - #1216", "[Fixed] Display of diffs with /r newline - #1234", "[Fixed] Windows: Maximized windows are no longer positioned slightly off screen - #1202", "[Fixed] JSON parse errors - #1243", "[Fixed] GitHub Enterprise repositories were not associated with the proper Enterprise repository - #1242", "[Fixed] Timestamps in the Branches list would wrap - #1255", "[Fixed] Merges created from pulling wouldn't use the right git author - #1262", "[Improved] Check for update errors are suppressed if they happen in the background - #1104, #1195", "[Improved] The shortcut to show the repositories list is now command or control-T - #1220", "[Improved] Command or control-W now closes open dialogs - #949", "[Improved] Less memory usage while parsing large diffs - #1235" ], "0.0.33": ["[Fixed] Update Now wouldn't update now - #1209"], "0.0.32": [ "[New] You can now disable stats reporting from Preferences > Advanced - #1120", "[New] Acknowledgements are now available from About - #810", "[New] Open pull requests from dot com in the app - #808", "[Fixed] Don't show background fetch errors - #875", "[Fixed] No more surprise and delight - #620", "[Fixed] Can't discard renamed files - #1177", "[Fixed] Logging out of one account would log out of all accounts - #1192", "[Fixed] Renamed files truncation - #695", "[Fixed] Git on Windows now integrates with the system certificate store - #706", "[Fixed] Cloning with an account/repoository shortcut would always fail - #1150", "[Fixed] OS version reporting - #1130", "[Fixed] Publish a new repository would always fail - #1046", "[Fixed] Authentication would fail for the first repository after logging in - #1118", "[Fixed] Don't flood the user with errors if a repository disappears on disk - #1132", "[Improved] The Merge dialog uses the Branches list instead of a drop down menu - #749", "[Improved] Lots of design polish - #1188, #1183, #1170, #1184, #1181, #1179, #1142, #1125" ], "0.0.31": [ "[New] Prompt user to login when authentication error occurs - #903", "[New] Windows application has a new app menu, replaces previous hamburger menu - #991", "[New] Refreshed colours to align with GitHub website scheme - #1077", "[New] Custom about dialog on all platforms - #1102", "[Fixed] Improved error handling when probing for a GitHub Enterprise server - #1026", "[Fixed] User can cancel 2FA flow - #1057", "[Fixed] Tidy up current set of menu items - #1063", "[Fixed] Manually focus the window when a URL action has been received - #1072", "[Fixed] Disable middle-click event to prevent new windows being launched - #1074", "[Fixed] Pre-fill the account name in the Welcome wizard, not login - #1078", "[Fixed] Diffs wouldn't work if an external diff program was configured - #1123", "[Improved] Lots of design polish work - #1113, #1099, #1094, #1077" ], "0.0.30": [ "[Fixed] Crash when invoking menu item due to incorrect method signature - #1041" ], "0.0.29": [ "[New] Commit summary and description fields now display issues and mentions as links for GitHub repositories - #941", "[New] Show placeholder when the repository cannot be found on disk - #946", "[New] New Repository actions moved out of popover and into new menu - #1018", "[Fixed] Display a helpful error message when an unverified user signs into GitHub Desktop - #1010", "[Fixed] Fix kerning issue when access keys displayed - #1033", "[Fixed] Protected branches show a descriptive error when the push is rejected - #1036", "[Fixed] 'Open in shell' on Windows opens to repository location - #1037" ], "0.0.28": ["[Fixed] Bumping release notes to test deployments again"], "0.0.27": [ "[Fixed] 2FA dialog when authenticating has information for SMS authentication - #1009", "[Fixed] Autocomplete for users handles accounts containing `-` - #1008" ], "0.0.26": [ "[Fixed] Address deployment issue by properly documenting release notes" ], "0.0.25": [ "[Added] Autocomplete displays user matches - #942", "[Fixed] Handle Enter key in repository and branch list when no matches exist - #995", "[Fixed] 'Add Repository' button displays in dropdown when repository list empty - #984", "[Fixed] Correct icon displayed for non-GitHub repository - #964 #955", "[Fixed] Enter key when inside dialog submits form - #956", "[Fixed] Updated URL handler entry on macOS - #945", "[Fixed] Commit button is disabled while commit in progress - #940", "[Fixed] Handle index state change when gitginore change is discarded - #935", "[Fixed] 'Create New Branch' view squashes branch list when expanded - #927", "[Fixed] Application creates repository path if it doesn't exist on disk - #925", "[Improved] Preferences sign-in flow updated to standalone dialogs - #961" ], "0.0.24": ["Changed a thing", "Added another thing"] } }
Ronald106
<!doctype html> <html lang='en'> <head> <!-- Meta Properties --> <meta charset='UTF-8'> <title>surviv.io - 2d battle royale game</title> <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover, user-scalable=no"> <link rel="manifest" href="manifest.json"> <meta name="mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-title" content="surviv.io"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="application-name" content="surviv.io"> <meta name="description" content="Like games such as Player Unknown's Battlegrounds (PUBG), Fortnite or Apex Legends? Play this free 2d battle royale io game in your browser!"> <meta property="og:description" content="Like games such as Player Unknown's Battlegrounds (PUBG), Fortnite or Apex Legends? Play this free 2d battle royale io game in your browser!"> <meta name="keywords" content="survivio, surviv, 2d battle royale, io, battle royale browser game, 2d battlegrounds, battlegrounds, battleroyale, battle, royale, browser game, br, survival, game, web game, multiplayer"> <meta property="og:type" content="website"> <meta property="og:title" content="surviv.io"> <meta property="og:url" content="/~/https://surviv.io/"> <meta property="og:site_name" content="surviv.io"> <meta content="/~/https://surviv.io/img/title.png" property="og:image"> <link rel="canonical" href="/~/https://surviv.io" /> <link rel="apple-touch-icon-precomposed" href="img/icon_app.png"> <link rel="icon" href="favicon.ico" type="image/x-icon"> <!-- Global site tag (gtag.js) - Google Analytics --> <script> window.adsBlocked = false; window.adBlockDetected = function() { window.adsBlocked = true; } window.alert = function() { } /* Cookie consent */ var cfg = {}; var consented = true; var webview = false; try { cfg = JSON.parse(localStorage.getItem('surviv_config')) || {}; if (cfg.cookiesConsented != undefined) { consented = cfg.cookiesConsented; } webview = localStorage.getItem('surviv_webview'); } catch (e) { } window.cookiesConsented = consented; if (window.cookiesConsented) { document.write("<script async src='/~/https://www.googletagmanager.com/gtag/js?id=UA-108811301-1' onerror='adBlockDetected();'>\x3C/script>"); window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-108811301-1', { 'anonymize_ip': true }); } window.webviewDetected = new RegExp("[?&]webview=true","gi").test(window.location.href) || webview; </script> <!-- AIP --> <script> document.write("<script async src='/~/https://api.adinplay.com/libs/aiptag/pub/SRV/surviv.io/tag.min.js'>\x3C/script>"); var aiptag = aiptag || {}; aiptag.gdprConsent = window.cookiesConsented; aiptag.consented = window.cookiesConsented; aiptag.cmd = aiptag.cmd || []; aiptag.cmd.display = aiptag.cmd.display || []; </script> <!-- Fonts --> <link href="/~/https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700" rel="stylesheet"> <link href="css/app.dacc77a5.css" rel="stylesheet"><meta name="ROBOTS" content="NOINDEX, NOFOLLOW"/> </head> <body> <div id='preroll-wrapper'> <div id="preroll"></div> </div> <div id="fb-root"></div> <canvas tabindex='1' id='cvs'></canvas> <div id='game-area-wrapper' style='display: none' oncontextmenu='return false;'> <div id='game-touch-area'></div> <!-- Class Select --> <div id='ui-role-menu-wrapper'> <div id='ui-role-menu'> <div id='ui-role-header'></div> <div id='ui-role-body'></div> <div id='ui-role-footer'> <div id='ui-role-footer-desc' data-l10n='game-select-class'>SELECT A CLASS</div> <div id='ui-role-footer-enter'>ENTER GAME (20)</div> </div> </div> </div> <div id='ui-game' class='click-through'> <div id='tablet-console'></div> <div id='ui-center'> <div id='ui-game-menu'> <div id='btn-game-tabs' class='btns-game-double-row'> <div class='btn-game-container'> <a id='btn-game-settings' class='btn-game-tab-select btn-game-menu btn-game-menu-selected btn-darken' data-tab='settings'></a> <div class='btn-double-row game-menu-icon-static settings-icon'></div> </div> <div class='btn-game-container'> <a id='btn-game-keybinds' class='btn-game-tab-select btn-game-menu btn-darken' data-tab='keybinds'></a> <div class='btn-double-row game-menu-icon-static keybind-icon'></div> </div> </div> <div id='ui-game-tab-settings' class='ui-game-tab'> <a id='btn-game-fullscreen' class='btn-fullscreen-toggle btn-game-menu btn-darken' data-l10n='game-full-screen'>Full Screen</a> <div id='btn-touch-styles' class='btns-game-double-row'> <div class='btn-game-container'> <a id='btn-game-move-style' class='btn-double-row btn-game-touch-style btn-darken'></a> <div class='btn-double-row game-menu-icon-toggle movement-icon'></div> </div> <div class='btn-game-container'> <a id='btn-game-aim-style' class='btn-double-row btn-game-touch-style btn-darken'></a> <div class='btn-double-row game-menu-icon-toggle target-icon'></div> </div> </div> <a id='btn-game-aim-line' class='btn-game-menu btn-darken locked-on-icon' data-l10n='game-aim-line'>Aim Line</a> <a id='btn-game-sound' class='btn-sound-toggle btn-game-menu btn-darken audio-on-icon' data-l10n='game-sound'>Sound</a> <div class="slider-container ui-slider-container"> <p class='slider-text' data-l10n='index-master-volume'>Master Volume</p> <input type="range" min="0" max="100" value="100" class="slider sl-master-volume"> </div> <div class="slider-container ui-slider-container"> <p class='slider-text' data-l10n='index-sfx-volume'>SFX Volume</p> <input type="range" min="0" max="100" value="100" class="slider sl-sound-volume"> </div> <div class="slider-container ui-slider-container"> <p class='slider-text' data-l10n='index-music-volume'>Music Volume</p> <input type="range" min="0" max="100" value="100" class="slider sl-music-volume"> </div> <a id='btn-game-quit' class='btn-quit btn-game-menu btn-darken' data-l10n='game-quit-game'>Quit Game</a> </div> <div id='ui-game-tab-keybinds' class='ui-game-tab'> <div id='ui-keybind-list' class='js-keybind-list'></div> <a class='js-btn-keybind-restore btn-keybind-restore btn-game-menu btn-darken' data-l10n='game-restore-defaults'>Restore Defaults</a> </div> <a id='btn-game-resume' class='btn-game-menu btn-darken' data-l10n='game-return-to-game'>Return to Game</a> </div> </div> <div id='big-map' class='js-ui-map-show'> <div id='big-map-collision'></div> <div id='big-map-close'></div> </div> <div id='ui-emotes' class='ui-emote-wheel'> <div id='ui-emote-middle' class='ui-emote-middle ui-emote-circle ui-emote-parent' data-key='middle' data-id='0'> <div class='ui-emote ui-emote-bg-circle'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-emote-top' class='ui-emote-top ui-emote-quarter ui-emote-parent' data-key='top' data-id='1'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-emote-right' class='ui-emote-right ui-emote-quarter ui-emote-parent' data-key='right' data-id='2'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-emote-bottom' class='ui-emote-bottom ui-emote-quarter ui-emote-parent' data-key='bottom' data-id='3'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-emote-left' class='ui-emote-left ui-emote-quarter ui-emote-parent' data-key='left' data-id='4'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> </div> <div id='ui-team-pings' class='ui-emote-wheel'> <div id='ui-team-ping-middle' class='ui-emote-middle ui-emote-circle ui-emote-parent' data-id='0'> <div class='ui-emote ui-emote-bg-circle'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-team-ping-top' class='ui-emote-top ui-emote-quarter ui-emote-parent' data-id='1'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-team-ping-right' class='ui-emote-right ui-emote-quarter ui-emote-parent' data-id='2'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-team-ping-bottom' class='ui-emote-bottom ui-emote-quarter ui-emote-parent' data-id='3'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-large'></div> </div> <div id='ui-team-ping-bottom-left' class='ui-emote-bottom-left ui-emote-eighth ui-emote-parent' data-id='4'> <div class='ui-emote ui-emote-bg-eighth'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-small'></div> </div> <div id='ui-team-ping-top-left' class='ui-emote-top-left ui-emote-eighth ui-emote-parent' data-id='5'> <div class='ui-emote ui-emote-bg-eighth'></div> <div class='ui-emote ui-emote-hl'></div> <div class='ui-emote-image ui-emote-image-small'></div> </div> </div> <div id='ui-team-indicators' class='js-ui-map-hidden js-desktop-ui-hud-show'> <div class='ui-team-indicator ui-indicator-main' data-id='0'> <div class='ui-team-indicator-pos ui-background-yellow'></div> </div> <div class='ui-team-indicator ui-indicator-main' data-id='1'> <div class='ui-team-indicator-pos ui-background-purple'></div> </div> <div class='ui-team-indicator ui-indicator-main' data-id='2'> <div class='ui-team-indicator-pos ui-background-cyan'></div> </div> <div class='ui-team-indicator ui-indicator-main' data-id='3'> <div class='ui-team-indicator-pos ui-background-orange'></div> </div> <div class='ui-team-indicator ui-indicator-main' data-id='4'> <div class='ui-team-indicator-pos ui-background-yellow'></div> </div> <div class='ui-team-indicator ui-indicator-ping' data-id='0'> <div class='ui-team-indicator-pos ui-team-indicator-image'></div> </div> <div class='ui-indicator-ping-border' data-id='0'></div> <div class='ui-team-indicator ui-indicator-ping' data-id='1'> <div class='ui-team-indicator-pos ui-team-indicator-image'></div> </div> <div class='ui-indicator-ping-border' data-id='1'></div> <div class='ui-team-indicator ui-indicator-ping' data-id='2'> <div class='ui-team-indicator-pos ui-team-indicator-image'></div> </div> <div class='ui-indicator-ping-border' data-id='2'></div> <div class='ui-team-indicator ui-indicator-ping' data-id='3'> <div class='ui-team-indicator-pos ui-team-indicator-image'></div> </div> <div class='ui-indicator-ping-border' data-id='3'></div> <div class='ui-team-indicator ui-indicator-ping' data-id='4'> <div class='ui-team-indicator-pos ui-team-indicator-image'></div> </div> <div class='ui-indicator-ping-border' data-id='4'></div> </div> <div id='ui-right-center' class='ui-right-center-desktop js-ui-map-hidden'> <div id='ui-medical-interactive'> <div id='ui-loot-bandage' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-bandage'>Bandage</div> <div class='tooltip-description'><span data-l10n='game-bandage-tooltip'>Left-click to restore 15 health.</span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> <div id='ui-loot-healthkit' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-healthkit'>Med Kit</div> <div class='tooltip-description'><span data-l10n='game-healthkit-tooltip'>Left-click to restore 100 health.</div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> <div id='ui-loot-soda' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-soda'>Soda</div> <div class='tooltip-description'><span data-l10n='game-soda-tooltip'>Left-click to boost adrenaline by 25.</span><br><span data-l10n='game-adrenaline-tooltip'>Adrenaline restores health over time.</span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> <div id='ui-loot-chocolateBox' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-chocolateBox'>ChocolateBox</div> <div class='tooltip-description'><span data-l10n='game-soda-tooltip'>Left-click to boost adrenaline by 25.</span><br><span data-l10n='game-adrenaline-tooltip'>Adrenaline restores health over time.</span><br><span data-l10n='game-chocolateBox-tooltip'>Inmune to frenemy effect for 20s.</span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> <div id='ui-loot-painkiller' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-painkiller'>Pills</div> <div class='tooltip-description'><span data-l10n='game-painkiller-tooltip'>Left-click to boost adrenaline by 50.</div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> <div id='ui-loot-flask' class='ui-loot ui-outline-hover ui-scale-hover ui-medical tooltip'> <div class='tooltip-text'> <div class='tooltip-title' data-l10n='game-flask'>Flask</div> <div class='tooltip-description'><span data-l10n='game-flask-tooltip'>Left-click for freeze damage immunity for 20 seconds.</span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> </div> </div> <div id='ui-ammo-interactive'> <div id='ui-loot-50AE' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-50AE'></div> <div class='tooltip-description'><span data-l10n='game-50AE-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(30,30,30,0.75)'></div> </div> <div id='ui-loot-9mm' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-9mm'></div> <div class='tooltip-description'><span data-l10n='game-9mm-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(255,153,0,0.75)'></div> </div> <div id='ui-loot-308sub' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-308sub'></div> <div class='tooltip-description'><span data-l10n='game-308sub-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(49,56,0,0.75)'></div> </div> <div id='ui-loot-12gauge' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-12gauge'></div> <div class='tooltip-description'><span data-l10n='game-12gauge-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(255,0,0,0.75)'></div> </div> <div id='ui-loot-flare' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-flare'></div> <div class='tooltip-description'><span data-l10n='game-flare-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(255,85,0,0.75)'></div> </div> <div id='ui-loot-762mm' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-762mm'></div> <div class='tooltip-description'><span data-l10n='game-762mm-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(0,102,255,0.75)'></div> </div> <div id='ui-loot-45acp' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-45acp'></div> <div class='tooltip-description'><span data-l10n='game-45acp-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(121,0,255,0.75)'></div> </div> <div id='ui-loot-556mm' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-556mm'></div> <div class='tooltip-description'><span data-l10n='game-556mm-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(3,123,0,0.75)'></div> </div> <div id='ui-loot-40mm' class='ui-outline-hover ui-ammo tooltip'> <div class='tooltip-text click-through'> <div class='tooltip-title' data-l10n='game-40mm'></div> <div class='tooltip-description'><span data-l10n='game-40mm-tooltip'></span></div> </div> <div class='ui-loot-count'>0</div> <img class='ui-loot-image' src=''></img> <div class='ui-loot-overlay' style='background: rgba(12,221,171,0.75)'></div> </div> </div> <div id='ui-emote-button'></div> </div> <div id='ui-top-left' class='js-ui-hud-show click-through'> <div id='ui-team' class='js-ui-mobile-map-hidden'> <div class='ui-team-member ui-bg-standard' data-id='0'> <div class='ui-team-member-name'></div> <div class='ui-team-member-color ui-background-yellow'></div> <div class='ui-team-member-status'></div> <div class='ui-team-member-health'> <div class='ui-bar-inner ui-health-actual'></div> </div> </div> <div class='ui-team-member ui-bg-standard' data-id='1'> <div class='ui-team-member-name'></div> <div class='ui-team-member-color ui-background-purple'></div> <div class='ui-team-member-status'></div> <div class='ui-team-member-health'> <div class='ui-bar-inner ui-health-actual'></div> </div> </div> <div class='ui-team-member ui-bg-standard' data-id='2'> <div class='ui-team-member-name'></div> <div class='ui-team-member-color ui-background-cyan'></div> <div class='ui-team-member-status'></div> <div class='ui-team-member-health'> <div class='ui-bar-inner ui-health-actual'></div> </div> </div> <div class='ui-team-member ui-bg-standard' data-id='3'> <div class='ui-team-member-name'></div> <div class='ui-team-member-color ui-background-orange'></div> <div class='ui-team-member-status'></div> <div class='ui-team-member-health'> <div class='ui-bar-inner ui-health-actual'></div> </div> </div> </div> </div> <div id='ui-map-wrapper' class='ui-map-wrapper-desktop click-through'> <div id='ui-map-container'> <div id='ui-map-info' class='js-ui-map-hidden js-ui-hud-show'> <div id='ui-gas-icon' class='gas-icon'></div> <div id='ui-gas-timer'></div> </div> <div id='ui-spec-counter' class='js-ui-map-hidden js-ui-hud-show'> <div id='ui-spec-counter-icon'></div> <div id='ui-spec-counter-number'></div> </div> <div id='ui-settings-container-desktop' class='js-ui-desktop-map-hidden'> <div id='ui-map-expand-desktop' class='ui-map-expand ui-settings-button'> <img id='mag-glass-white' src=''></img> </div> <div id='ui-map-minimize' class='ui-settings-button js-ui-map-hidden'> <img id='ui-minimize-img' src=''></img> </div> </div> <div id='ui-settings-container-mobile' class='js-ui-mobile-map-hidden'> <div id='ui-alive-info'> <div id='ui-alive-icon' class='ui-map-icon alive-icon'></div> <div id='ui-map-counter-default' class='js-ui-players-alive'>0</div> <div id='ui-map-counter-faction'> <span class='ui-players-alive-red js-ui-players-alive-red'>0</span>:<span class='ui-players-alive-blue js-ui-players-alive-blue'>0</span> </div> </div> <div id='ui-map-expand-mobile' class='ui-map-expand ui-settings-button'></div> </div> </div> </div> <div id='ui-menu-display' class='ui-settings-button prop-event'></div> <div id='ui-kill-leader-container'> <div id='ui-kill-leader-wrapper' class='js-ui-map-hidden js-ui-hud-show hide-on-mobile'> <div id='ui-kill-leader-name'>Waiting for new leader</div> <div id='ui-kill-leader-icon'></div> <div id='ui-kill-leader-count'>0</div> </div> </div> <div id='ui-killfeed-wrapper'> <div id='ui-killfeed' class='js-ui-map-hidden js-ui-hud-show'> <div id='ui-killfeed-contents'></div> </div> </div> <div id='ui-leaderboard-wrapper'> <div id='ui-leaderboard' class='js-ui-hud-show'> <div id='ui-leaderboard-alive'> <span class='ui-players-alive js-ui-players-alive'>0</span> </div> <div id='ui-leaderboard-alive-faction'> <span class='ui-players-alive-red js-ui-players-alive-red'>0</span> <span class='ui-players-alive-blue js-ui-players-alive-blue'>0</span> </div> <div class='ui-leaderboard-header' data-l10n='game-alive'>Alive</div> </div> <div id='ui-kill-counter-wrapper' class='js-ui-map-show'> <div id='ui-kill-counter'> <span class='ui-player-kills js-ui-player-kills'>0</span> </div> <div class='ui-kill-counter-header' data-l10n='game-kills'>Kills</div> </div> </div> <div id='ui-top-center-scopes-wrapper'> <div id='ui-top-center-scopes' class='click-through js-ui-map-hidden'> <div id='ui-scope-1xscope' class='ui-scope ui-zoom'> <div class='ui-zoom-text'> <div class='ui-zoom-level'>1<span class='ui-zoom-append'>x</span></div> </div> </div> <div id='ui-scope-2xscope' class='ui-scope ui-zoom ui-outline-hover'> <div class='ui-zoom-text'> <div class='ui-zoom-level'>2<span class='ui-zoom-append'>x</span></div> </div> </div> <div id='ui-scope-4xscope' class='ui-scope ui-zoom ui-outline-hover'> <div class='ui-zoom-text'> <div class='ui-zoom-level'>4<span class='ui-zoom-append'>x</span></div> </div> </div> <div id='ui-scope-8xscope' class='ui-scope ui-zoom ui-outline-hover'> <div class='ui-zoom-text'> <div class='ui-zoom-level'>8<span class='ui-zoom-append'>x</span></div> </div> </div> <div id='ui-scope-15xscope' class='ui-scope ui-zoom ui-outline-hover'> <div class='ui-zoom-text'> <div class='ui-zoom-level'>15<span class='ui-zoom-append'>x</span></div> </div> </div> </div> </div> <div id='ui-top-center' class='js-ui-map-hidden js-ui-hud-show click-through'> <div id='ui-waiting-text' class='top-center-text'><span data-l10n='game-waiting-for-players'>Waiting for players</span>...</div> <div id='ui-spectate-text' class='top-center-text ui-spectate-mode'> <div class='spectate-text spectate-desc' data-l10n='game-spectating'>Spectating</div> <div id='spectate-player' class='spectate-text'></div> </div> </div> <div id='ui-upper-center' class='click-through'> <div id='ui-announcement'></div> </div> <div id='ui-upper-center-1' class='click-through'> <div id='ui-pickup-notification'> <div id='ui-pickup-description'>Item picked up</div> </div> </div> <div id='ui-lower-center' class='js-ui-map-hidden js-ui-hud-show click-through'> <div id='ui-interaction'> <div id='ui-interaction-press'></div> <div id='ui-interaction-outer'> <div id='ui-interaction-description'></div> </div> </div> </div> <div id='ui-bottom-center-2' class='click-through'> <div id='ui-pickup-message' class='notify-message'></div> <div id='ui-perk-message-wrapper' class='notify-message'> <div id='ui-perk-message-image-wrapper'> <div id='ui-perk-message-image-icon'></div> </div> <div id='ui-perk-message-name' class='notify-message'></div> <div id='ui-perk-message-acquired' class='notify-message'></div> </div> </div> <div id='ui-equipped-ammo-wrapper' class='js-ui-map-hidden js-ui-hud-show'> <div id='ui-equipped-ammo'> <div id='ui-bullet-counter'> <div id='ui-current-clip'>0</div> <div id='ui-remaining-ammo'>0</div> <div id='ui-reload-button-container'> <div id='ui-reload-button'></div> </div> </div> </div> </div> <div id='ui-bottom-center-0' class='click-through js-ui-map-hidden js-ui-hud-show'> <div id='ui-boost-counter'> <div class='ui-boost-base' id='ui-boost-counter-0'> <div class='ui-bar-inner'></div> </div> <div class='ui-boost-base' id='ui-boost-counter-1'> <div class='ui-bar-inner'></div> </div> <div class='ui-boost-base' id='ui-boost-counter-2'> <div class='ui-bar-inner'></div> </div> <div class='ui-boost-base' id='ui-boost-counter-3'> <div class='ui-bar-inner'></div> </div> </div> <div id='ui-health-counter'> <div id='ui-health-flair-left' class='ui-health-flair'></div> <div id='ui-health-flair-right' class='ui-health-flair'></div> <div id='ui-health-container'> <div class='ui-bar-inner' id='ui-health-actual'></div> <div class='ui-bar-inner' id='ui-health-depleted'></div> </div> </div> </div> <div id='ui-bottom-center-left' class='js-ui-map-hidden'> <div id='ui-perk-0' class='ui-armor-counter tooltip-perk ui-outline-hover'> <div class='tooltip-text'> <div class='tooltip-title'></div> <div class='tooltip-desc'></div> </div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> <div id='ui-perk-1' class='ui-armor-counter tooltip-perk ui-outline-hover'> <div class='tooltip-text'> <div class='tooltip-title'></div> <div class='tooltip-desc'></div> </div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> <div id='ui-perk-2' class='ui-armor-counter tooltip-perk ui-outline-hover'> <div class='tooltip-text'> <div class='tooltip-title'></div> <div class='tooltip-desc'></div> </div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> </div> <div id='ui-bottom-center-right' class='js-ui-map-hidden'> <div id='ui-armor-helmet' class='ui-armor-counter ui-outline-hover'> <div class='ui-armor-counter-inner'></div> <div class='ui-armor-level'></div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> <div id='ui-armor-chest' class='ui-armor-counter ui-outline-hover'> <div class='ui-armor-counter-inner'></div> <div class='ui-armor-level'></div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> <div id='ui-armor-backpack' class='ui-armor-counter'> <div class='ui-armor-counter-inner'></div> <div class='ui-armor-level'></div> <img class='ui-armor-image ui-loot-image' src=''></img> </div> </div> <div id='ui-bottom-right' class='js-ui-map-hidden'> <div id='ui-weapon-container'> <div class='ui-weapon-info'> <div class='ui-weapon-switch ui-outline-hover' id='ui-weapon-id-1' data-slot='1'> <div class='ui-weapon-name'></div> <div class='ui-weapon-number'>1</div> <img class='ui-weapon-image' src=''></img> </div> </div> <div class='ui-weapon-info'> <div class='ui-weapon-switch ui-outline-hover' id='ui-weapon-id-2' data-slot='2'> <div class='ui-weapon-name'></div> <div class='ui-weapon-number'>2</div> <img class='ui-weapon-image' src=''></img> </div> </div> <div class='ui-weapon-info'> <div class='ui-weapon-switch ui-outline-hover' id='ui-weapon-id-3'> <div class='ui-weapon-name'></div> <div class='ui-weapon-number'>3</div> <img class='ui-weapon-image' src=''></img> </div> </div> <div class='ui-weapon-info'> <div class='ui-weapon-switch ui-outline-hover' id='ui-weapon-id-4'> <div class='ui-weapon-name'></div> <div class='ui-weapon-number'>4</div> <div class='ui-weapon-exp ui-weapon-ammo-counter'>0</div> <img class='ui-weapon-image' src=''></img> </div> </div> </div> </div> <div id='ui-spectate-options-wrapper'> <div id='ui-spectate-options' class='ui-spectate-mode js-ui-hud-show click-through'> <div id='ui-spectate-buttons' class='ui-bg-standard'> <a class='menu-option btn-darken' id='btn-spectate-next-player' data-l10n='game-next-teammate'>Next Teammate</a> <a class='menu-option btn-darken' id='btn-spectate-prev-player' data-l10n='game-previous-teammate'>Previous Teammate</a> <a class='menu-option btn-darken' id='btn-spectate-view-stats' data-l10n='game-view-match-stats'>View Match Stats</a> <a class='menu-option btn-darken btn-quit' id='btn-spectate-quit' data-l10n='game-leave-game'>Leave Game</a> </div> <div id='ui-spectate-stats' class='ui-bg-standard'> <div id='ui-spectate-stats-header' data-l10n='game-your-results'>Your Results</div> <table id='ui-spectate-stats-table'> <tbody id='ui-spectate-stats-data'> </tbody> </table> </div> </div> </div> <div id='ui-bottom-center-1' class='click-through'> <div id='ui-kills'> <div id='ui-kill-text'></div> <div id='ui-kill-count'></div> </div> </div> </div> <div id='ui-stats'> <div id='ui-stats-bg'></div> <div id='ui-stats-contents'> <div id='ui-stats-contents-inner'> <div id='ui-stats-header'></div> <div id='ui-stats-info-box'></div> <div id='ui-stats-options'></div> <div id='ui-stats-logo'></div> </div> <div id='ui-stats-ad-container-desktop' class='ui-stats-ad-container'> <div id='surviv-io_300x250_2'></div> </div> <div id='ui-stats-ad-container-mobile' class='ui-stats-ad-container'> <div id='surviv-io_300x250_mobile_2'></div> </div> </div> </div> <div class='ui-stats-adblock surviv-shirts'> <a class='surviv-shirts-link' href='/~/https://www.amazon.com/s?rh=n%3A7141123011%2Cp_4%3Asurviv.io&ref=w_bl_sl_s_ap_web_7141123011' target="_blank"></a> </div> <div class='ui-stats-adblock adblock-plea'> <span>Please consider supporting us by disabling your adblocker.</span> </div> </div> <div id='start-menu-wrapper'> <div id='safari-margin'></div> <div id='background'> <div id='start-overlay'></div> </div> <div id='event-modal'> <div id='modal-container'> <p id='modal-header' data-l10n='index-modal-test'>(HEADER TEXT)</p> <img id='modal-img-1'> <div id='modal-content'> <img id='modal-img-2'> <p id='modal-text' data-l10n='event-desc'>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tincidunt dui ut ornare lectus sit amet est.</p> </div> <button class='close' id='modal-btn' data-l10n='modal-btn-txt' type='button'>(BUTTON TEXT)</button> </div> </div> <div id='start-main'> <div id='start-top-left'> <div id='btn-hamburger' class='icon-hamburger'></div> <div id='start-top-left-desktop'> <div id='featured-streamers'> <div class='streaming-header'> <div id='streaming-header-title' data-l10n='index-streaming-live'>Streaming Live!</div> <div id='streaming-icon'></div> </div> <div class='streamer-list'></div> <div id='featured-streamer-template'> <a href='' target='_blank' class='btn-streamer btn-darken'></a> </div> </div> <div id='featured-youtuber'> <div class='youtube-header'> <div id='youtube-header-title' data-l10n='index-featured-youtuber'>Featured YouTuber</div> </div> <a href='' target='_blank' class='btn-youtuber btn-darken'></a> </div> </div> </div> <!-- Accounts Modals --> <div id='modal-account-name-change' class='modal modal-account'> <div class='modal-content modal-close'> <div class='modal-header modal-header-name'> <span class='close close-corner'></span> <h2 id='modal-account-name-title' data-l10n='index-create-account'>Create Account</h2> </div> <div class='modal-body modal-body-name'> <div class='modal-settings-item'> <p id='modal-account-name-desc' class='modal-body-text' data-l10n='index-set-account-name'>Set your account name:</p> <div id='modal-body-warning'></div> <input type='text' class='menu-option player-name-input' tabindex='0' placeholder='Enter name' id='modal-account-name-input' maxlength='16' /> </div> </div> <div class='modal-footer modal-footer-name modal-footer-round'> <h3 id='modal-account-name-finish' class='finish' data-l10n='index-finish'>Finish</h3> </div> </div> </div> <div id='modal-account-reset-stats' class='modal modal-account'> <div class='modal-content modal-close'> <div class='modal-header modal-header-reset-stats'> <span class='close close-corner'></span> <h2 id='modal-account-name-title' data-l10n='index-reset-stats'>Reset Stats</h2> </div> <div class='modal-body modal-body-reset-stats'> <div class='modal-settings-item'> <p id='modal-account-reset-stats-desc' class='modal-body-text' data-l10n='index-reset-stats-desc'>Enter "RESET STATS" to reset your stats:</p> <p id='modal-account-reset-stats-desc-2' class='modal-body-text' data-l10n='index-reset-stats-desc-2'>(This does not reset pass progress.)</p> <input type='text' class='menu-option player-name-input' tabindex='0' placeholder='' id='modal-account-reset-stats-input' maxlength='16' /> </div> </div> <div class='modal-footer modal-footer-reset-stats modal-footer-round'> <h3 id='modal-account-reset-stats-finish' class='finish' data-l10n='index-confirm'>Confirm</h3> </div> </div> </div> <div id='modal-account-delete' class='modal modal-account'> <div class='modal-content modal-close'> <div class='modal-header modal-header-delete'> <span class='close close-corner'></span> <h2 id='modal-account-name-title' data-l10n='index-delete-account'>Delete Account</h2> </div> <div class='modal-body modal-body-delete'> <div class='modal-settings-item'> <p id='modal-account-delete-desc' class='modal-body-text' data-l10n='index-delete-account-desc'>Enter "DELETE" to delete your account:</p> <input type='text' class='menu-option player-name-input' tabindex='0' placeholder='' id='modal-account-delete-input' maxlength='16' /> </div> </div> <div class='modal-footer modal-footer-delete modal-footer-round'> <h3 id='modal-account-delete-finish' class='finish' data-l10n='index-confirm'>Confirm</h3> </div> </div> </div> <!-- Accounts Mobile --> <div id='modal-mobile-account' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-corner'></span> <h2 data-l10n='index-account' data-l10n='index-account'>Account</h2> </div> <div id='modal-mobile-account-body'> <div class='account-buttons-settings account-buttons-wrapper account-block-arrow modal-close'> <div class='account-buttons'> <div class='account-stats-link btn-player-stats-link menu-option btn-darken btn-standard ' data-l10n='index-my-stats'>My Stats</div> <div class='btn-account-link btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-link-account'>Link Account</div> <div class='btn-account-change-name btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-change-account-name'>Change Account Name</div> <div class='btn-account-reset-stats btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-reset-stats'>Reset Stats</div> <div class='btn-account-delete btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-delete-account'>Delete Account</div> <div class='btn-account-logout btn-account-grey menu-option btn-darken btn-standard' data-l10n='index-log-out'>Log Out</div> </div> </div> <div id='account-login-options-mobile' class='account-buttons-link-account account-buttons-wrapper account-block-arrow modal-close'> <div class='login-options-content'></div> </div> </div> </div> </div> <!-- Accounts --> <div id='start-top-right'> <div class='account-block'> <div class='account-details-top'> <div class="account-details-top-buttons"> <div class="account-details-button-wrapper account-details-button-loadout menu-option btn-darken-alt"> <div class='account-details-button'> <div id='loadout-alert-main' class='account-alert-main account-alert'></div> <div class='account-link account-loadout-link'> <span data-l10n='index-loadout'>Loadout</span> </div> </div> </div> <div class="account-details-button-wrapper account-details-link-out menu-option btn-darken hide-on-mobile"> <div class='account-details-button'> <div class='account-link account-stats-link'><span data-l10n='index-my-stats'>My Stats</span></div> </div> </div> <div class="account-details-button-wrapper account-details-link-out menu-option btn-darken hide-on-mobile"> <div class='account-details-button'> <div class='account-link account-leaderboard-link'><span data-l10n='index-leaderboards'>Leaderboards</span></div> </div> </div> </div> </div> <div class='account-overview'> <div class="account-details-user account-details-block"> <div class="account-details"> <div class="account-avatar"></div> <div id="account-login" class="account-player-name account-name account-name-user" data-l10n='index-log-in-desc'>Log In / Create Account</div> <div id="account-player-name" class="account-player-name account-name account-name-user" style="display:none"></div> <div class="account-loading-container"> <div class="account-loading"></div> </div> </div> </div> </div> <div class='account-buttons-settings account-buttons-wrapper account-block-arrow modal-close hide-on-mobile'> <div class='account-buttons'> <div class='btn-account-link btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-link-account'>Link Account</div> <div class='btn-account-change-name btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-change-account-name'>Change Account Name</div> <div class='btn-account-reset-stats btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-reset-stats'>Reset Stats</div> <div class='btn-account-delete btn-account-turq menu-option btn-darken btn-standard' data-l10n='index-delete-account'>Delete Account</div> <div class='btn-account-logout btn-account-grey menu-option btn-darken btn-standard' data-l10n='index-log-out'>Log Out</div> </div> </div> <div id='account-login-options' class='account-buttons-link-account account-buttons-wrapper account-block-arrow modal-close hide-on-mobile'> <div class='login-options-content'></div> </div> </div> </div> <div id='start-main-center'> <div id='start-row-header'> <div id='server-warning'></div> </div> <div id='start-row-top'> <div id='start-rotate-reminder' class='menu-column menu-block'> <span>Rotate to landscape for a better experience.</span> </div> <div id='left-column' class='menu-column'> <div id='ad-block-left'> <div class='surviv-shirts'> <a href='/~/https://www.amazon.com/s?rh=n%3A7141123011%2Cp_4%3Asurviv.io&ref=w_bl_sl_s_ap_web_7141123011' target="_blank"></a> </div> <div class='adblock-plea'> <span>Please consider supporting us by disabling your adblocker.</span> </div> <div class='ad-block-med-rect' id='surviv-io_300x250'> </div> </div> <div id='social-share-block-wrapper'> <div id='social-share-block' class='menu-block'> <div class='btn-social-wrapper'> <a href='/~/https://facebook.com/surviviogame' target='_blank' class='btn-social btn-darken btn-facebook'></a> <a href='/~/https://twitter.com/survivio' target='_blank' class='btn-social btn-darken btn-twitter'></a> <a href='/~/https://www.instagram.com/surviviogame/' target='_blank' class='btn-social btn-darken btn-instagram'></a> <a href='/~/https://discord.gg/survivio' target='_blank' class='btn-social btn-darken btn-discord'></a> <a href='/~/https://www.youtube.com/c/survivio?sub_confirmation=1' target='_blank' class='btn-social btn-darken btn-youtube'></a> </div> </div> </div> </div> <div id='start-menu' class='menu-column menu-block'> <div class='play-loading-outer'> <div class='play-loading-inner'> <div class='play-loading-spinner'></div> </div> </div> <div class='play-button-container'> <div id='player-options'> <input type='text' class='menu-option player-name-input' tabindex='0' placeholder='Enter your name here' id='player-name-input-solo' maxlength='16' /> <a class='btn-darken menu-option player-options-btn' id='btn-customize'></a> </div> <select id='server-select-main' class='server-select menu-option btn-hollow btn-hollow-selected'> <optgroup id='server-opts' label='Region' data-l10n='index-region'> <option value='na' data-label='North America' data-l10n='index-north-america'>North America</option> <option value='sa' data-label='South America' data-l10n='index-south-america'>South America</option> <option value='eu' data-label='Europe' data-l10n='index-europe'>Europe</option> <option value='as' data-label='Asia' data-l10n='index-asia'>Asia</option> <option value='kr' data-label='Korea' data-l10n='index-korea'>South Korea</option> </optgroup> </select> <a class='btn-green btn-darken menu-option' id='btn-start-mode-0' data-l10n='index-play-solo'>Play Solo</a> <div id='btns-quick-start'> <a class='btn-green btn-darken menu-option' id='btn-start-mode-1' data-l10n='index-play-duo'>Play Duo</a> <a class='btn-green btn-darken menu-option' id='btn-start-mode-2' data-l10n='index-play-squad'>Play Squad</a> </div> <div class='btns-double-row'> <a class='btn-darken menu-option btn-team-option' id='btn-join-team' data-l10n='index-join-team'>Join Team</a> <a class='btn-darken menu-option btn-team-option' id='btn-create-team' data-l10n='index-create-team'>Create Team</a> </div> <div id='btn-help' class='menu-option btn-darken' data-l10n='index-how-to-play'>How to Play</div> <div id='start-help'> <h1 data-l10n='index-controls'>Controls</h1> <p><span class='help-action' data-l10n='index-movement'></span>: <span class='help-control' data-l10n='index-movement-ctrl'></span></p> <p><span class='help-action' data-l10n='index-aim'></span>: <span class='help-control' data-l10n='index-aim-ctrl'></span></p> <p><span class='help-action' data-l10n='index-punch'></span>/<span class='help-action' data-l10n='index-shoot'></span>: <span class='help-control' data-l10n='index-shoot-ctrl'></span></p> <p><span class='help-action' data-l10n='index-change-weapons'></span>: <span class='help-control' data-l10n='index-change-weapons-ctrl'></span></p> <p class='hide-on-mobile'><span class='help-action' data-l10n='index-stow-weapons'></span>: <span class='help-control' data-l10n='index-stow-weapons-ctrl'></span></p> <p class='hide-on-mobile'><span class='help-action' data-l10n='index-swap-weapons'></span>: <span class='help-control' data-l10n='index-swap-weapons-ctrl'></span></p> <p class='hide-on-mobile'><span class='help-action' data-l10n='index-swap-weapon-slots'></span>: <span class='help-control' data-l10n='index-swap-weapon-slots-ctrl'></span></p> <p><span class='help-action' data-l10n='index-reload'></span>: <span class='help-control' data-l10n='index-reload-ctrl'></span></p> <p><span class='help-action' data-l10n='index-scope-zoom'></span>: <span class='help-control' data-l10n='index-scope-zoom-ctrl'></span></p> <p><span class='help-action' data-l10n='index-pickup'></span>/<span class='help-action' data-l10n='index-loot'></span>/<span class='help-action' data-l10n='index-revive'></span>: <span class='help-control' data-l10n='index-pickup-ctrl'></span></p> <p><span class='help-action' data-l10n='index-use-medical'></span>: <span class='help-control' data-l10n='index-use-medical-ctrl'></span></p> <p><span class='help-action' data-l10n='index-drop-item'></span>: <span class='help-control' data-l10n='index-drop-item-ctrl'></span></p> <p><span class='help-action' data-l10n='index-cancel-action'></span>: <span class='help-control' data-l10n='index-cancel-action-ctrl'></span></p> <p><span class='help-action' data-l10n='index-view-map'></span>: <span class='help-control' data-l10n='index-view-map-ctrl'></span></p> <p class='hide-on-mobile'><span class='help-action' data-l10n='index-toggle-minimap'></span>: <span class='help-control' data-l10n='index-toggle-minimap-ctrl'></span></p> <p><span class='help-action' data-l10n='index-use-ping'></span>: <span class='help-control' data-l10n='index-use-ping-ctrl'></span></p> <p><span class='help-action' data-l10n='index-use-emote'></span>: <span class='help-control' data-l10n='index-use-emote-ctrl'></span></p> <h1 data-l10n='index-how-to-play'>How to Play</h1> <p data-l10n='index-tips-1-desc'>The goal of surviv.io is to be the last player standing. You only live once per game - there is no respawn!</p> <h1 data-l10n='index-tips-2'>2D PUBG</h1> <p data-l10n='index-tips-2-desc'>If you've played other battle royale games like PUBG, Fortnite or H1Z1, then you're already halfway there! Think of surviv.io as 2D PUBG (with slightly less desync and more chicken).</p> <h1 data-l10n='index-tips-3'>Loot and Kill</h1> <p data-l10n='index-tips-3-desc'>You'll begin the game with no items other than a simple backpack. Move around the map to find loot: weapons, ammo, scopes, and medical items. Eliminate other players and you can take their loot!</p> <h1 data-l10n='index-tips-4'>Red = Bad!</h1> <p data-l10n='index-tips-4-desc'>Players aren't the only thing that can hurt you. The deadly red zone will move in from the sides of the map and deal increasingly greater damage if you stand in it. Keep an eye on the map and stay safe.</p> </div> </div> </div> <div id='team-menu' class='menu-column menu-block'> <div class='play-loading-outer'> <div class='play-loading-inner'> <div class='play-loading-spinner'></div> </div> </div> <div class='play-button-container'> <a class='btn-darken menu-option' id='btn-team-leave' data-l10n='index-leave-team'>Leave Team</a> <div id='team-menu-connecting'> <div class='ui-spinner'></div> <div class='team-menu-connecting-text' id='team-menu-joining-text'><span data-l10n='index-joining-team'>Joining team</span> ...</div> <div class='team-menu-connecting-text' id='team-menu-creating-text'><span data-l10n='index-creating-team'>Creating team</span> ...</div> </div> <div id='team-menu-contents'> <div id='team-desc'> <div id='team-desc-text'><span id='invite-link-text' data-l10n='index-invite-link'>Invite link</span>: <span id='team-url'></span> </div> <a id='team-copy-url' class='copy-item btn-darken'></a> <a id='team-hide-url' class='hide-item btn-darken'></a> <div id='team-code-text'><span id='invite-code-text' data-l10n='index-invite-code'>Invite code</span>: <span id='team-code'></span></div> </div> <div id='team-menu-columns'> <div id='team-menu-members' class='team-menu-block'> <div id='team-menu-member-list'></div> </div> <div id='team-menu-options' class='team-menu-block'> <select id='team-server-select' class='btn-hollow btn-hollow-selected server-select menu-option'> <optgroup id='team-server-opts' label='Region'> <option value='na' data-label='North America' data-l10n='index-north-america'>North America</option> <option value='sa' data-label='South America' data-l10n='index-south-america'>South America</option> <option value='eu' data-label='Europe' data-l10n='index-europe'>Europe</option> <option value='as' data-label='Asia' data-l10n='index-asia'>Asia</option> <option value='kr' data-label='Korea' data-l10n='index-korea'>South Korea</option> </optgroup> </select> <div class='team-menu-options-buttons'> <a class='btn-hollow btn-hollow-selected btn-darken team-menu-option btn-team-queue' id='btn-team-queue-mode-1' data-l10n='index-duo'>Duo</a> <a class='btn-hollow btn-hollow-selected btn-darken team-menu-option btn-team-queue' id='btn-team-queue-mode-2' data-l10n='index-squad'>Squad</a> </div> <div class='team-menu-options-buttons'> <a class='btn-hollow btn-hollow-selected btn-darken team-menu-option btn-team-fill' id='btn-team-fill-auto' data-l10n='index-auto-fill'>Auto Fill</a> <a class='btn-hollow btn-darken team-menu-option btn-team-fill' id='btn-team-fill-none' data-l10n='index-no-fill'>No Fill</a> </div> <div id='team-menu-options-start'> <a class='btn-green btn-darken menu-option' id='btn-start-team' data-label='Play' data-l10n='index-play'>Play</a> <div id='msg-wait-reason'></div> </div> </div> </div> </div> </div> </div> <div id='team-mobile-link' class='menu-column menu-block'> <div id='team-mobile-link-desc' class='team-mobile-link-text' data-l10n='index-join-team-help'>Got a team link or code? Paste it here:</div> <div id='team-mobile-link-warning' class='team-mobile-link-text'>Invalid link!</div> <input type='text' class='menu-option' contenteditable="false" tabindex='0' autofocus placeholder='Paste team link or enter code here' id='team-link-input' /> <a class='btn-darken menu-option btn-team-option' id='btn-team-mobile-link-join' data-l10n='index-join-team'>Join Team</a> <a class='btn-darken menu-option' id='btn-team-mobile-link-leave' data-l10n='index-back-to-main'>Back to Main Menu</a> </div> <div id='right-column' class='menu-column'> <div id='pass-wrapper'> <div id='pass-unlock-tooltip'> <div class='tooltip-pass-title'></div> <div class='tooltip-pass-desc'></div> </div> <div class='right-column-toggle news-toggle'> <div class='account-alert'></div> </div> <div id='pass-loading' class='pass-column menu-block'> <div id='pass-loading-spinner'></div> </div> <div id='pass-block' class='pass-column menu-block'> <div id='pass-name'> <span id='pass-name-text'></span> </div> <div id='pass-progress' class=''> <div id='pass-progress-level' class=''></div> <div id='pass-progress-bar' class=''> <div id='pass-progress-bar-fill'></div> <div id='pass-progress-xp'> <span id='pass-progress-xp-current'></span> <span>/</span> <span id='pass-progress-xp-target'></span> <span>XP</span> </div> </div> <div id='pass-progress-unlock-wrapper'> <div id='pass-progress-unlock' class=''> <div id='pass-progress-unlock-image' class=''></div> </div> <div id='pass-progress-unlock-type-wrapper' class=''> <div id='pass-progress-unlock-type-border' class=''> <div id='pass-progress-unlock-type-image' class=''></div> </div> <div id='pass-progress-unlock-overlay' class=''></div> </div> </div> </div> <div id='pass-quest-wrapper' class=''> <div id='pass-locked'> <div id='btn-pass-locked' class='menu-option btn-darken' data-l10n='quest-login-prompt'>Log in to get quests!</div> </div> <div id='pass-quest-0' class='pass-quest'> <div class='pass-quest-timer'></div> <div class='pass-quest-spinner-container'> <div class='pass-quest-spinner'></div> </div> <div class='pass-quest-refresh-prompt'> <div class='pass-quest-refresh-prompt-text' data-l10n='quest-refresh-prompt'>Get a new quest?</div> <div class='pass-quest-refresh-confirm btn-pass-quest-refresh'></div> <div class='pass-quest-refresh-cancel btn-pass-quest-refresh'></div> </div> <div class='pass-quest-info'> <div class='pass-quest-desc'></div> <div class='pass-quest-xp'></div> <div class='pass-quest-refresh'></div> <div class='pass-quest-progress'> <div class='pass-quest-bar'> <div class='pass-quest-bar-fill'></div> </div> <div class='pass-quest-counter'> <span class='pass-quest-counter-current'></span> <span>/</span> <span class='pass-quest-counter-target'></span> </div> </div> </div> </div> <div id='pass-quest-1' class='pass-quest'> <div class='pass-quest-timer'></div> <div class='pass-quest-spinner-container'> <div class='pass-quest-spinner'></div> </div> <div class='pass-quest-refresh-prompt'> <div class='pass-quest-refresh-prompt-text' data-l10n='quest-refresh-prompt'>Get a new quest?</div> <div class='pass-quest-refresh-confirm btn-pass-quest-refresh'></div> <div class='pass-quest-refresh-cancel btn-pass-quest-refresh'></div> </div> <div class='pass-quest-info'> <div class='pass-quest-desc'></div> <div class='pass-quest-xp'></div> <div class='pass-quest-refresh'></div> <div class='pass-quest-progress'> <div class='pass-quest-bar'> <div class='pass-quest-bar-fill'></div> </div> <div class='pass-quest-counter'> <span class='pass-quest-counter-current'></span> <span>/</span> <span class='pass-quest-counter-target'></span> </div> </div> </div> </div> </div> </div> </div> <div id='news-wrapper'> <div class='right-column-toggle pass-toggle'></div> <div id='news-block' class='menu-block'> <div id='news'> <h3 class='news-header'>What's New!</h3> <div id='news-current' data-date='2020-2-24'> <small class='news-date'>February 24, 2020</small> <p class='news-paragraph'><strong>Curveball</strong></p> <p class='news-paragraph'>The <span class='highlight'>Savannah</span> has returned with a new perk to help flush snipers out of position.</p> <p class='news-paragraph'>The <span class='highlight'>Closer Perk</span> throws grenades much farther, allowing you to put Snipers on the move.</p> </div> <div data-date='2020-2-10'> <small class='news-date'>February 10, 2020</small> <p class='news-paragraph'><strong>Keep Your Enemies Closer</strong></p> <p class='news-paragraph'>PARMA recognizes this season of togetherness and generously offers to help rivals resolve their differences. The all new <span class='highlight'>Heart Cannon</span> diffuses damage taken from your frenemies. For groups of future friends, the same effect is achieved with the all-new <span class='highlight'>Heart Grenade</span>.</p> <p class='news-paragraph'>If you do not trust the intentions of your new friends, eat an entire <span class='highlight'>box of chocolates</span> to counter the effect of <span class='highlight'>Heart Weapons</span>.</p> </div> <div data-date='2020-1-27'> <small class='news-date'>January 27, 2020</small> <p class='news-paragraph'><strong>Dodge This</strong></p> <p class='news-paragraph'><span class='highlight'>Woods</span> Mode is back with two new weapons and things are bound to get explosive. The <span class='highlight'>PKM</span> and <span class='highlight'>Hawk 12G</span> join the Woods Map arsenal, along with increased grenade capacity.</p> <p class='news-paragraph'>The <span class='highlight'>PKM</span> packs a punch while balancing mobility and range. Based on the M870 with an added magazine, the <span class='highlight'>Hawk 12G</span>'s ammo capacity of 5 is the same as its parent weapon, the fire delay is faster and fires a tighter spread. </p> </div> <div data-date='2020-1-13'> <small class='news-date'>January 13, 2020</small> <p class='news-paragraph'><strong>Stay frosty</strong></p> <p class='news-paragraph'>Winter has arrived on the Island with new features and is more dangerous than ever, including PARMA's latest item, the <span class='highlight'>Flask</span>.</p> <p class='news-paragraph'>Track your enemy's footprints and use the <span class='highlight'>Snow Fox</span> perk to cover up your footprints. Be sure to keep moving or take freezing damage. Flasks and the <span class='highlight'>Polar Bear</span> perk keep you from freezing. And watch out for ice. It's slippery.</p> </div> <div data-date='2019-12-30'> <small class='news-date'>December 30, 2019</small> <p class='news-paragraph'><strong>Free Fryer</strong></p> <p class='news-paragraph'>PARMA's FSTMS division is pleased to introduce the next generation in starch-based modern warfare: the <span class='highlight'>spud gun</span>.</p> <p class='news-paragraph'>Officially designated the SMG-8 (Spud Missile Generator), the spud gun uses a proprietary breech-to-muzzle heat expander to fry and propel wedge-shaped projectiles at tremendous speeds. Like its cousin, the potato cannon, the spud gun also features nitroglycerin-spiked ammunition and a nifty tuber replication device!</p> </div> </div> </div> </div> </div> </div> <div class='ad-block-leaderboard-bottom' id='surviv-io_728x90'></div> </div> <div id='start-bottom-left'> <div class='hide-on-mobile'> <a href='/~/https://play.google.com/store/apps/details?id=io.surviv.surviv_io_mobile' target='_blank' class='btn-download-android btn-download-app btn-darken'></a> </div> <div class='hide-on-mobile'> <a href='/~/https://itunes.apple.com/us/app/surviv-io/id1401727934?ls=1&mt=8' target='_blank' class='btn-download-ios btn-download-app btn-darken'></a> </div> <div id='mobile-settings-front'> <div class='btn-settings menu-option btn-darken btn-start-option'></div> </div> </div> <div id="start-bottom-middle"> <a href='changelog.html' target="_blank" class="footer-after">ver 0.9.1b</a> <a href='proxy.txt' target="_blank" data-l10n='index-proxy-sites'>proxy sites</a> </div> <div id='start-bottom-right-wrapper'> <div id='start-bottom-right'> <div class="language-select-wrap"> <select class='language-select'></select> </div> <div class='btn-settings menu-option btn-darken btn-start-option'></div> <div class='btn-keybind menu-option btn-darken btn-start-option'></div> <div id='btn-start-fullscreen' class='btn-fullscreen-toggle menu-option btn-darken btn-start-option'></div> <div class='btn-start-mute btn-sound-toggle menu-option btn-darken btn-start-option audio-on-icon'></div> </div> <div id='mobile-download-app'> <a href='/~/https://play.google.com/store/apps/details?id=io.surviv.surviv_io_mobile' target='_blank' class='btn-download-android btn-download-app-mobile btn-darken'></a> <a href='/~/https://itunes.apple.com/us/app/surviv-io/id1401727934?ls=1&mt=8' target='_blank' class='btn-download-ios btn-download-app-mobile btn-darken'></a> </div> </div> </div> <!-- Modals --> <div id='ui-modal-keybind' class='ui-modal-keybind modal' oncontextmenu='return false;'> <div class='ui-modal-keybind-content modal-content modal-close'> <div id='ui-modal-keybind-header' class='modal-header'> <span id='ui-close-keybind' class='close close-corner'></span> <h2 data-l10n='index-customize-keybinds'>Customize Keybinds</h2> </div> <div id='ui-modal-keybind-body' class='modal-body'> <div id='ui-modal-keybind-list' class='js-keybind-list'></div> <div id='ui-modal-keybind-share'> <div class='ui-modal-keybind-share-row'> <div class='ui-modal-keybind-share-elem'> <span data-l10n='index-keybind-link'>Share your keybinds with this code</span>: </div> <div class='ui-modal-keybind-share-elem'> <div id='keybind-link-text'> <div id='keybind-link'>aFvc42SfhpoFlrJKVkA1fx+5afasdf9034hfSF09nASqqF</div> <span id='keybind-copy' class='copy-item btn-darken'></span> </div> </div> </div> <span class='keybind-share-paste-text' data-l10n='index-keybind-paste'>Load keybinds using a code here</span><span>:</span> <div id='keybind-warning' class='link-warning'>Invalid code!</div> <div class='ui-modal-keybind-share-row'> <input type='text' class='menu-option' contenteditable="false" tabindex='0' autofocus placeholder='Paste a keybind code here' id='keybind-code-input' /> <a class='btn-game-menu btn-darken' id='btn-keybind-code-load' data-l10n='index-keybind-apply'>Load</a> </div> </div> </div> <div id='ui-modal-keybind-footer' class='modal-footer modal-footer-round'> <a class='js-btn-keybind-share btn-game-menu btn-darken' data-l10n='game-share'>Share</a> <a class='js-btn-keybind-restore btn-game-menu btn-darken' data-l10n='game-restore-defaults'>Restore Defaults</a> </div> </div> </div> <!-- Loadouts --> <div id='modal-customize' class='modal'> <div class='ad-block-loadouts-left hide-on-mobile' id='surviv-io_300x600'></div> <div id='modal-customize-wrapper' class='modal-close'> <div id='modal-content-left' class='modal-content-shadow'> <div id='modal-customize-cat-title'></div> <div id="modal-customize-sort-wrap"> <select id='modal-customize-sort'> <option id='customize-sort-newest' value='newest' data-l10n='loadout-newest'>Newest</option> <option id='customize-sort-alpha' value='alpha' data-l10n='loadout-alpha'>Alpha</option> <option id='customize-sort-rarity' value='rarity' data-l10n='loadout-rarity'>Rarity</option> <option id='customize-sort-subcat' value='subcat' data-l10n='loadout-subcat'>Category</option> </select> </div> <div id='modal-customize-close'> <span class='close close-corner'></span> </div> <div id='modal-customize-header' class='modal-header'></div> <div class='modal-disabled'> <div class='modal-disabled-message'>The Edge browser does not support custom cursors.</div> </div> <div id='modal-customize-body' class='modal-body'> <div id='modal-customize-item-header'> <div id='modal-customize-item-name'></div> <div id='modal-customize-item-rarity'></div> <div id='modal-customize-loading-container'> <div id='modal-customize-loading'></div> </div> </div> <div id='modal-customize-list'></div> </div> <div id='modal-customize-footer' class='modal-footer modal-footer-round'> <div id='modal-customize-item-source'></div> <div id='modal-customize-item-lore'></div> </div> <div id='modal-customize-unlocks' class=''> <div id='customize-instagram-follow-unlock' class='customize-social-unlock customize-social-tooltip' data-lock-reason='instagram'> <div class="tooltiptext" data-l10n='loadout-instagram-reward'></div> <a href='/~/https://www.instagram.com/surviviogame/' target="_blank" id='btn-instagram-follow-unlock' class='menu-option btn-darken btn-social-unlock btn-instagram' data-lock-reason='instagram' data-l10n='loadout-instagram-follow'></a> </div> <div id='customize-youtube-subscribe-unlock' class='customize-social-unlock customize-social-tooltip' data-lock-reason='youtube'> <div class="tooltiptext" data-l10n='loadout-youtube-reward'></div> <a href='/~/https://www.youtube.com/c/survivio?sub_confirmation=1' target='_blank' id='btn-youtube-subscribe-unlock' class='menu-option btn-darken btn-social-unlock btn-youtube' data-lock-reason='youtube' data-l10n='loadout-youtube-subscribe'></a> </div> <div id='customize-twitter-follow-unlock' class='customize-social-unlock customize-social-tooltip' data-lock-reason='twitter'> <div class="tooltiptext" data-l10n='loadout-twitter-reward'></div> <a href='/~/https://twitter.com/intent/follow?region=follow_link&screen_name=survivio&tw_p=followbutton' target="_blank" id='btn-twitter-follow-unlock' class='menu-option btn-darken btn-social-unlock btn-twitter' data-lock-reason='twitter' data-l10n='loadout-twitter-follow'></a> </div> <div id='customize-facebook-like-unlock' class='customize-social-unlock customize-social-tooltip' data-lock-reason='facebook'> <div class="tooltiptext" data-l10n='loadout-facebook-reward'></div> <a href='/~/https://www.facebook.com/surviviogame/' target='_blank' id='btn-facebook-like-unlock' class='menu-option btn-darken btn-social-unlock btn-facebook' data-lock-reason='facebook' data-l10n='loadout-facebook-like'></a> </div> </div> </div> <div id='modal-content-right-crosshair' class='modal-content-right modal-content-shadow'> <div class='modal-spacer'></div> <div class='modal-disabled'></div> <div id='customize-crosshair-parent'> <div id='customize-crosshair-selected'> <div class="customize-item-image customize-crosshair-image" draggable="false"></div> </div> <div id='customize-crosshair-sliders'> <div class="crosshair-hex-outer"> <span>#</span><input type="text" id='color-picker-hex'> </div> <section id="color-picker"></section> <div class="crosshair-slider-container"> <p class='' data-l10n='loadout-size'>Size</p> <input type="range" min="0.25" max="1.0" value="0.5" step='0.025' class="crosshair-slider" id="crosshair-size"> </div> <div class="crosshair-slider-container"> <p class='' data-l10n='loadout-stroke'>Stroke</p> <input type="range" min="0.0" max="1.5" value="0.0" step='0.025' class="crosshair-slider" id="crosshair-stroke"> </div> </div> </div> </div> <div id='modal-content-right-emote' class='modal-content-right modal-content-shadow'> <div id='customize-emote-parent'> <div id='customize-emote-wheel' class='ui-emote-wheel'> <div id='customize-emote-middle' class='ui-emote-middle ui-emote-circle ui-emote-parent'> <div class='ui-emote ui-emote-bg-circle'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image ui-emote-image'></div> </div> <div id='customize-emote-top' class='ui-emote-top ui-emote-quarter ui-emote-parent' data-slot='emoteTop' data-idx='0'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image ui-emote-image'></div> <div class='customize-col customize-col-small' draggable="true"></div> </div> <div id='customize-emote-right' class='ui-emote-right ui-emote-quarter ui-emote-parent' data-slot='emoteRight' data-idx='1'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image ui-emote-image'></div> <div class='customize-col customize-col-small' draggable="true"></div> </div> <div id='customize-emote-bottom' class='ui-emote-bottom ui-emote-quarter ui-emote-parent' data-slot='emoteBottom' data-idx='2'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image ui-emote-image'></div> <div class='customize-col customize-col-small' draggable="true"></div> </div> <div id='customize-emote-left' class='ui-emote-left ui-emote-quarter ui-emote-parent' data-slot='emoteLeft' data-idx='3'> <div class='ui-emote ui-emote-bg-quarter'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image ui-emote-image'></div> <div class='customize-col customize-col-small' draggable="true"></div> </div> </div> <div id='customize-emote-autos'> <div id='customize-emote-win' class='ui-emote-middle ui-emote-circle ui-emote-parent' data-slot='emoteWin' data-idx='4'> <div class='ui-emote ui-emote-auto-trash'></div> <div class='ui-emote ui-emote-auto-icon ui-emote-auto-chicken'></div> <div class='ui-emote ui-emote-bg-circle-outer'></div> <div class='ui-emote ui-emote-bg-circle'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image'></div> <div class='customize-col customize-col-large' draggable="true"></div> </div> <div id='customize-emote-death' class='ui-emote-middle ui-emote-circle ui-emote-parent' data-slot='emoteDeath' data-idx='5'> <div class='ui-emote ui-emote-auto-trash'></div> <div class='ui-emote ui-emote-auto-icon ui-emote-auto-skull'></div> <div class='ui-emote ui-emote-bg-circle-outer'></div> <div class='ui-emote ui-emote-bg-circle'></div> <div class='ui-emote ui-emote-hl'></div> <div class='customize-emote-slot customize-item-image'></div> <div class='customize-col customize-col-large' draggable="true"></div> </div> </div> </div> </div> </div> </div> <div id='modal-settings' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-corner'></span> <h2 data-l10n='index-settings'>Settings</h2> </div> <div id='modal-settings-body' class='modal-body'> <div id='language-select-mobile-wrapper' class='modal-settings-item'> <div class="language-select-wrap"> <select class='language-select'></select> </div> </div> <div id='modal-settings-high-res' class='modal-settings-item'> <input id='highResTex' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-high-resolution'>High resolution (check to increase visual quality)</p> </div> <div class='modal-settings-item hide-on-mobile'> <input id='screenShake' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-screen-shake'>Screen shake</p> </div> <div class='modal-settings-item'> <input id='anonPlayerNames' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-anon-player-names'>Anonymize player names</p> </div> <div class='modal-settings-item dpad'> <input id='activateDpad' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-left-mode'>Left handed mode </p> </div> <div class='modal-settings-item auto-melee'> <input id='autoMelee' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-auto-melee'>Auto Melee Boxes</p> </div> <div class='modal-settings-item aim-assist'> <input id='aimAssist' type='checkbox'><p class='modal-settings-checkbox-text' data-l10n='index-aim-assist'>Aim Assist</p> </div> <div class="modal-settings-item slider-container main-volume-slider"> <p class='modal-slider-text' data-l10n='index-master-volume'>Master Volume</p> <input type="range" min="0" max="100" value="50" class="slider sl-master-volume" id=""> </div> <div class="modal-settings-item slider-container main-volume-slider"> <p class='modal-slider-text' data-l10n='index-sfx-volume'>SFX Volume</p> <input type="range" min="0" max="100" value="50" class="slider sl-sound-volume" id=""> </div> <div class="modal-settings-item slider-container main-volume-slider"> <p class='modal-slider-text' data-l10n='index-music-volume'>Music Volume</p> <input type="range" min="0" max="100" value="50" class="slider sl-music-volume" id=""> </div> <div class="modal-settings-item slider-container slider-dpad"> <p class='modal-slider-text' data-l10n='index-sensitivy'>Analog Sensitivity</p> <input type="range" min="0" max="100" value="100" class="slider" id="sensitivity-slider"> </div> <div id='settings-links'> <a href='#' class="btn-cookie-settings footer-after">cookie settings</a> <a href='privacy.html' target="_blank" class="footer-after" data-l10n='index-privacy'>privacy</a> <a href='attribution.txt' target="_blank" class="footer-after" data-l10n='index-attributions'>attributions</a> <a href='hof.html' target="_blank" data-l10n='index-hof'>HOF</a> </div> </div> <div class='modal-footer'></div> </div> </div> <div id='modal-hamburger' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-hamburger icon-hamburger'></span> <h2> </h2> </div> <div id='modal-hamburger-body' class='modal-body'> <div id='modal-hamburger-leaderboards'> <a href='/~/https://surviv.io/stats' target='_blank' id="btn-mobile-to-stats" class='btn-leaderboard-stats-link menu-option btn-darken' data-l10n='index-leaderboards'>Leaderboards</a> </div> <div class='modal-divider'></div> <div class='btn-social-wrapper'> <a href='/~/https://facebook.com/surviviogame' target='_blank' class='btn-social btn-darken btn-facebook'></a> <a href='/~/https://twitter.com/survivio' target='_blank' class='btn-social btn-darken btn-twitter'></a> <a href='/~/https://www.instagram.com/surviviogame/' target='_blank' class='btn-social btn-darken btn-instagram'></a> <a href='/~/https://discord.gg/survivio' target='_blank' class='btn-social btn-darken btn-discord'></a> <!-- <a href='/~/https://www.youtube.com/c/survivio?sub_confirmation=1' target='_blank' class='btn-social btn-darken btn-youtube'></a> --> </div> <div class='modal-divider'></div> <div id='modal-hamburger-bottom'> <a href='changelog.html' class="footer-after">ver 0.9.1b</a> <a href='#' class="btn-cookie-settings footer-after">cookie settings</a> <a href='privacy.txt' target="_blank" class="footer-after">privacy</a> <a href='attribution.txt' target="_blank">attributions</a> </div> </div> </div> </div> <div id='modal-notification' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-corner'></span> <h2>Alert</h2> </div> <div class='modal-body'> <p class='modal-body-text'></p> </div> <div class='modal-footer modal-footer-round'> <h3 class='close close-footer'>OK</h3> </div> </div> </div> <div id='modal-refresh' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-corner'></span> <h2>New Update</h2> </div> <div class='modal-body'> <p class='modal-body-text'>A new version of surviv.io is available!<br><br>Press "OK" below to reload the page.</p> </div> <div class='modal-footer modal-footer-round'> <h3 id='force-refresh' class='close close-footer'>OK</h3> </div> </div> </div> <div id='modal-create-account' class='modal modal-account'> <div class='modal-content modal-close'> <div class='modal-header modal-header-name'> <span class='close-loadouts close close-corner'></span> <h2 id='modal-account-name-title' data-l10n='index-log-in-desc'>Log In / Create Account</h2> </div> <div class='modal-body modal-body-name'> <p class='modal-body-text' data-l10n='index-create-account-prompt-1'>Log in to access this feature!</p> <div class='login-options-content'></div> </div> <div class='modal-footer modal-footer-name modal-footer-round'> <h3 class='close close-footer' data-l10n='index-cancel'>Cancel</h3> </div> </div> </div> <div id='modal-screen-block'> <div id='modal-item-confirm' class='modal'> <div class='modal-content modal-close'> <div class='modal-header modal-header-name'> <h2 id='modal-account-name-title'>You got a new item!</h2> </div> <div class='modal-body modal-body-name'> <div id='modal-item-confirm-image-outer'> <div id='modal-item-confirm-image-inner'></div> </div> <div class='modal-settings-item'> <p id='modal-item-confirm-name' class='modal-body-text'></p> </div> </div> <div class='modal-footer modal-footer-name modal-footer-round'> <h3 class='close close-footer' data-l10n='index-confirm'>Confirm</h3> </div> </div> </div> </div> <div id='modal-cookie-settings' class='modal'> <div class='modal-content modal-close'> <div class='modal-header'> <span class='close close-corner'></span> <h2>Cookie Settings</h2> </div> <div class='modal-body'> <p class='modal-body-text'>We use cookies to personalize content and ads, to provide social media features, and to analyze our traffic. We also share information about your use of our site with our social media, advertising and analytics partners who may combine it with other information that you've provided to them or that they've collected from your use of their services. You consent to our cookies if you continue to use our website. Click <a href='#' id='btn-cookie-opt-out' class='close'>here</a> to opt out of using cookies.</p> </div> <div class='modal-footer modal-footer-round'> <h3 class='close close-footer'><div class='btn-cookies-close btn-darken'>Got it!</div></h3> </div> </div> </div> </div> <script type="text/javascript" src="js/manifest.8e62061f.js"></script><script type="text/javascript" src="js/vendor.bd007df0.js"></script><script type="text/javascript" src="js/app.55f8f3a9.
# Liberty House Club **A Parallel Binance Chain to Enable Smart Contracts** _NOTE: This document is under development. Please check regularly for updates!_ ## Table of Contents - [Motivation](#motivation) - [Design Principles](#design-principles) - [Consensus and Validator Quorum](#consensus-and-validator-quorum) * [Proof of Staked Authority](#proof-of-staked-authority) * [Validator Quorum](#validator-quorum) * [Security and Finality](#security-and-finality) * [Reward](#reward) - [Token Economy](#token-economy) * [Native Token](#native-token) * [Other Tokens](#other-tokens) - [Cross-Chain Transfer and Communication](#cross-chain-transfer-and-communication) * [Cross-Chain Transfer](#cross-chain-transfer) * [BC to BSC Architecture](#bc-to-bsc-architecture) * [BSC to BC Architecture](#bsc-to-bc-architecture) * [Timeout and Error Handling](#timeout-and-error-handling) * [Cross-Chain User Experience](#cross-chain-user-experience) * [Cross-Chain Contract Event](#cross-chain-contract-event) - [Staking and Governance](#staking-and-governance) * [Staking on BC](#staking-on-bc) * [Rewarding](#rewarding) * [Slashing](#slashing) - [Relayers](#relayers) * [BSC Relayers](#bsc-relayers) * [Oracle Relayers](#oracle-relayers) - [Outlook](#outlook) # Motivation After its mainnet community [launch](https://www.binance.com/en/blog/327334696200323072/Binance-DEX-Launches-on-Binance-Chain-Invites-Further-Community-Development) in April 2019, [Binance Chain](https://www.binance.org) has exhibited its high speed and large throughput design. Binance Chain’s primary focus, its native [decentralized application](https://en.wikipedia.org/wiki/Decentralized_application) (“dApp”) [Binance DEX](https://www.binance.org/trade), has demonstrated its low-latency matching with large capacity headroom by handling millions of trading volume in a short time. Flexibility and usability are often in an inverse relationship with performance. The concentration on providing a convenient digital asset issuing and trading venue also brings limitations. Binance Chain's most requested feature is the programmable extendibility, or simply the [Smart Contract](https://en.wikipedia.org/wiki/Smart_contract) and Virtual Machine functions. Digital asset issuers and owners struggle to add new decentralized features for their assets or introduce any sort of community governance and activities. Despite this high demand for adding the Smart Contract feature onto Binance Chain, it is a hard decision to make. The execution of a Smart Contract may slow down the exchange function and add non-deterministic factors to trading. If that compromise could be tolerated, it might be a straightforward idea to introduce a new Virtual Machine specification based on [Tendermint](https://tendermint.com/core/), based on the current underlying consensus protocol and major [RPC](https://docs.binance.org/api-reference/node-rpc.html) implementation of Binance Chain. But all these will increase the learning requirements for all existing dApp communities, and will not be very welcomed. We propose a parallel blockchain of the current Binance Chain to retain the high performance of the native DEX blockchain and to support a friendly Smart Contract function at the same time. # Design Principles After the creation of the parallel blockchain into the Binance Chain ecosystem, two blockchains will run side by side to provide different services. The new parallel chain will be called “**Binance Smart Chain**” (short as “**BSC**” for the below sections), while the existing mainnet remains named “**Binance Chain**” (short as “**BC**” for the below sections). Here are the design principles of **BSC**: 1. **Standalone Blockchain**: technically, BSC is a standalone blockchain, instead of a layer-2 solution. Most BSC fundamental technical and business functions should be self-contained so that it can run well even if the BC stopped for a short period. 2. **Ethereum Compatibility**: The first practical and widely-used Smart Contract platform is Ethereum. To take advantage of the relatively mature applications and community, BSC chooses to be compatible with the existing Ethereum mainnet. This means most of the **dApps**, ecosystem components, and toolings will work with BSC and require zero or minimum changes; BSC node will require similar (or a bit higher) hardware specification and skills to run and operate. The implementation should leave room for BSC to catch up with further Ethereum upgrades. 3. **Staking Involved Consensus and Governance**: Staking-based consensus is more environmentally friendly and leaves more flexible option to the community governance. Expectedly, this consensus should enable better network performance over [proof-of-work](https://en.wikipedia.org/wiki/Proof_of_work) blockchain system, i.e., faster blocking time and higher transaction capacity. 4. **Native Cross-Chain Communication**: both BC and BSC will be implemented with native support for cross-chain communication among the two blockchains. The communication protocol should be bi-directional, decentralized, and trustless. It will concentrate on moving digital assets between BC and BSC, i.e., [BEP2](https://github.com/binance-chain/BEPs/blob/master/BEP2.md) tokens, and eventually, other BEP tokens introduced later. The protocol should care for the minimum of other items stored in the state of the blockchains, with only a few exceptions. # Consensus and Validator Quorum Based on the above design principles, the consensus protocol of BSC is to fulfill the following goals: 1. Blocking time should be shorter than Ethereum network, e.g. 5 seconds or even shorter. 2. It requires limited time to confirm the finality of transactions, e.g. around 1-min level or shorter. 3. There is no inflation of native token: BNB, the block reward is collected from transaction fees, and it will be paid in BNB. 4. It is compatible with Ethereum system as much as possible. 5. It allows modern [proof-of-stake](https://en.wikipedia.org/wiki/Proof_of_stake) blockchain network governance. ## Proof of Staked Authority Although Proof-of-Work (PoW) has been recognized as a practical mechanism to implement a decentralized network, it is not friendly to the environment and also requires a large size of participants to maintain the security. Ethereum and some other blockchain networks, such as [MATIC Bor](https://github.com/maticnetwork/bor), [TOMOChain](https://tomochain.com/), [GoChain](https://gochain.io/), [xDAI](https://xdai.io/), do use [Proof-of-Authority(PoA)](https://en.wikipedia.org/wiki/Proof_of_authority) or its variants in different scenarios, including both testnet and mainnet. PoA provides some defense to 51% attack, with improved efficiency and tolerance to certain levels of Byzantine players (malicious or hacked). It serves as an easy choice to pick as the fundamentals. Meanwhile, the PoA protocol is most criticized for being not as decentralized as PoW, as the validators, i.e. the nodes that take turns to produce blocks, have all the authorities and are prone to corruption and security attacks. Other blockchains, such as EOS and Lisk both, introduce different types of [Delegated Proof of Stake (DPoS)](https://en.bitcoinwiki.org/wiki/DPoS) to allow the token holders to vote and elect the validator set. It increases the decentralization and favors community governance. BSC here proposes to combine DPoS and PoA for consensus, so that: 1. Blocks are produced by a limited set of validators 2. Validators take turns to produce blocks in a PoA manner, similar to [Ethereum’s Clique](https://eips.ethereum.org/EIPS/eip-225) consensus design 3. Validator set are elected in and out based on a staking based governance ## Validator Quorum In the genesis stage, a few trusted nodes will run as the initial Validator Set. After the blocking starts, anyone can compete to join as candidates to elect as a validator. The staking status decides the top 21 most staked nodes to be the next validator set, and such an election will repeat every 24 hours. **BNB** is the token used to stake for BSC. In order to remain as compatible as Ethereum and upgradeable to future consensus protocols to be developed, BSC chooses to rely on the **BC** for staking management (Please refer to the below “[Staking and Governance](#staking-and-governance)” section). There is a **dedicated staking module for BSC on BC**. It will accept BSC staking from BNB holders and calculate the highest staked node set. Upon every UTC midnight, BC will issue a verifiable `ValidatorSetUpdate` cross-chain message to notify BSC to update its validator set. While producing further blocks, the existing BSC validators check whether there is a `ValidatorSetUpdate` message relayed onto BSC periodically. If there is, they will update the validator set after an **epoch period**, i.e. a predefined number of blocking time. For example, if BSC produces a block every 5 seconds, and the epoch period is 240 blocks, then the current validator set will check and update the validator set for the next epoch in 1200 seconds (20 minutes). ## Security and Finality Given there are more than ½\*N+1 validators are honest, PoA based networks usually work securely and properly. However, there are still cases where certain amount Byzantine validators may still manage to attack the network, e.g. through the “[Clone Attack](https://arxiv.org/pdf/1902.10244.pdf)”. To secure as much as BC, BSC users are encouraged to wait until receiving blocks sealed by more than ⅔\*N+1 different validators. In that way, the BSC can be trusted at a similar security level to BC and can tolerate less than ⅓\*N Byzantine validators. With 21 validators, if the block time is 5 seconds, the ⅔\*N+1 different validator seals will need a time period of (⅔\*21+1)*5 = 75 seconds. Any critical applications for BSC may have to wait for ⅔\*N+1 to ensure a relatively secure finality. However, besides such arrangement, BSC does introduce **Slashing** logic to penalize Byzantine validators for **double signing** or **inavailability**, which will be covered in the “Staking and Governance” section later. This Slashing logic will expose the malicious validators in a very short time and make the “Clone Attack” very hard or extremely non-beneficial to execute. With this enhancement, ½\*N+1 or even fewer blocks are enough as confirmation for most transactions. ## Reward All the BSC validators in the current validator set will be rewarded with transaction **fees in BNB**. As BNB is not an inflationary token, there will be no mining rewards as what Bitcoin and Ethereum network generate, and the gas fee is the major reward for validators. As BNB is also utility tokens with other use cases, delegators and validators will still enjoy other benefits of holding BNB. The reward for validators is the fees collected from transactions in each block. Validators can decide how much to give back to the delegators who stake their BNB to them, in order to attract more staking. Every validator will take turns to produce the blocks in the same probability (if they stick to 100% liveness), thus, in the long run, all the stable validators may get a similar size of the reward. Meanwhile, the stakes on each validator may be different, so this brings a counter-intuitive situation that more users trust and delegate to one validator, they potentially get less reward. So rational delegators will tend to delegate to the one with fewer stakes as long as the validator is still trustful (insecure validator may bring slashable risk). In the end, the stakes on all the validators will have less variation. This will actually prevent the stake concentration and “winner wins forever” problem seen on some other networks. Some parts of the gas fee will also be rewarded to relayers for Cross-Chain communication. Please refer to the “[Relayers](#relayers)” section below. # Token Economy BC and BSC share the same token universe for BNB and BEP2 tokens. This defines: 1. The same token can circulate on both networks, and flow between them bi-directionally via a cross-chain communication mechanism. 2. The total circulation of the same token should be managed across the two networks, i.e. the total effective supply of a token should be the sum of the token’s total effective supply on both BSC and BC. 3. The tokens can be initially created on BSC in a similar format as ERC20 token standard, or on BC as a BEP2, then created on the other. There are native ways on both networks to link the two and secure the total supply of the token. ## Native Token BNB will run on BSC in the same way as ETH runs on Ethereum so that it remains as “native token” for both BSC and BC. This means, in addition to BNB is used to pay most of the fees on Binance Chain and Binance DEX, BNB will be also used to: 1. pay “fees“ to deploy smart contracts on BSC 2. stake on selected BSC validators, and get corresponding rewards 3. perform cross-chain operations, such as transfer token assets across BC and BSC ### Seed Fund Certain amounts of BNB will be burnt on BC and minted on BSC during its genesis stage. This amount is called “Seed Fund” to circulate on BSC after the first block, which will be dispatched to the initial BC-to-BSC Relayer(described in later sections) and initial validator set introduced at genesis. These BNBs are used to pay transaction fees in the early stage to transfer more BNB from BC onto BSC via the cross-chain mechanism. The BNB cross-chain transfer is discussed in a later section, but for BC to BSC transfer, it is generally to lock BNB on BC from the source address of the transfer to a system-controlled address and unlock the corresponding amount from special contract to the target address of the transfer on BSC, or reversely, when transferring from BSC to BC, it is to lock BNB from the source address on BSC into a special contract and release locked amount on BC from the system address to the target address. The logic is related to native code on BC and a series of smart contracts on BSC. ## Other Tokens BC supports BEP2 tokens and upcoming [BEP8 tokens](https://github.com/binance-chain/BEPs/pull/69), which are native assets transferrable and tradable (if listed) via fast transactions and sub-second finality. Meanwhile, as BSC is Ethereum compatible, it is natural to support ERC20 tokens on BSC, which here is called “**BEP2E**” (with the real name to be introduced by the future BEPs,it potentially covers BEP8 as well). BEP2E may be “Enhanced” by adding a few more methods to expose more information, such as token denomination, decimal precision definition and the owner address who can decide the Token Binding across the chains. BSC and BC work together to ensure that one token can circulate in both formats with confirmed total supply and be used in different use cases. ### Token Binding BEP2 tokens will be extended to host a new attribute to associate the token with a BSC BEP2E token contract, called “**Binder**”, and this process of association is called “**Token Binding**”. Token Binding can happen at any time after BEP2 and BEP2E are ready. The token owners of either BEP2 or BEP2E don’t need to bother about the Binding, until before they really want to use the tokens on different scenarios. Issuers can either create BEP2 first or BEP2E first, and they can be bound at a later time. Of course, it is encouraged for all the issuers of BEP2 and BEP2E to set the Binding up early after the issuance. A typical procedure to bind the BEP2 and BEP2E will be like the below: 1. Ensure both the BEP2 token and the BEP2E token both exist on each blockchain, with the same total supply. BEP2E should have 3 more methods than typical ERC20 token standard: * symbol(): get token symbol * decimals(): get the number of the token decimal digits * owner(): get **BEP2E contract owner’s address.** This value should be initialized in the BEP2E contract constructor so that the further binding action can verify whether the action is from the BEP2E owner. 2. Decide the initial circulation on both blockchains. Suppose the total supply is *S*, and the expected initial circulating supply on BC is *K*, then the owner should lock S-K tokens to a system controlled address on BC. 3. Equivalently, *K* tokens is locked in the special contract on BSC, which handles major binding functions and is named as **TokenHub**. The issuer of the BEP2E token should lock the *K* amount of that token into TokenHub, resulting in *S-K* tokens to circulate on BSC. Thus the total circulation across 2 blockchains remains as *S*. 4. The issuer of BEP2 token sends the bind transaction on BC. Once the transaction is executed successfully after proper verification: * It transfers *S-K* tokens to a system-controlled address on BC. * A cross-chain bind request package will be created, waiting for Relayers to relay. 5. BSC Relayers will relay the cross-chain bind request package into **TokenHub** on BSC, and the corresponding request and information will be stored into the contract. 6. The contract owner and only the owner can run a special method of TokenHub contract, `ApproveBind`, to verify the binding request to mark it as a success. It will confirm: * the token has not been bound; * the binding is for the proper symbol, with proper total supply and decimal information; * the proper lock are done on both networks; 10. Once the `ApproveBind` method has succeeded, TokenHub will mark the two tokens are bounded and share the same circulation on BSC, and the status will be propagated back to BC. After this final confirmation, the BEP2E contract address and decimals will be written onto the BEP2 token as a new attribute on BC, and the tokens can be transferred across the two blockchains bidirectionally. If the ApproveBind fails, the failure event will also be propagated back to BC to release the locked tokens, and the above steps can be re-tried later. # Cross-Chain Transfer and Communication Cross-chain communication is the key foundation to allow the community to take advantage of the dual chain structure: * users are free to create any tokenization, financial products, and digital assets on BSC or BC as they wish * the items on BSC can be manually and programmingly traded and circulated in a stable, high throughput, lighting fast and friendly environment of BC * users can operate these in one UI and tooling ecosystem. ## Cross-Chain Transfer The cross-chain transfer is the key communication between the two blockchains. Essentially the logic is: 1. the `transfer-out` blockchain will lock the amount from source owner addresses into a system controlled address/contracts; 2. the `transfer-in` blockchain will unlock the amount from the system controlled address/contracts and send it to target addresses. The cross-chain transfer package message should allow the BSC Relayers and BC **Oracle Relayers** to verify: 1. Enough amount of token assets are removed from the source address and locked into a system controlled addresses/contracts on the source blockchain. And this can be confirmed on the target blockchain. 2. Proper amounts of token assets are released from a system controlled addresses/contracts and allocated into target addresses on the target blockchain. If this fails, it can be confirmed on source blockchain, so that the locked token can be released back (may deduct fees). 3. The sum of the total circulation of the token assets across the 2 blockchains are not changed after this transfer action completes, no matter if the transfer succeeds or not.  The architecture of cross-chain communication is as in the above diagram. To accommodate the 2 heteroid systems, communication handling is different in each direction. ## BC to BSC Architecture BC is a Tendermint-based, instant finality blockchain. Validators with at least ⅔\*N+1 of the total voting power will co-sign each block on the chain. So that it is practical to verify the block transactions and even the state value via **Block Header** and **Merkle Proof** verification. This has been researched and implemented as “**Light-Client Protocol**”, which are intensively discussed in [the Ethereum](https://github.com/ethereum/wiki/wiki/Light-client-protocol) community, studied and implemented for [Cosmos inter-chain communication](https://github.com/cosmos/ics/blob/a4173c91560567bdb7cc9abee8e61256fc3725e9/spec/ics-007-tendermint-client/README.md). BC-to-BSC communication will be verified in an “**on-chain light client**” implemented via BSC **Smart Contracts** (some of them may be **“pre-compiled”**). After some transactions and state change happen on BC, if a transaction is defined to trigger cross-chain communication,the Cross-chain “**package**” message will be created and **BSC Relayers** will pass and submit them onto BSC as data into the "build-in system contracts". The build-in system contracts will verify the package and execute the transactions if it passes the verification. The verification will be guaranteed with the below design: 1. BC blocking status will be synced to the light client contracts on BSC from time to time, via block header and pre-commits, for the below information: * block and app hash of BC that are signed by validators * current validatorset, and validator set update 2. the key-value from the blockchain state will be verified based on the Merkle Proof and information from above #1. After confirming the key-value is accurate and trustful, the build-in system contracts will execute the actions corresponding to the cross-chain packages. Some examples of such packages that can be created for BC-to-BSC are: 1. Bind: bind the BEP2 tokens and BEP2E 2. Transfer: transfer tokens after binding, this means the circulation will decrease (be locked) from BC and appear in the target address balance on BSC 3. Error Handling: to handle any timeout/failure event for BSC-to-BC communication 4. Validatorset update of BSC To ensure no duplication, proper message sequence and timely timeout, there is a “Channel” concept introduced on BC to manage any types of the communication. For relayers, please also refer to the below “Relayers” section. ## BSC to BC Architecture BSC uses Proof of Staked Authority consensus protocol, which has a chance to fork and requires confirmation of more blocks. One block only has the signature of one validator, so that it is not easy to rely on one block to verify data from BSC. To take full advantage of validator quorum of BC, an idea similar to many [Bridge ](https://github.com/poanetwork/poa-bridge)or Oracle blockchains is adopted: 1. The cross-chain communication requests from BSC will be submitted and executed onto BSC as transactions. The execution of the transanction wil emit `Events`, and such events can be observed and packaged in certain “**Oracle**” onto BC. Instead of Block Headers, Hash and Merkle Proof, this type of “Oracle” package directly contains the cross-chain information for actions, such as sender, receiver and amount for transfer. 2. To ensure the security of the Oracle, the validators of BC will form anothe quorum of “**Oracle Relayers**”. Each validator of the BC should run a **dedicated process** as the Oracle Relayer. These Oracle Relayers will submit and vote for the cross-chain communication package, like Oracle, onto BC, using the same validator keys. Any package signed by more than ⅔\*N+1 Oracle Relayers’ voting power is as secure as any block signed by ⅔\*N+1 of the same quorum of validators’ voting power. By using the same validator quorum, it saves the light client code on BC and continuous block updates onto BC. Such Oracles also have Oracle IDs and types, to ensure sequencing and proper error handling. ## Timeout and Error Handling There are scenarios that the cross-chain communication fails. For example, the relayed package cannot be executed on BSC due to some coding bug in the contracts. **Timeout and error handling logics are** used in such scenarios. For the recognizable user and system errors or any expected exceptions, the two networks should heal themselves. For example, when BC to BSC transfer fails, BSC will issue a failure event and Oracle Relayers will execute a refund on BC; when BSC to BC transfer fails, BC will issue a refund package for Relayer to relay in order to unlock the fund. However, unexpected error or exception may still happen on any step of the cross-chain communication. In such a case, the Relayers and Oracle Relayers will discover that the corresponding cross-chain channel is stuck in a particular sequence. After a Timeout period, the Relayers and Oracle Relayers can request a “SkipSequence” transaction, the stuck sequence will be marked as “Unexecutable”. A corresponding alerts will be raised, and the community has to discuss how to handle this scenario, e.g. payback via the sponsor of the validators, or event clear the fund during next network upgrade. ## Cross-Chain User Experience Ideally, users expect to use two parallel chains in the same way as they use one single chain. It requires more aggregated transaction types to be added onto the cross-chain communication to enable this, which will add great complexity, tight coupling, and maintenance burden. Here BC and BSC only implement the basic operations to enable the value flow in the initial launch and leave most of the user experience work to client side UI, such as wallets. E.g. a great wallet may allow users to sell a token directly from BSC onto BC’s DEX order book, in a secure way. ## Cross-Chain Contract Event Cross-Chain Contract Event (CCCE) is designed to allow a smart contract to trigger cross-chain transactions, directly through the contract code. This becomes possible based on: 1. Standard system contracts can be provided to serve operations callable by general smart contracts; 2. Standard events can be emitted by the standard contracts; 3. Oracle Relayers can capture the standard events, and trigger the corresponding cross-chain operations; 4. Dedicated, code-managed address (account) can be created on BC and accessed by the contracts on the BSC, here it is named as **“Contract Address on BC” (CAoB)**. Several standard operations are implemented: 1. BSC to BC transfer: this is implemented in the same way as normal BSC to BC transfer, by only triggered via standard contract. The fund can be transferred to any addresses on BC, including the corresponding CAoB of the transfer originating contract. 2. Transfer on BC: this is implemented as a special cross-chain transfer, while the real transfer is from **CAoB** to any other address (even another CAoB). 3. BC to BSC transfer: this is implemented as two-pass cross-chain communication. The first is triggered by the BSC contract and propagated onto BC, and then in the second pass, BC will start a normal BC to BSC cross-chain transfer, from **CAoB** to contract address on BSC. A special note should be paid on that the BSC contract only increases balance upon any transfer coming in on the second pass, and the error handling in the second pass is the same as the normal BC to BSC transfer. 4. IOC (Immediate-Or-Cancel) Trade Out: the primary goal of transferring assets to BC is to trade. This event will instruct to trade a certain amount of an asset in CAoB into another asset as much as possible and transfer out all the results, i.e. the left the source and the traded target tokens of the trade, back to BSC. BC will handle such relayed events by sending an “Immediate-Or-Cancel”, i.e. IOC order onto the trading pairs, once the next matching finishes, the result will be relayed back to BSC, which can be in either one or two assets. 5. Auction Trade Out: Such event will instruct BC to send an auction order to trade a certain amount of an asset in **CAoB** into another asset as much as possible and transfer out all the results back to BSC at the end of the auction. Auction function is upcoming on BC. There are some details for the Trade Out: 1. both can have a limit price (absolute or relative) for the trade; 2. the end result will be written as cross-chain packages to relay back to BSC; 3. cross-chain communication fees may be charged from the asset transferred back to BSC; 4. BSC contract maintains a mirror of the balance and outstanding orders on CAoB. No matter what error happens during the Trade Out, the final status will be propagated back to the originating contract and clear its internal state. With the above features, it simply adds the cross-chain transfer and exchange functions with high liquidity onto all the smart contracts on BSC. It will greatly add the application scenarios on Smart Contract and dApps, and make 1 chain +1 chain > 2 chains. # Staking and Governance Proof of Staked Authority brings in decentralization and community involvement. Its core logic can be summarized as the below. You may see similar ideas from other networks, especially Cosmos and EOS. 1. Token holders, including the validators, can put their tokens “**bonded**” into the stake. Token holders can **delegate** their tokens onto any validator or validator candidate, to expect it can become an actual validator, and later they can choose a different validator or candidate to **re-delegate** their tokens<sup>1</sup>. 2. All validator candidates will be ranked by the number of bonded tokens on them, and the top ones will become the real validators. 3. Validators can share (part of) their blocking reward with their delegators. 4. Validators can suffer from “**Slashing**”, a punishment for their bad behaviors, such as double sign and/or instability. 5. There is an “**unbonding period**” for validators and delegators so that the system makes sure the tokens remain bonded when bad behaviors are caught, the responsible will get slashed during this period. ## Staking on BC Ideally, such staking and reward logic should be built into the blockchain, and automatically executed as the blocking happens. Cosmos Hub, who shares the same Tendermint consensus and libraries with Binance Chain, works in this way. BC has been preparing to enable staking logic since the design days. On the other side, as BSC wants to remain compatible with Ethereum as much as possible, it is a great challenge and efforts to implement such logic on it. This is especially true when Ethereum itself may move into a different Proof of Stake consensus protocol in a short (or longer) time. In order to keep the compatibility and reuse the good foundation of BC, the staking logic of BSC is implemented on BC: 1. The staking token is BNB, as it is a native token on both blockchains anyway 2. The staking, i.e. token bond and delegation actions and records for BSC, happens on BC. 3. The BSC validator set is determined by its staking and delegation logic, via a staking module built on BC for BSC, and propagated every day UTC 00:00 from BC to BSC via Cross-Chain communication. 4. The reward distribution happens on BC around every day UTC 00:00. ## Rewarding Both the validator update and reward distribution happen every day around UTC 00:00. This is to save the cost of frequent staking updates and block reward distribution. This cost can be significant, as the blocking reward is collected on BSC and distributed on BC to BSC validators and delegators. (Please note BC blocking fees will remain rewarding to BC validators only.) A deliberate delay is introduced here to make sure the distribution is fair: 1. The blocking reward will not be sent to validator right away, instead, they will be distributed and accumulated on a contract; 2. Upon receiving the validator set update into BSC, it will trigger a few cross-chain transfers to transfer the reward to custody addresses on the corresponding validators. The custody addresses are owned by the system so that the reward cannot be spent until the promised distribution to delegators happens. 3. In order to make the synchronization simpler and allocate time to accommodate slashing, the reward for N day will be only distributed in N+2 days. After the delegators get the reward, the left will be transferred to validators’ own reward addresses. ## Slashing Slashing is part of the on-chain governance, to ensure the malicious or negative behaviors are punished. BSC slash can be submitted by anyone. The transaction submission requires **slash evidence** and cost fees but also brings a larger reward when it is successful. So far there are two slashable cases. ### Double Sign It is quite a serious error and very likely deliberate offense when a validator signs more than one block with the same height and parent block. The reference protocol implementation should already have logic to prevent this, so only the malicious code can trigger this. When Double Sign happens, the validator should be removed from the Validator **Set** right away. Anyone can submit a slash request on BC with the evidence of Double Sign of BSC, which should contain the 2 block headers with the same height and parent block, sealed by the offending validator. Upon receiving the evidence, if the BC verifies it to be valid: 1. The validator will be removed from validator set by an instance BSC validator set update Cross-Chain update; 2. A predefined amount of BNB would be slashed from the **self-delegated** BNB of the validator; Both validator and its delegators will not receive the staking rewards. 3. Part of the slashed BNB will allocate to the submitter’s address, which is a reward and larger than the cost of submitting slash request transaction 4. The rest of the slashed BNB will allocate to the other validators’ custody addresses, and distributed to all delegators in the same way as blocking reward. ### Inavailability The liveness of BSC relies on everyone in the Proof of Staked Authority validator set can produce blocks timely when it is their turn. Validators can miss their turn due to any reason, especially problems in their hardware, software, configuration or network. This instability of the operation will hurt the performance and introduce more indeterministic into the system. There can be an internal smart contract responsible for recording the missed blocking metrics of each validator. Once the metrics are above the predefined threshold, the blocking reward for validator will not be relayed to BC for distribution but shared with other better validators. In such a way, the poorly-operating validator should be gradually voted out of the validator set as their delegators will receive less or none reward. If the metrics remain above another higher level of threshold, the validator will be dropped from the rotation, and this will be propagated back to BC, then a predefined amount of BNB would be slashed from the **self-delegated** BNB of the validator. Both validators and delegators will not receive their staking rewards. ### Governance Parameters There are many system parameters to control the behavior of the BSC, e.g. slash amount, cross-chain transfer fees. All these parameters will be determined by BSC Validator Set together through a proposal-vote process based on their staking. Such the process will be carried on BC, and the new parameter values will be picked up by corresponding system contracts via a cross-chain communication. # Relayers Relayers are responsible to submit Cross-Chain Communication Packages between the two blockchains. Due to the heterogeneous parallel chain structure, two different types of Relayers are created. ## BSC Relayers Relayers for BC to BSC communication referred to as “**BSC Relayers**”, or just simply “Relayers”. Relayer is a standalone process that can be run by anyone, and anywhere, except that Relayers must register themselves onto BSC and deposit a certain refundable amount of BNB. Only relaying requests from the registered Relayers will be accepted by BSC. The package they relay will be verified by the on-chain light client on BSC. The successful relay needs to pass enough verification and costs gas fees on BSC, and thus there should be incentive reward to encourage the community to run Relayers. ### Incentives There are two major communication types: 1. Users triggered Operations, such as `token bind` or `cross chain transfer`. Users must pay additional fee to as relayer reward. The reward will be shared with the relayers who sync the referenced blockchain headers. Besides, the reward won't be paid the relayers' accounts directly. A reward distribution mechanism will be brought in to avoid monopolization. 2. System Synchronization, such as delivering `refund package`(caused by failures of most oracle relayers), special blockchain header synchronization(header contains BC validatorset update), BSC staking package. System reward contract will pay reward to relayers' accounts directly. If some Relayers have faster networks and better hardware, they can monopolize all the package relaying and leave no reward to others. Thus fewer participants will join for relaying, which encourages centralization and harms the efficiency and security of the network. Ideally, due to the decentralization and dynamic re-election of BSC validators, one Relayer can hardly be always the first to relay every message. But in order to avoid the monopolization further, the rewarding economy is also specially designed to minimize such chance: 1. The reward for Relayers will be only distributed in batches, and one batch will cover a number of successful relayed packages. 2. The reward a Relayer can get from a batch distribution is not linearly in proportion to their number of successful relayed packages. Instead, except the first a few relays, the more a Relayer relays during a batch period, the less reward it will collect. ## Oracle Relayers Relayers for BSC to BC communication are using the “Oracle” model, and so-called “**Oracle Relayers**”. Each of the validators must, and only the ones of the validator set, run Oracle Relayers. Each Oracle Relayer watches the blockchain state change. Once it catches Cross-Chain Communication Packages, it will submit to vote for the requests. After Oracle Relayers from ⅔ of the voting power of BC validators vote for the changes, the cross-chain actions will be performed. Oracle Replayers should wait for enough blocks to confirm the finality on BSC before submitting and voting for the cross-chain communication packages onto BC. The cross-chain fees will be distributed to BC validators together with the normal BC blocking rewards. Such oracle type relaying depends on all the validators to support. As all the votes for the cross-chain communication packages are recorded on the blockchain, it is not hard to have a metric system to assess the performance of the Oracle Relayers. The poorest performer may have their rewards clawed back via another Slashing logic introduced in the future. # Outlook It is hard to conclude for Binance Chain, as it has never stopped evolving. The dual-chain strategy is to open the gate for users to take advantage of the fast transferring and trading on one side, and flexible and extendable programming on the other side, but it will be one stop along the development of Binance Chain. Here below are the topics to look into so as to facilitate the community better for more usability and extensibility: 1. Add different digital asset model for different business use cases 2. Enable more data feed, especially DEX market data, to be communicated from Binance DEX to BSC 3. Provide interface and compatibility to integrate with Ethereum, including its further upgrade, and other blockchain 4. Improve client side experience to manage wallets and use blockchain more conveniently ------ [1]: BNB business practitioners may provide other benefits for BNB delegators, as they do now for long term BNB holders.
osmocn
Modern SaaS starter kit with Next.js 16, tRPC, better-auth, and Drizzle ORM. Features type-safe APIs, email workflows, SEO optimization, and shadcn/ui components.
shumpei
jdb.js is a framework that helps coding with Indexed Database API (IDB). As you know, 'J' is the next character of 'I' in alphabetical order, so 'JDB' means the 'Better IDB API':-)
alexasomba
A TypeScript-first plugin that integrates Paystack into Better Auth, enabling seamless customer creation, secure checkout, webhook verification, and native subscription flows. Designed for modern frameworks like Tanstack Start, Next.js, Hono, and Cloudflare Workers, it provides typed APIs, subscription management, and end-to-end payment integration
anujkumarthakur
Introduction Note: This edition of the book is the same as The Rust Programming Language available in print and ebook format from No Starch Press. Welcome to The Rust Programming Language, an introductory book about Rust. The Rust programming language helps you write faster, more reliable software. High-level ergonomics and low-level control are often at odds in programming language design; Rust challenges that conflict. Through balancing powerful technical capacity and a great developer experience, Rust gives you the option to control low-level details (such as memory usage) without all the hassle traditionally associated with such control. Who Rust Is For Rust is ideal for many people for a variety of reasons. Let’s look at a few of the most important groups. Teams of Developers Rust is proving to be a productive tool for collaborating among large teams of developers with varying levels of systems programming knowledge. Low-level code is prone to a variety of subtle bugs, which in most other languages can be caught only through extensive testing and careful code review by experienced developers. In Rust, the compiler plays a gatekeeper role by refusing to compile code with these elusive bugs, including concurrency bugs. By working alongside the compiler, the team can spend their time focusing on the program’s logic rather than chasing down bugs. Rust also brings contemporary developer tools to the systems programming world: Cargo, the included dependency manager and build tool, makes adding, compiling, and managing dependencies painless and consistent across the Rust ecosystem. Rustfmt ensures a consistent coding style across developers. The Rust Language Server powers Integrated Development Environment (IDE) integration for code completion and inline error messages. By using these and other tools in the Rust ecosystem, developers can be productive while writing systems-level code. Students Rust is for students and those who are interested in learning about systems concepts. Using Rust, many people have learned about topics like operating systems development. The community is very welcoming and happy to answer student questions. Through efforts such as this book, the Rust teams want to make systems concepts more accessible to more people, especially those new to programming. Companies Hundreds of companies, large and small, use Rust in production for a variety of tasks. Those tasks include command line tools, web services, DevOps tooling, embedded devices, audio and video analysis and transcoding, cryptocurrencies, bioinformatics, search engines, Internet of Things applications, machine learning, and even major parts of the Firefox web browser. Open Source Developers Rust is for people who want to build the Rust programming language, community, developer tools, and libraries. We’d love to have you contribute to the Rust language. People Who Value Speed and Stability Rust is for people who crave speed and stability in a language. By speed, we mean the speed of the programs that you can create with Rust and the speed at which Rust lets you write them. The Rust compiler’s checks ensure stability through feature additions and refactoring. This is in contrast to the brittle legacy code in languages without these checks, which developers are often afraid to modify. By striving for zero-cost abstractions, higher-level features that compile to lower-level code as fast as code written manually, Rust endeavors to make safe code be fast code as well. The Rust language hopes to support many other users as well; those mentioned here are merely some of the biggest stakeholders. Overall, Rust’s greatest ambition is to eliminate the trade-offs that programmers have accepted for decades by providing safety and productivity, speed and ergonomics. Give Rust a try and see if its choices work for you. Who This Book Is For This book assumes that you’ve written code in another programming language but doesn’t make any assumptions about which one. We’ve tried to make the material broadly accessible to those from a wide variety of programming backgrounds. We don’t spend a lot of time talking about what programming is or how to think about it. If you’re entirely new to programming, you would be better served by reading a book that specifically provides an introduction to programming. How to Use This Book In general, this book assumes that you’re reading it in sequence from front to back. Later chapters build on concepts in earlier chapters, and earlier chapters might not delve into details on a topic; we typically revisit the topic in a later chapter. You’ll find two kinds of chapters in this book: concept chapters and project chapters. In concept chapters, you’ll learn about an aspect of Rust. In project chapters, we’ll build small programs together, applying what you’ve learned so far. Chapters 2, 12, and 20 are project chapters; the rest are concept chapters. Chapter 1 explains how to install Rust, how to write a Hello, world! program, and how to use Cargo, Rust’s package manager and build tool. Chapter 2 is a hands-on introduction to the Rust language. Here we cover concepts at a high level, and later chapters will provide additional detail. If you want to get your hands dirty right away, Chapter 2 is the place for that. At first, you might even want to skip Chapter 3, which covers Rust features similar to those of other programming languages, and head straight to Chapter 4 to learn about Rust’s ownership system. However, if you’re a particularly meticulous learner who prefers to learn every detail before moving on to the next, you might want to skip Chapter 2 and go straight to Chapter 3, returning to Chapter 2 when you’d like to work on a project applying the details you’ve learned. Chapter 5 discusses structs and methods, and Chapter 6 covers enums, match expressions, and the if let control flow construct. You’ll use structs and enums to make custom types in Rust. In Chapter 7, you’ll learn about Rust’s module system and about privacy rules for organizing your code and its public Application Programming Interface (API). Chapter 8 discusses some common collection data structures that the standard library provides, such as vectors, strings, and hash maps. Chapter 9 explores Rust’s error-handling philosophy and techniques. Chapter 10 digs into generics, traits, and lifetimes, which give you the power to define code that applies to multiple types. Chapter 11 is all about testing, which even with Rust’s safety guarantees is necessary to ensure your program’s logic is correct. In Chapter 12, we’ll build our own implementation of a subset of functionality from the grep command line tool that searches for text within files. For this, we’ll use many of the concepts we discussed in the previous chapters. Chapter 13 explores closures and iterators: features of Rust that come from functional programming languages. In Chapter 14, we’ll examine Cargo in more depth and talk about best practices for sharing your libraries with others. Chapter 15 discusses smart pointers that the standard library provides and the traits that enable their functionality. In Chapter 16, we’ll walk through different models of concurrent programming and talk about how Rust helps you to program in multiple threads fearlessly. Chapter 17 looks at how Rust idioms compare to object-oriented programming principles you might be familiar with. Chapter 18 is a reference on patterns and pattern matching, which are powerful ways of expressing ideas throughout Rust programs. Chapter 19 contains a smorgasbord of advanced topics of interest, including unsafe Rust, macros, and more about lifetimes, traits, types, functions, and closures. In Chapter 20, we’ll complete a project in which we’ll implement a low-level multithreaded web server! Finally, some appendixes contain useful information about the language in a more reference-like format. Appendix A covers Rust’s keywords, Appendix B covers Rust’s operators and symbols, Appendix C covers derivable traits provided by the standard library, Appendix D covers some useful development tools, and Appendix E explains Rust editions. There is no wrong way to read this book: if you want to skip ahead, go for it! You might have to jump back to earlier chapters if you experience any confusion. But do whatever works for you. An important part of the process of learning Rust is learning how to read the error messages the compiler displays: these will guide you toward working code. As such, we’ll provide many examples that don’t compile along with the error message the compiler will show you in each situation. Know that if you enter and run a random example, it may not compile! Make sure you read the surrounding text to see whether the example you’re trying to run is meant to error. Ferris will also help you distinguish code that isn’t meant to work:
Briechenstein12
Search documentation... Support Dashboard Card Payments Quickstart Securely collect card information from your customers and create a card payment. Supported cards Users in the United States can accept Visa Mastercard American Express Discover JCB Diners Club credit and debit cards. Stripe also supports a range of additional payment methods, depending on the country of your Stripe account. Accepting a card payment using Stripe is a two-step process, with a client-side and a server-side action: From your website running in the customer’s browser, Stripe securely collects your customer’s payment information and returns a representative token. This, along with any other form data, is then submitted by the browser to your server. Using the token, your server-side code makes an API request to create a charge and complete the payment. Tokenization ensures that no sensitive card data ever needs to touch your server so your integration can operate in a PCI compliant way. Step 1: Securely collecting payment information Checkout reference Complete information about available options and parameters is provided in the Checkout reference. The simplest way for you to securely collect and tokenize card information is with Checkout. It combines HTML, JavaScript, and CSS to create an embedded payment form. When your customer enters their payment information, the card details are validated and tokenized for your server-side code to use. To see Checkout in action, click the button below, filling in the resulting form with: Any random, syntactically valid email address (the more random, the better) One of Stripe’s test card numbers, such as 4242 4242 4242 4242 Any three-digit CVC code Any expiration date in the future To get started, add the following code to your payment page, making sure that the form submits to your own server-side code: <form action="your-server-side-code" method="POST"> <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" data-key="pk_test_2DtHIU1N9li5GpmJjyxkQMHh" data-amount="999" data-name="Demo Site" data-description="Example charge" data-image="https://stripe.com/img/documentation/checkout/marketplace.png" data-locale="auto"> </script> </form> We’ve pre-filled the data-key attribute with your test publishable API key—only you can see this value. When you’re ready to go live with your payment form, you must replace the test key with your live key. Learn more about how the keys play into test and live modes. Although optional, we highly recommend also having Checkout collect the user’s ZIP code, as address and ZIP code verifications help reduce fraud. Add data-zip-code="true" to the above and enable declines on verification failures in your account settings. You can also set Checkout to collect the user’s full billing and shipping addresses (using the corresponding parameters). Requiring more than the minimum information lowers the possibility of a payment being declined or disputed in the future. Any fraudulent payments that you process are ultimately your responsibility, so requiring a little more than the minimum amount of information is an effective way to combat fraud. Radar, our modern suite of fraud protection tools, is only available to users who have implemented client-side tokenization. By doing so, it ensures that you can pass the necessary data required for our machine-learning fraud prevention models to make more accurate predictions. The amount provided in the Checkout form code is only shown to the user. It does not set the amount that the customer will be charged—you must also specify an amount when making a charge request. As you build your integration, make sure that your payment form and server-side code use the same amount to avoid confusion. An alternative to the blue button demonstrated above is to implement a custom Checkout integration. The custom approach allows you to use any HTML element or JavaScript event to open Checkout, as well as be able to specify dynamic arguments, such as custom amounts. Stripe.js and Elements If you’d prefer to have complete control over the look and fel of your payment form, you can make use of Stripe.js and Elements, our pre-built UI components. Refer to our Elements quickstart to learn more. Mobile SDKs Using our native mobile libraries for iOS and Android, Stripe can collect your customer’s payment information from within your mobile app and create a token for your server-side code to use. Step 2: Creating a charge to complete the payment Once a token is created, your server-side code makes an API request to create a one-time charge. This request contains the token, currency, amount to charge, and any additional information you may want to pass (e.g., metadata). curl Ruby Python PHP Java Node Go .NET curl https://api.stripe.com/v1/charges \ -u sk_test_fyzWf8eDyljIob76fMVSwIsi: \ -d amount=999 \ -d currency=usd \ -d description="Example charge" \ -d source=tok_6Pk6W3hFiGB7dyNavdvyrFkM These requests expect the ID of the Token (e.g., tok_KPte7942xySKBKyrBu11yEpf) to be provided as the value of the source parameter. Tokens can only be used once, and within a few minutes of creation. Using this approach, your customers need to re-enter their payment details each time they make a purchase. You can also save card details with Stripe for later use. Using this method, returning customers can quickly make a payment without providing their card details again. Next steps Congrats! You can now accept card payments with Stripe using Checkout. You may now want to check out these resources: Creating charges Getting paid Managing your Stripe account Supported payment methods Saving cards Questions? We're always happy to help with code or other questions you might have! Search our documentation, contact support, or connect with our sales team. You can also chat live with other developers in #stripe on freenode. Was this page helpful? Yes No
filp
Opinionated TypeScript-first helpers for better NextJS APIs
sn0112358
Angular-Directive-Project Directives range from very basic to extremely complex. This project will build up to some somewhat difficult directives. Keep in mind that the format we're learning for directives is the same format used to build some extremely complex things in angular. Using directives often and well is one way to show you're a talented developer. Starting Out We've included only a few things for you to begin with. index.html, app.js, styles.css. At this point the best way to get more comfortable with angular is to initialize an app without relying heavily on boilerplate code (reusable code that starts out your projects for you). You'll notice that in the index.html we've included the angular-route CDN. Yes, we'll be using angular's router here. Put an ng-view into your index.html. In your app.js set up a config and set up our first route for when a user is at the '/home' url. If you're having trouble remembering how to set up the router go look at how you set up the router on the previous project. One way these projects will be beneficial to you is allowing you to look back at something *you** did and seeing how you got that something to work.* You may also want add an otherwise that defaults to /home. Create a controller and a template file for this route in your app folder. Don't forget to include the controller as a script in your index.html Check that everything is hooked up correctly. Try adding a div with some text in your home template just to make sure it's showing up. Once you've got that going you're ready to start on some directives. Now let's make our directive. We'll start with a simple one that we can use to display information passed to it. Step 1. Start your directive Woot. When you're initializing your directive just remember that it works very similarly to how you start up a controller or a service. It can also be very helpful to think of your directive as a route. Create your directive. You'll use the directive method on your angular module. It takes two arguments, the name string and the callback function, which will return the object that represents your directive. When naming your directive give it a name with two words; dirDisplay would be nice, but anything works. Just remember it's best practice to give a directive a camel case name so that it's clear in your html what it is. Also we're going to need a template html for our directive. We could do it inline, but let's make another file instead. Just name it something that makes sense for the name of your directive and put it in the same directory as your directive file. For your template just make a <div> and inside a <h1> tag that says User. Now in your home route html add in your directive. It will look like this if you named it dirDisplay: <dir-display></dir-display> Start up your app and go to the home route. Check and make sure you see User where your directive was placed. If you're not seeing it at this point it could mean a few things. Here's some more common issues. You didn't link your directive in your index as a script. Your name for your directive doesn't match the name in your html. Remember camel case becomes snake case so myDirective becomes <my-directive></my-directive>. You're file path to your html template is wrong. You have to think of file paths in angular as relative to the index. Here's some code to see just for this part, and just for the directive's js file. var app = angular.module('directivePractice'); app.directive('dirDisplay', function(){ return { templateUrl: 'app/directives/dirDisplay.html' }; }); What we're returning is the directive object. You won't see anymore code in this tutorial so it's important you get things working right and refer back to what you've already done to advance from now on. Step 2. Advancing directives Your directive should be loaded up now, but it's not really doing much. Let's make it better. In your home controller. Make a variable on your $scope called user. Set it's value to { name: "Geoff McMammy", age: 43, email: "geofdude@gmail.com" } Now inside your directive's html specifically inside the <h3> tags display our new user's name. Then inside maybe some <h4> tags display his email and age. This is going to work exactly the same as if it was just inside your home controller. Reload the page and make sure it works. This is still very cosmetic and really not all that useful. It needs functionality. Add into your directive's object the link property. The link property's value is a function definition that takes (generally) three parameters. scope, element, and attributes. Unlike in other places with angular injection these parameter names don't carry meaning. The first parameter will always represent your $scope for that directive, the second will always be the element that wraps your whole directive, and the third will always be an object containing all the properties and values of the attributes on your directive in the dom. Try the following to get a feel for all three. Add two attributes to your directive in your html. Like this - <dir-display test="myTest" my-check="checkItOut"></dir-display> Now in the link property you've added console.log the three parameters in the function. You'll see an object for scope that should look identical to the $scope of your html function. For element you'll see an object the represents the DOM wrapper for your directive. For attributes you'll see an object that will look like this: { test: "myTest", myCheck: "checkItOut" } An important thing to notice is how it has again converted snake case to camel case for you. my-check became myCheck. Don't forget this. You'll run into this issue one day. It counts for both attributes and directive names. To feel some of what the link function could do let's try this. Add a ng-show to both the email and age wrappers. This should be familiar to you. Now inside your link function add a click event listener to your element property. It's going to look just like jQuery. element.on('click', function(){ }) Inside the click listener's callback add a toggle for the ng-show property you passed in. Along with a console.log to make sure things are connecting when you click. Try it out. Don't call for a mentor when it doesn't work. Let's talk about that first. You should see the console.log firing, but why isn't it toggling. This is going to be a common problem when working with the link function and event listeners. What we have here is an angular digest problem. The value is changing on the scope object, but the change isn't being reflected by our DOM. That's because angular isn't aware of the change yet. Anytime we cause an event to happen using something like jQuery or even angular's jQLite we need to let angular know that we've made a change. Add this line of code in place of your console.log, scope.$apply(). Now try it out. It should be working now, so if you're still having issues it's time to debug. What we've done is forced angular to run it's digest cycle. This is where angular checks the scope object for changes and then applies those to the DOM. This is another good lesson to learn for later. You'll most likely hit this when making changes to your element using event listeners. Step 3. Directive's re-usability. Now our directive has some extremely basic functionality. One of a directive's greatest advantages though is its ability to be placed anywhere and still be functional. Let's say instead we had a list of users instead of just one. Change the $scope property in your home controller to be users and give it this array as its value: [ { name: "Geoff McMammy", age: 43, email: "geofdude@gmail.com", city: "Provo" }, { name: "Frederick Deeder", age: 26, email: "fredeed@gmail.com", city: "Austin" }, { name: "Spencer Rentz", age: 35, email: "spencerrentz@gmail.com", city: "Sacramento" }, { name: "Geddup Ngo", age: 43, email: "geddupngo@gmail.com", city: "Orlando" }, { name: "Donst Opbie Leevin", age: 67, email: "gernee@gmail.com", city: "Phoenix" } ] Now in your home HTML add a ng-repeat to the directive call. Tell it to repeat for each user in users. Reload your page. It's working! But why? How does each directive instance know what information to display? In the link function console.log the scope parameter. Make sure it's outside of your click listener. You'll see five print outs in your console. Open up any one of them and look to the bottom. Open up the user property. It's exactly what we would want! But again why would that be the case? Don't get too caught up in this next bit if it's too hard to understand, but the ng-repeat is essentially making new tiny scope objects for each individual user in our users array. Now each of our directives is still getting a user property on the scope object just like the directive wanted in the beginning. Woot. Step 4. Ramp it up with Isolate Scope. Directives can do so much more. So let's make that happen. That means we should make.... a new directive!!! This directive's purpose will be to display a selected User and the weather in his/her/its location. Link it up just like the last one. Create a js file for our directive and name it dirWeather. Make an html file named dirWeather.html. Link it up in your index.html and add the template to your new directive object. In your directive's template give it an <h3> tag that says Weather just so we can know it's working. Above your ng-repeat on dirDisplay add your new dirWeather directive. If it's not working check the instructions above as to some common reasons why before asking a mentor for help. If you're seeing the Weather text on your page then we're ready to try out the dreaded Isolate Scope. The isolate scope object is one of the stranger API's in angular. I'm sorry but it is. Just refer to this for now. scope: { string: '@', link: '=', func: '&' } The properties on the scope object represent the attributes on the directive in the html. Our example scope object here would look something like this in the html. <example-directive string="a string" link="user" func="updateUser()"></example-directive> The hard part here is the @, =, and &. They each have very important and distinct meanings. @ says take in my attribute value as a string. = says take in my attribute value as a two-way bound variable from the parent scope. & says take in my attribute value as a reference to a function on the parent scope. It's also critical to point out that once you add a scope object you have no isolated your directive's scope. Meaning, aside from the values passed in through attributes, this directive has no connection to the $scope of its parent. That being said let's isolate our directive's scope. :worried: Add the scope property to your dirWeather. Give it the value of an object with a property of currentUser whose value is '='. Remember in your html this will look like current-user. This is the third time I've said so don't expect it again. This means that whatever comes into the currentUser attribute is going to be a value of the parent's scope object. For now test this out by passing in users[0]. Find a way to show that users information inside your dirWeather's html. Remember inside your directive now the user is represented by currentUser. Step 5. &? &!? The '=' value on your scope object has created a two-way binding between users[0] and currentUser. Now let's try out the '&'. On your home controller add a function called getWeather. It takes one parameter called city. This function will make a call to a service so we'll need to create that. Make a weather service. Name it something cool and creative like weatherService. Inside the weather service make a function called getWeather that also takes one parameter, city. Make an $http get to this url - 'http://api.openweathermap.org/data/2.5/weather?q=' After the q= add on the city parameter. If you want you can test this out in postman. See what kind of data you get back. If it's the weather of that city then... you win! Use $q to return a promise that only resolves with the data you want. Temperature (preferably not in Kelvin) and the weather description. Use console.log on the data coming from the $http request to get to what you want. You'll need to add both on an object that you resolve your new promise with. On your home controller have it return the result of invoking the get getWeather function on the service. You should be returning a promise. Now in your home route's HTML pass in the getWeather function to the dirWeather directive through an attribute called weather-call. Add the attribute to your isolate scope object. That was a lot of linking, but let's walk through it. Your controller has a function linked to the service, which is in turn linked to your directive. So if you run the weatherCall function in your directive it will go through your controller to your service and then back. Now things get a little bit tricky. Angular's way of passing along arguments through a directive to your controller are tricky, but once you understand how to do it, it's not hard. I'm going to give an example here of how it works. <my-directive pass-func="callFunc(data)"></my-directive> Here's how it would look in your HTML. But where's the data supposed to be coming from? It seems that you'd rather be able to pass in data from your directive. Well you still can, you just have to essentially tell angular what do use as an argument to replace data when it calls that function in your controller. The actualy function call inside the directive will look like this. $scope.passFunc({data: wantedData}) So what you'll do is pass in an object where the property name is what the argument is named in the HTML where you call the directive. That might sound confusing, but just look at the two code blocks above for a pattern. Note that pass-func becomes $scope.passFunc and data is being replaced with wantedData with the {data: wantedData} object. In our directive we want to replace city in the attribute call, for something else inside the directive. You'll follow the same pattern as above. For now let's get things set up for that function call. Add to the dirWeather directive object a property called controller. It's value will be a function. Yes, this is a controller specifically for your one directive. It works the same as any other controller, except you don't give it a name. It's $scope object will only be accessible within an instance of your directive. Don't forget to inject $scope in the function. Inside your controller function run the weatherCall function with the city property from the currentUser on your $scope. Here's where you need to make sure you've passed in a city argument in the attribute function call, and then replace that with your currentUser's city using an object with a city property. The function call should return a promise, so call .then afterward and add the data onto your $scope to display both the weather and temperature of the currentUser's city. The properties can be named whatever makes sense to you. You may also want to find a way to get rid of all the decimal places on your temperature. Now you should have everything hooked up so it shows Geoff's data and the weather data for Provo. But is that good enough? Step 6. Ramping up our ramp up. Now let's change this so it shows the weather data for whichever user we select. We're going to need to use '&' again. Make a function on the home controller that takes in a parameter and sets a property on the $scope to be that parameter. Maybe you see where this is going. We want to get this function into our dirDisplay controller. But in order to do that we need to isolate dirDisplay's scope. This also means we need to pass in each individual user through the scope object as well. To make it easier on ourselves, let's pass the current user from our ng-repeat into our directive through a user attribute. This way we can leave our two-way bindings as they are. Also pass our new function that sets our current user from our home controller into our directive through a setUser attribute. You'll need to add an argument in there again. Go with user. Your scope object in dirDisplay should have two properties. setUser with the value of '&' and user with the value of '='. As before we're going to need to do some tricky stuff to get our argument back to our controller. Call the setUser function inside our click event listener and pass in an object the sets our user argument to be the user on our directive's scope object. If you've forgotten this part go back up and take a look at how you did it before or the example in this README. Whatever user you click on now should show up in the dirWeather directive as the current user. But we're missing one thing, we want to be able to see the weather for that user too. We'll have to do one more thing that will seem a little bit tricky at first, but it's good to learn if you don't know it already since it's actually used quite frequently. We need to step up a change listener on our currentUser in the dirWeather directive. We'll use angular's $watch functionality. $watch is a method on your $scope that will watch for changes in a variable you give it. It works in two ways. $scope.$watch('property', function(value){ console.log("When $scope.property changes its new value is: ", value) }); And $scope.$watch(function(){ return myVar }, function(value){ console.log("When myVar changes its new value is: ", value); }); Remove the immediate function call that we have in there now. Maybe just comment it out for now because we'll use it in a bit. Now call the $watch method on your scope and have it watch currentUser. Either way of using $watch is fine. Have its callback run the $scope.weatherCall function just like you had it before. One thing to note is that $scope.$watch will always run once to begin with. Since that's what we want here it's great, but just be aware of that. If you've reached this point congratulate yourself. You've messed with some serious stuff today, namely directives. There are still a lot of things about directives that we can't possibly cover in a single project. If you like what we've done so far then you're in a good place to keep going. A developer who understands directives well can build a really clean looking code base. Just look at your home.html. It could have just two lines in it. If you're feeling good move on now to Step 7. Step 7. Finishing touches Try to work out these problems on your own. There should be a way to let the user know that the weather data is loading. Something that appears while our $http request is retrieving our data. The $http request shouldn't fire on both opening and closing a user's information. A color change for the currently active user would be nicer than showing that user's info inside the dirWeather modal. Or at least less redundant. Whatever else you want. We still haven't explored transclusion and ng-transclude so give that a try if you're feeling adventurous. Just know that it's a way for deciding where to put the HTML child elements of a directive. It's cool stuff that can involve some criss-crossing of scopes.
rbluethl
The Next.js reference implementation on how to design better APIs
Freemius
🚀 Next.js SaaS example that shows a real AI credit‑based product: anonymous chat until sign‑in, Better Auth for users, Prisma for data, Freemius for subscriptions, one‑off credit top‑ups, trials, entitlements, and a customer portal. Clone it, add your Freemius pricing IDs + API keys, run migrations, and start selling. Go Build 🚀
pankaj614
India GDP Analysis Problem Description - I NITI Aayog: Background NITI Aayog (National Institution for Transforming India) is a policy think tank of the Government of India; it provides strategic inputs to the central and the state governments to achieve various development goals. In the past, NITI Aayog has played an important role in initiatives such as Digital India, Atal Innovation Mission and various agricultural reforms and have designed various policies in education, skill development, water management, healthcare, etc. NITI Aayog was established to replace the Planning Commission of India, which used to follow a top-down model for policy making, i.e., it typically designed policies at the central level (such as the 5-year plans). On the other hand, NITI Aayog designs policies specific to the different states or segments of the economy. Finance Minister, Arun Jaitley, made the following observation on the necessity of creating NITI Aayog, "The 65-year-old Planning Commission had become a redundant organisation. It was relevant in a command economy structure, but not any longer. India is a diversified country and its states are in various phases of economic development along with their own strengths and weaknesses. In this context, a ‘one size fits all’ approach to economic planning is obsolete...". Project Brief We are working as the chief data scientist at NITI Aayog, reporting to the CEO. The CEO has initiated a project wherein the NITI Aayog will provide top-level recommendations to the Chief Ministers (CMs) of various states, which will help them prioritise areas of development for their respective states. Since different states are in different phases of development, the recommendations should be specific to the states. The overall goal of this project is to help the CMs focus on areas that will foster economic development for their respective states. Since the most common measure of economic development is the GDP, we will analyse the GDP of the various states of India and suggest ways to improve it. Understanding GDP Gross domestic product (GDP) at current prices is the GDP at the market value of goods and services produced in a country during a year. In other words, GDP measures the 'monetary value of final goods and services produced by a country/state in a given period of time'. GDP can be broadly divided into goods and services produced by three sectors: the primary sector (agriculture), the secondary sector (industry), and the tertiary sector (services). It is also known as nominal GDP. More technically, (real) GDP takes into account the price change that may have occurred due to inflation. This means that the real GDP is nominal GDP adjusted for inflation. We will use the nominal GDP for this exercise. Also, we will consider the financial year 2015-16 as the base year, as most of the data required for this exercise is available for the aforementioned period. Per Capita GDP and Income Total GDP divided by the population gives the per capita GDP, which roughly measures the average value of goods and services produced per person. The per capita income is closely related to the per capita GDP (though they are not the same). In general, the per capita income increases when the per capita GDP increases, and vice-versa. For instance, in the financial year 2015-16, the per capita income of India was ₹93,293, whereas the per capita GDP of India was $1717, which roughly amounts to ₹1,11,605. Problem Description - II Data The data is sourced from https://data.gov.in/, an Open Government Data (OGD) platform of India. The download instructions are provided in the next segment. The data for GDP analysis of the Indian states is divided into two parts: Data I-A: This dataset consists of the GSDP (Gross State Domestic Product) data for the states and union territories. Data I-B: This dataset contains the distribution of GSDP among three sectors: the primary sector (agriculture), the secondary sector (industry) and the tertiary sector (services) along with taxes and subsidies. There is separate dataset for each of the states. We are expected to read the dataset for the available states and join these (in Python) if needed. There are two parts to this project. In the first part, we will analyse and compare the GDPs of various Indian states (both total and per capita). The GDP of a state is referred to as the GSDP (Gross State Domestic Product). Then, we will divide the states into four categories based on the GDP per capita, and for each of these four categories, we will analyse the sectors that contribute the most to the GDP (such as agriculture, real estate, manufacturing, etc.). In the second part, we will analyse whether GDP per capita is related to dropout rates in schools and colleges. Part-I: GDP Analysis of the Indian States For each of the following steps of analysis, choose an appropriate type of plot for comparing the data. Also, ensure that the plots are in increasing or decreasing order for better comparison. For example, if we make a bar plot to compare the GDPs of the states, ensure that the bars are in either increasing or decreasing order of GDP. Part I-A: For the analysis below, use the Data I-A. First, we need to load the data in Python properly and then clean it. This also involves the treatment of missing values, we can choose to drop the row or column as well. Remember this will affect our next analysis and results drastically. Plot a graph for rows " % Growth over previous year" for all the states (not union territories) whose data is available, use as much data as possible for this exercise. Use the best fit line to represent the growth for each state. Draw a similar line graph for the nation as well. How will we compare the growth rates of any two states? Which states have been growing consistently fast, and which ones have been struggling? Rank top 3 fastest and 3 slowest-growing states. What is the Nation's growth rate? What has been the growth rate of my home state, and how does it compare to the national growth rate? Plot the total GDP of the states for the year 2015-16: Which Plot will we use for this? Why? (Remeber to plot the graph in a way such as it is easier to read and compare) Identify the top 5 and the bottom 5 states based on total GDP. What insights can we draw from this graph? What states are performing poorly? (Remember: this will not be solely based on total GDP) Part I-B: For the analysis below, use Data I-B. We can also use Data I-B along with Data I-A if required. Also, perform the analysis only for the duration 2014-15. Filter out the union territories (Delhi, Chandigarh, Andaman and Nicobar Islands, etc.) for further analysis, as they are governed directly by the central, not state governments. Plot the GDP per capita for all the states. Identify the top 5 and the bottom 5 states based on the GDP per capita. Find the ratio of the highest per capita GDP to the lowest per capita GDP. Plot the percentage contribution of the primary, secondary and tertiary sectors as a percentage of the total GDP for all the states. Which plot will we use here? Why? Why is (Primary + Secondary + Tertiary) not equal to total GDP? Can we draw any insight from this? Find correlation of percentile of the state (% of states with lower per capita GDP) and %contribution of Primary sector to total GDP. Categorise the states into four groups based on the GDP per capita (C1, C2, C3, C4, where C1 would have the highest per capita GDP and C4, the lowest). The quantile values are (0.20,0.5, 0.85, 1), i.e., the states lying between the 85th and the 100th percentile are in C1; those between the 50th and the 85th percentiles are in C2, and so on. Note: Categorisation into four groups will simplify the subsequent analysis, as otherwise, comparing the data of all the states would become quite exhaustive. For each category (C1, C2, C3, C4): Find the top 3/4/5 sub-sectors (such as agriculture, forestry and fishing, crops, manufacturing etc., not primary, secondary and tertiary) that contribute to approximately 80% of the GSDP of each category. Note-I: The nomenclature for this project is as follows: primary, secondary and tertiary are named 'sectors', while agriculture, manufacturing etc. are named 'sub-sectors'. Note-II: If the top 3 sub-sectors contribute to, say, 79% of the GDP of some category, we can report "These top 3 sub-sectors contribute to approximately 80% of the GDP". This is to simplify the analysis and make the results consumable. (Remember, the CEO has to present the report to the CMs, and CMs have limited time; so, the analysis needs to be sharp and concise.) Plot the contribution of the sub-sectors as a percentage of the GSDP of each category. Now that we have summarised the data in the form of plots, tables, etc., try to draw non-obvious insights from it. Think about questions such as: How does the GDP distribution of the top states (C1) differ from the others? Which sub-sectors seem to be correlated with high GDP? Which sub-sectors do the various categories need to focus on? Ask other such relevant questions, which we think are important, and note we insights for category separately. More insights are welcome and will be awarded accordingly. Finally, provide at least two recommendations for each category to improve the per capita GDP. Part-II: GDP and Education Dropout Rates In Part-I, we would have noticed that (one) way to increase per capita GDP is by shifting the distribution of GDP towards the secondary and tertiary sectors, i.e., the manufacturing and services industries. But these industries can thrive only when there is an availability of educated and skilled labour. In this part of the analysis, we will investigate whether there is any relationship between per capita GDP with dropout rates in education. Data Data II: This section will require the dropout rate dataset apart from the dataset that we used in Part-1 of the case study. Download instructions are provided in the next segment. Part-II: GDP and Education Analyse if there is any correlation of GDP per capita with dropout rates in education (primary, upper primary and secondary) for the year 2014-2015 for each state. Choose an appropriate plot to conduct this analysis. Is there any correlation between dropout rate and %contribution of each sector (Primary, Secondary and Tertiary) to the total GDP? We have the total population of each state from the data in part I. Is there any correlation between dropout rates and population? What is the expected trend and what is the observation? Write down the key insights we draw from this data: Form at least one reasonable hypothesis for the observations from the data About GDP analysis for India in the year for 2015-16 and recommendation for the individual states for increasing the GDP by focusing on various factor. Topics python statistical-analysis data-analysis gdp-analysis Resources Readme Stars 0 stars Watchers 1 watching Forks 0 forks Releases No releases published Packages No packages published Languages Jupyter Notebook 100.0% Footer © 2022 GitHub, Inc. Footer navigation Terms Privacy Security Status Docs Contact GitHub Pricing API Training Blog About
Kwamb0
Part I - WeatherPy In this example, you’ll be creating a Python script to visualize the weather of 500+ cities across the world of varying distance from the equator. To accomplish this, you’ll be utilizing a simple Python library, the OpenWeatherMap API, and a little common sense to create a representative model of weather across world cities. Your first objective is to build a series of scatter plots to showcase the following relationships: Temperature (F) vs. Latitude Humidity (%) vs. Latitude Cloudiness (%) vs. Latitude Wind Speed (mph) vs. Latitude After each plot add a sentence or too explaining what the code is and analyzing. Your next objective is to run linear regression on each relationship, only this time separating them into Northern Hemisphere (greater than or equal to 0 degrees latitude) and Southern Hemisphere (less than 0 degrees latitude): Northern Hemisphere - Temperature (F) vs. Latitude Southern Hemisphere - Temperature (F) vs. Latitude Northern Hemisphere - Humidity (%) vs. Latitude Southern Hemisphere - Humidity (%) vs. Latitude Northern Hemisphere - Cloudiness (%) vs. Latitude Southern Hemisphere - Cloudiness (%) vs. Latitude Northern Hemisphere - Wind Speed (mph) vs. Latitude Southern Hemisphere - Wind Speed (mph) vs. Latitude After each pair of plots explain what the linear regression is modelling such as any relationships you notice and any other analysis you may have. Your final notebook must: Randomly select at least 500 unique (non-repeat) cities based on latitude and longitude. Perform a weather check on each of the cities using a series of successive API calls. Include a print log of each city as it’s being processed with the city number and city name. Save a CSV of all retrieved data and a PNG image for each scatter plot. Part II - VacationPy Now let’s use your skills in working with weather data to plan future vacations. Use jupyter-gmaps and the Google Places API for this part of the assignment. Note: if you having trouble displaying the maps try running jupyter nbextension enable --py gmaps in your environment and retry. Create a heat map that displays the humidity for every city from the part I of the homework. heatmap Narrow down the DataFrame to find your ideal weather condition. For example: A max temperature lower than 80 degrees but higher than 70. Wind speed less than 10 mph. Zero cloudiness. Drop any rows that don’t contain all three conditions. You want to be sure the weather is ideal. Note: Feel free to adjust to your specifications but be sure to limit the number of rows returned by your API requests to a reasonable number. Using Google Places API to find the first hotel for each city located within 5000 meters of your coordinates. Plot the hotels on top of the humidity heatmap with each pin containing the Hotel Name, City, and Country. hotel map As final considerations: Create a new GitHub repository for this project called API-Challenge (note the kebab-case). Do not add to an existing repo You must complete your analysis using a Jupyter notebook. You must use the Matplotlib or Pandas plotting libraries. For Part I, you must include a written description of three observable trends based on the data. You must use proper labeling of your plots, including aspects like: Plot Titles (with date of analysis) and Axes Labels. For max intensity in the heat map, try setting it to the highest humidity found in the data set. Hints and Considerations The city data you generate is based on random coordinates as well as different query times; as such, your outputs will not be an exact match to the provided starter notebook. You may want to start this assignment by refreshing yourself on the geographic coordinate system. Next, spend the requisite time necessary to study the OpenWeatherMap API. Based on your initial study, you should be able to answer basic questions about the API: Where do you request the API key? Which Weather API in particular will you need? What URL endpoints does it expect? What JSON structure does it respond with? Before you write a line of code, you should be aiming to have a crystal clear understanding of your intended outcome. A starter code for Citipy has been provided. However, if you’re craving an extra challenge, push yourself to learn how it works: citipy Python library. Before you try to incorporate the library into your analysis, start by creating simple test cases outside your main script to confirm that you are using it correctly. Too often, when introduced to a new library, students get bogged down by the most minor of errors – spending hours investigating their entire code – when, in fact, a simple and focused test would have shown their basic utilization of the library was wrong from the start. Don’t let this be you! Part of our expectation in this challenge is that you will use critical thinking skills to understand how and why we’re recommending the tools we are. What is Citipy for? Why would you use it in conjunction with the OpenWeatherMap API? How would you do so? In building your script, pay attention to the cities you are using in your query pool. Are you getting coverage of the full gamut of latitudes and longitudes? Or are you simply choosing 500 cities concentrated in one region of the world? Even if you were a geographic genius, simply rattling 500 cities based on your human selection would create a biased dataset. Be thinking of how you should counter this. (Hint: Consider the full range of latitudes). Once you have computed the linear regression for one chart, the process will be similar for all others. As a bonus, try to create a function that will create these charts based on different parameters. Remember that each coordinate will trigger a separate call to the Google API. If you’re creating your own criteria to plan your vacation, try to reduce the results in your DataFrame to 10 or fewer cities. Lastly, remember – this is a challenging activity. Push yourself! If you complete this task, then you can safely say that you’ve gained a strong mastery of the core foundations of data analytics and it will only go better from here. Good luck!
abin-karukappallil
A type-safe full-stack Next.js boilerplate with oRPC for API calls, TanStack Query for server state management, Better Auth for authentication, and Drizzle ORM for database access..
raghuvinayak
1. Create a datastructure that defines a seating layout for a hall in a venue: different sections (main hall, 1st balcony, 2nd balcony) different ranks defined across sections (1st rank, 2nd rank 3rd rank) so the 1st rank could be on both the main hall and 1st balcony - they're not restricted by section rows of seats, numbered by row, seat. Seats can be differently numbered: sometimes 1 .. 6, sometimes 1,3,5,6,4,2 bonus: Support additional properties on seats: aisle seat frontrow seat high seat (e.g. on balcony) 2. Create an algorithm that given a list of "groups of users" per rank (basically sizes, e.g. (1, 3, 4, 4, 5, 1, 2, 4) in a specific order, tries to place the users in their seats, e.g. 1 2 2 2 3 3 3 3 5 5 5 5 4 4 4 4 5 6 7 7 8 8 8 8 So the group of size 1 at index 1 gets the frontmost left seat. Then the group at index 2 of 3 people next to it, until the row fills and wraps to the next row and fills in the other direction. You can assume that sum(groups_of_users_for_rank) <= seats_in_that_rank Bonus: take preferences into account based on seat properties. E.g. ("aisle", 2) would mean a group of 2 where one of the members whishes to be near the aisle Bonus: Allow seats to be blocked (e.g. for technical purposes). This means a group should not be split across such a block 3. Improve the algorithm in such a way that no individual people sit alone. In the above example this happened with the group at index 5 where a single individual sits on the 3rd row (eventhough the rest of the group is in front of him) 1 2 2 2 3 3 3 3 8 8 8 8 4 4 4 4 5 5 5 5 5 6 7 7 would be a better solution. Try to preserve the order as much as possible because the lowest numbers should get the "best" (frontmost) seats 4. Create a django model to store the seating layout (generically) and the seating allocation. The allocation should be separate (think of different shows in the same theater) 5. Design / Create a REST API to retrieve the layout the allocations. Authentication / security is not a requirement (everything public) 6. Create a simple consumer of this API that renders the allocations to a visually understandable HTML layout
บ้านรับมันเอกสารขยาย สฟิงซ์ ดัชนีโมดูล |ต่อไป |ก่อนหน้า |บ้านสฟิงซ์ |เอกสารประกอบ »การใช้สฟิงซ์ »ช่างก่อสร้าง สารบัญ ช่างก่อสร้าง รายละเอียดตัวสร้างอนุกรม หัวข้อก่อนหน้า การกำหนดค่า หัวข้อถัดไป ส่วนขยาย หน้านี้ แสดงที่มา ค้นหาอย่างรวดเร็ว ช่างก่อสร้าง เหล่านี้เป็นผู้สร้างสฟิงซ์ในตัว สร้างเพิ่มเติมสามารถดูได้ที่เพิ่มขึ้นโดย ส่วนขยาย ต้องกำหนด "ชื่อ" ของตัวสร้างให้กับตัวเลือกบรรทัดคำสั่ง-bของ sphinx-buildเพื่อเลือกตัวสร้าง คลาส sphinx.builders.html สแตนด์อโลนHTMLBuilder[แหล่งที่มา] นี่คือตัวสร้าง HTML มาตรฐาน ผลลัพธ์ของมันคือไดเร็กทอรีที่มีไฟล์ HTML พร้อมด้วยสไตล์ชีตและแหล่งที่เป็นทางเลือก มีค่าการกำหนดค่าค่อนข้างน้อยที่ปรับแต่งเอาต์พุตของตัวสร้างนี้ โปรดดูรายละเอียดในบทตัวเลือกสำหรับเอาต์พุต HTML ชื่อ= 'html' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ คลาส sphinx.builders.dirhtml DirectoryHTMLBuilder[แหล่งที่มา] นี่คือคลาสย่อยของตัวสร้าง HTML มาตรฐาน ผลลัพธ์ของมันคือไดเร็กทอรีที่มีไฟล์ HTML ซึ่งแต่ละไฟล์จะถูกเรียกindex.htmlและวางในไดเร็กทอรีย่อยที่มีชื่อเหมือนกับชื่อเพจ ตัวอย่างเช่น เอกสาร markup/rest.rstจะไม่ส่งผลให้เกิดไฟล์เอาต์พุตmarkup/rest.htmlแต่markup/rest/index.html. เมื่อสร้างลิงก์ระหว่างหน้า index.htmlจะถูกละเว้น เพื่อให้ URL มีลักษณะmarkup/rest/ดังนี้ ชื่อ= 'dirhtml' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ ใหม่ในเวอร์ชัน 0.6 คลาส sphinx.builders.singlehtml SingleFileHTMLBuilder[แหล่งที่มา] นี่คือตัวสร้าง HTML ที่รวมโปรเจ็กต์ทั้งหมดไว้ในไฟล์เอาต์พุตเดียว (เห็นได้ชัดว่าใช้งานได้กับโปรเจ็กต์ขนาดเล็กเท่านั้น) ไฟล์มีชื่อเหมือนกับเอกสารรูท จะไม่มีการสร้างดัชนี ชื่อ= 'singlehtml' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ ใหม่ในเวอร์ชัน 1.0. class sphinxcontrib.htmlช่วยเหลือ HTMLHelpBuilder[แหล่งที่มา] ตัวสร้างนี้สร้างเอาต์พุตเดียวกันกับตัวสร้าง HTML แบบสแตนด์อโลน แต่ยังสร้างไฟล์สนับสนุนวิธีใช้ HTML ที่อนุญาตให้ Microsoft HTML Help Workshop คอมไพล์เป็นไฟล์ CHM ชื่อ= 'htmlhelp' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ คลาส sphinxcontrib.qthelp QtHelpBuilder[แหล่งที่มา] ตัวสร้างนี้สร้างเอาต์พุตเดียวกันกับตัวสร้าง HTML แบบสแตนด์อโลน แต่ยังสร้างไฟล์สนับสนุนคอลเล็กชันความช่วยเหลือ Qtที่อนุญาตให้ตัวสร้างคอลเล็กชัน Qt คอมไพล์ได้ เปลี่ยนแปลงในเวอร์ชัน 2.0:ย้ายไปยัง sphinxcontrib.qthelp จากแพ็คเกจ sphinx.builders ชื่อ= 'qthelp' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ คลาส sphinxcontrib.applehelp AppleHelpBuilder[แหล่งที่มา] ตัวสร้างนี้สร้าง Apple Help Book ตามผลลัพธ์เดียวกันกับตัวสร้าง HTML แบบสแตนด์อโลน หากไดเร็กทอรีต้นทางมี.lprojโฟลเดอร์ใด ๆโฟลเดอร์ที่สอดคล้องกับภาษาที่เลือกจะมีเนื้อหาที่ผสานเข้ากับเอาต์พุตที่สร้างขึ้น โฟลเดอร์เหล่านี้จะถูกละเว้นโดยเอกสารประเภทอื่นๆ ทั้งหมด ในการสร้างหนังสือช่วยเหลือที่ถูกต้อง ตัวสร้างนี้ต้องใช้เครื่องมือบรรทัดคำสั่งhiutilซึ่งมีให้ใช้งานบน Mac OS X 10.6 ขึ้นไปเท่านั้น คุณสามารถปิดใช้งานขั้นตอนการทำดัชนีโดยตั้งค่า applehelp_disable_external_toolsเป็นTrueซึ่งในกรณีนี้ผลลัพธ์จะไม่ถูกต้องจนกว่าจะมีการเรียกใช้hiutilบน .lprojโฟลเดอร์ทั้งหมดภายในบันเดิล ชื่อ= 'applehelp' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/png', 'image/gif', 'image/jpeg', 'image/tiff', 'image/jp2', 'image/svg+xml'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ ใหม่ในเวอร์ชัน 1.3 เปลี่ยนในเวอร์ชัน 2.0:ย้ายไป sphinxcontrib.applehelp จากแพ็คเกจ sphinx.builders คลาส sphinxcontrib.devhelp DevhelpBuilder[แหล่งที่มา] ตัวสร้างนี้สร้างเอาต์พุตเดียวกันกับตัวสร้าง HTML แบบสแตนด์อโลน แต่ยังสร้าง ไฟล์สนับสนุนGNOME Devhelpที่อนุญาตให้ผู้อ่าน GNOME Devhelp สามารถดูไฟล์เหล่านี้ได้ ชื่อ= 'ผู้พัฒนา' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ เปลี่ยนเป็นเวอร์ชัน 2.0:ย้ายไป sphinxcontrib.devhelp จากแพ็คเกจ sphinx.builders คลาส sphinx.builders.epub3 Epub3Builder[แหล่งที่มา] ตัวสร้างนี้สร้างเอาต์พุตเดียวกันกับตัวสร้าง HTML แบบสแตนด์อโลน แต่ยังสร้างไฟล์epubสำหรับโปรแกรมอ่าน ebook ด้วย ดูข้อมูล Epubสำหรับรายละเอียดเกี่ยวกับเรื่องนี้ สำหรับความหมายของรูปแบบ ePub ที่มีลักษณะที่ http://idpf.org/epubหรือhttps://en.wikipedia.org/wiki/EPUB ตัวสร้างสร้างไฟล์EPUB 3 ชื่อ= 'epub' ชื่อของตัวสร้าง สำหรับตัวเลือกบรรทัดคำสั่ง -b รูปแบบ= 'html' รูปแบบเอาต์พุตของตัวสร้าง หรือ '' หากไม่มีการสร้างเอกสารออก support_image_types :รายการ[ str ] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] รายการรูปแบบรูปภาพประเภท MIME ที่ตัวสร้างรองรับ ไฟล์รูปภาพจะถูกค้นหาตามลำดับที่ปรากฏที่นี่ ใหม่ในเวอร์ชัน 1.4 เปลี่ยนแปลงในเวอร์ชัน 1.5:ตั้งแต่ Sphinx-1.5 ตัวสร้าง epub3 จะถูกใช้สำหรับตัวสร้างเริ่มต้นของ epub คลาส sphinx.builders.latex LaTeXBuilder[แหล่งที่มา] ตัวสร้างนี้สร้างไฟล์ LaTeX จำนวนมากในไดเร็กทอรีเอาต์พุต คุณต้องระบุเอกสารที่จะรวมไว้ในไฟล์ LaTeX ผ่านlatex_documentsค่าการกำหนดค่า มีค่าการกำหนดค่าสองสามค่าที่ปรับแต่งเอาต์พุตของตัวสร้างนี้ โปรดดูรายละเอียดในบทตัวเลือกสำหรับเอาต์พุต LaTeX ไฟล์ LaTeX ที่ผลิตขึ้นใช้แพ็คเกจ LaTeX หลายแพ็คเกจที่อาจไม่มีอยู่ในการติดตั้งการแจกจ่าย TeX "ขั้นต่ำ" บน Ubuntu xenial จำเป็นต้องติดตั้งแพ็คเกจต่อไปนี้เพื่อให้สร้าง PDF สำเร็จ: texlive-latex-recommended texlive-fonts-recommended tex-gyre(ถ้าlatex_engineเป็น'pdflatex') texlive-latex-extra latexmk(นี่เป็นข้อกำหนดของสฟิงซ์บน GNU/Linux และ MacOS X สำหรับการทำงานของ)make latexpdf ในบางกรณีจำเป็นต้องมีแพ็คเกจเพิ่มเติม (ดูข้อมูลเพิ่มเติมในการสนทนาของ'fontpkg'คีย์latex_elements): texlive-lang-cyrillicสำหรับ Cyrillic (แม้แต่ตัวอักษรแต่ละตัว) และ cm-superหรือcm-super-minimal(หากเป็นแบบอักษรเริ่มต้น) texlive-lang-greekสำหรับภาษากรีก (แม้แต่ตัวอักษรแต่ละตัว) และ cm-superหรือcm-super-minimal(หากเป็นแบบอักษรเริ่มต้น) texlive-xetexถ้าlatex_engineเป็น'xelatex', texlive-luatexถ้าlatex_engineเป็น'lualatex', fonts-freefont-otfถ้าlatex_engineเป็น'xelatex' หรือ'lualatex'. การทดสอบ Sphinx LaTeX นั้นดำเนินการบน Ubuntu xenial ซึ่งการแจกจ่าย TeX นั้นใช้สแนปชอต TeXLive 2015 ที่ลงวันที่ในเดือนมีนาคม 2016 เปลี่ยนเป็นเวอร์ชัน 1.6:ก่อนหน้านี้ มีการทดสอบบน Ubuntu อย่างแม่นยำ (TeXLive 2009) เปลี่ยนเป็นเวอร์ชัน 2.0:ก่อนหน้านี้ มีการทดสอบบน Ubuntu trusty (TeXLive 2013) เปลี่ยนแปลงในเวอร์ชัน 4.0.0: การพึ่งพาฟอนต์ TeX Gyre สำหรับการกำหนดค่าฟอนต์ LaTeX เริ่มต้น บันทึก Since 1.6, make latexpdf uses latexmk (not on Windows). This makes sure the needed number of runs is automatically executed to get the cross-references, bookmarks, indices, and tables of contents right. One can pass to latexmk options via the LATEXMKOPTS Makefile variable. For example: make latexpdf LATEXMKOPTS="-silent" reduces console output to a minimum. Also, if latexmk is at version 4.52b or higher (January 2017) LATEXMKOPTS="-xelatex" speeds up PDF builds via XeLateX in case of numerous graphics inclusions. To pass options directly to the (pdf|xe|lua)latex binary, use variable LATEXOPTS, for example: make latexpdf LATEXOPTS="--halt-on-error" name = 'latex' The builder’s name, for the -b command line option. format = 'latex' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = ['application/pdf', 'image/png', 'image/jpeg'] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. Note that a direct PDF builder is being provided by rinohtype. The builder’s name is rinoh. Refer to the rinohtype manual for details. class sphinx.builders.text.TextBuilder[source] This builder produces a text file for each reST file – this is almost the same as the reST source, but with much of the markup stripped for better readability. name = 'text' The builder’s name, for the -b command line option. format = 'text' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 0.4. class sphinx.builders.manpage.ManualPageBuilder[source] This builder produces manual pages in the groff format. You have to specify which documents are to be included in which manual pages via the man_pages configuration value. name = 'man' The builder’s name, for the -b command line option. format = 'man' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.0. class sphinx.builders.texinfo.TexinfoBuilder[source] This builder produces Texinfo files that can be processed into Info files by the makeinfo program. You have to specify which documents are to be included in which Texinfo files via the texinfo_documents configuration value. The Info format is the basis of the on-line help system used by GNU Emacs and the terminal-based program info. See Texinfo info for more details. The Texinfo format is the official documentation system used by the GNU project. More information on Texinfo can be found at https://www.gnu.org/software/texinfo/. name = 'texinfo' The builder’s name, for the -b command line option. format = 'texinfo' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = ['image/png', 'image/jpeg', 'image/gif'] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.1. class sphinxcontrib.serializinghtml.SerializingHTMLBuilder[source] This builder uses a module that implements the Python serialization API (pickle, simplejson, phpserialize, and others) to dump the generated HTML documentation. The pickle builder is a subclass of it. A concrete subclass of this builder serializing to the PHP serialization format could look like this: import phpserialize class PHPSerializedBuilder(SerializingHTMLBuilder): name = 'phpserialized' implementation = phpserialize out_suffix = '.file.phpdump' globalcontext_filename = 'globalcontext.phpdump' searchindex_filename = 'searchindex.phpdump' implementation A module that implements dump(), load(), dumps() and loads() functions that conform to the functions with the same names from the pickle module. Known modules implementing this interface are simplejson, phpserialize, plistlib, and others. out_suffix The suffix for all regular files. globalcontext_filename The filename for the file that contains the “global context”. This is a dict with some general configuration values such as the name of the project. searchindex_filename The filename for the search index Sphinx generates. See Serialization builder details for details about the output format. New in version 0.5. class sphinxcontrib.serializinghtml.PickleHTMLBuilder[source] This builder produces a directory with pickle files containing mostly HTML fragments and TOC information, for use of a web application (or custom postprocessing tool) that doesn’t use the standard HTML templates. See Serialization builder details for details about the output format. name = 'pickle' The builder’s name, for the -b command line option. The old name web still works as well. format = 'html' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. The file suffix is .fpickle. The global context is called globalcontext.pickle, the search index searchindex.pickle. class sphinxcontrib.serializinghtml.JSONHTMLBuilder[source] This builder produces a directory with JSON files containing mostly HTML fragments and TOC information, for use of a web application (or custom postprocessing tool) that doesn’t use the standard HTML templates. See Serialization builder details for details about the output format. name = 'json' The builder’s name, for the -b command line option. format = 'html' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = ['image/svg+xml', 'image/png', 'image/gif', 'image/jpeg'] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. The file suffix is .fjson. The global context is called globalcontext.json, the search index searchindex.json. New in version 0.5. class sphinx.builders.gettext.MessageCatalogBuilder[source] This builder produces gettext-style message catalogs. Each top-level file or subdirectory grows a single .pot catalog template. See the documentation on Internationalization for further reference. name = 'gettext' The builder’s name, for the -b command line option. format = '' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.1. class sphinx.builders.changes.ChangesBuilder[source] This builder produces an HTML overview of all versionadded, versionchanged and deprecated directives for the current version. This is useful to generate a ChangeLog file, for example. name = 'changes' The builder’s name, for the -b command line option. format = '' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. class sphinx.builders.dummy.DummyBuilder[source] This builder produces no output. The input is only parsed and checked for consistency. This is useful for linting purposes. name = 'dummy' The builder’s name, for the -b command line option. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.4. class sphinx.builders.linkcheck.CheckExternalLinksBuilder[source] This builder scans all documents for external links, tries to open them with requests, and writes an overview which ones are broken and redirected to standard output and to output.txt in the output directory. name = 'linkcheck' The builder’s name, for the -b command line option. format = '' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. Changed in version 1.5: Since Sphinx-1.5, the linkcheck builder comes to use requests module. Changed in version 3.4: The linkcheck builder retries links when servers apply rate limits. class sphinx.builders.xml.XMLBuilder[source] This builder produces Docutils-native XML files. The output can be transformed with standard XML tools such as XSLT processors into arbitrary final forms. name = 'xml' The builder’s name, for the -b command line option. format = 'xml' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.2. class sphinx.builders.xml.PseudoXMLBuilder[source] This builder is used for debugging the Sphinx/Docutils “Reader to Transform to Writer” pipeline. It produces compact pretty-printed “pseudo-XML”, files where nesting is indicated by indentation (no end-tags). External attributes for all elements are output, and internal attributes for any leftover “pending” elements are also given. name = 'pseudoxml' The builder’s name, for the -b command line option. format = 'pseudoxml' The builder’s output format, or ‘’ if no document output is produced. supported_image_types: List[str] = [] The list of MIME types of image formats supported by the builder. Image files are searched in the order in which they appear here. New in version 1.2. Built-in Sphinx extensions that offer more builders are: doctest coverage Serialization builder details All serialization builders outputs one file per source file and a few special files. They also copy the reST source files in the directory _sources under the output directory. The PickleHTMLBuilder is a builtin subclass that implements the pickle serialization interface. The files per source file have the extensions of out_suffix, and are arranged in directories just as the source files are. They unserialize to a dictionary (or dictionary like structure) with these keys: body The HTML “body” (that is, the HTML rendering of the source file), as rendered by the HTML translator. title The title of the document, as HTML (may contain markup). toc The table of contents for the file, rendered as an HTML <ul>. display_toc A boolean that is True if the toc contains more than one entry. current_page_name The document name of the current file. parents, prev and next Information about related chapters in the TOC tree. Each relation is a dictionary with the keys link (HREF for the relation) and title (title of the related document, as HTML). parents is a list of relations, while prev and next are a single relation. sourcename The name of the source file under _sources. The special files are located in the root output directory. They are: SerializingHTMLBuilder.globalcontext_filename A pickled dict with these keys: project, copyright, release, version The same values as given in the configuration file. style html_style. last_updated Date of last build. builder Name of the used builder, in the case of pickles this is always 'pickle'. titles A dictionary of all documents’ titles, as HTML strings. SerializingHTMLBuilder.searchindex_filename An index that can be used for searching the documentation. It is a pickled list with these entries: A list of indexed docnames. รายการชื่อเอกสาร เป็นสตริง HTML ในลำดับเดียวกับรายการแรก รากคำที่แมปดิกต์ (ประมวลผลโดยสเต็มเมอร์ภาษาอังกฤษ) กับรายการจำนวนเต็ม ซึ่งเป็นดัชนีในรายการแรก environment.pickle สภาพแวดล้อมในการสร้าง นี่เป็นไฟล์ pickle เสมอ โดยไม่ขึ้นกับตัวสร้างและสำเนาของสภาพแวดล้อมที่ใช้เมื่อตัวสร้างเริ่มทำงาน ทำ เอกสารสมาชิกทั่วไป ไม่เหมือนกับไฟล์ pickle อื่น ๆ ไฟล์ pickle นี้ต้องการให้sphinx แพ็คเกจพร้อมใช้งานในการแกะ ดัชนีโมดูล |ต่อไป |ก่อนหน้า |บ้านสฟิงซ์ |เอกสารประกอบ »การใช้สฟิงซ์ »ช่างก่อสร้าง © ลิขสิทธิ์ 2007-2021 Georg Brandl และทีม Sphinx สร้างโดยใช้Sphinx 5.0.0+ วี: มาสเตอร์
ilsaiman01
<div id="ixuj" class="gpd-navbar"> <div id="ic5a7" class="gpd-container"> <div id="iu8dq" class="gdp-row"> <div id="i0yff" class="cell"> <a id="ilani" class="gpd-link-box"><img id="ivm7f" src="https://cdn.grapedrop.com/u9ea0154168a24ce5be62672fcb3e0565/8bd59456d75a4a19950149dfa588ed5d_grapedrop-logo-black.svg"/></a> </div> <div id="i6ls5" class="cell gpd-navbar__menu"> <a id="i3vv9" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"> </path> </svg></a> </div> <div id="izu4n" class="cell gpd-navbar__items"> <div id="it3na" class="gdp-row gpd-navbar__items-grid"> <div class="cell gpd-navbar__item nav-item"> <a href="#i2n5f" id="i37zj" class="gpd-navbar__item-link">Services</a> </div> <div class="cell gpd-navbar__item nav-item"> <a href="#ictivk" id="idpml" class="gpd-navbar__item-link">Why us</a> </div> <div class="cell gpd-navbar__item nav-item"> <a href="#i7zvem" id="ie61z" class="gpd-navbar__item-link">Testimonials</a> </div> </div> </div> <div id="ihndr" class="cell"> <a href="#ih8q3w" id="ip59k" class="gpd-link cta-button">Get started now</a> </div> </div> </div> </div> <section id="iftl" class="gpd-section"> <div id="ij2xp" class="gpd-container"> <div id="c623" class="gdp-row"> <div id="i0pi" class="cell"> <h1 id="idy8g" class="text-head">MA AL-HIKMAH </h1> <div id="iv2c" class="gpd-text text-parag">Selamat datang di Madrasah Aliyah AL - Hikmah <br> <br> </div> <a href="#ih8q3w" id="i8hm3" class="gpd-link cta-button">Klik Mulai</a> <a data-type="video" data-zoomable="true" id="isldr" href="https://player.vimeo.com/video/354645621?title=0&portrait=0&byline=0&autoplay=1" class="gpd-lightbox"><div id="iyrs8" class="gdp-row"> <div id="iltam" class="cell"> <span id="i3szg" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-18C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 14.5l6-4.5-6-4.5v9z"> </path> </svg></span> </div> <div id="iahl5" class="cell"> <div id="ios8f" class="gpd-text">Watch this video </div> </div> </div></a> </div> </div> </div> </section> <section id="iu7fcy" class="gpd-section"> <div id="iqbyo2" class="gpd-container"> <div id="iuow3s" class="gdp-row"> <div id="in2k7r" class="cell"> <span id="ilzb8g" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-18C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 14.5l6-4.5-6-4.5v9z"> </path> </svg></span> </div> <div id="i262zg" class="cell"> <div id="inmukn" class="gpd-text">Want to know more about our work? </div> </div> <div id="i1s1h8" class="cell"> <a data-type="video" data-zoomable="true" href="https://player.vimeo.com/video/354645621?title=0&portrait=0&byline=0&autoplay=1" id="imj2u2" class="gpd-lightbox"><div id="ioqkkj" class="gpd-text">Watch our video </div></a> </div> </div> </div> </section> <section id="imcyx" class="gpd-section"> <div id="i0mpa" class="gpd-container"> <div id="igkax" class="gdp-row"> <div id="inted" data-anim-type="fadeInLeft" class="cell"> <h3 id="imy9sh" class="text-head-lg">Why we are the best </h3> <div id="ijgfwn" class="gpd-text text-parag">The best page builder for your next project. Great for lead generation, selling products, portfolios, events, and more. </div> <a href="" id="im0qy" class="gpd-link cta-button">Learn more about us</a> </div> <div id="i0bbk" data-anim-type="fadeInUp" class="cell"> <img id="i1yuol" src="https://images.unsplash.com/photo-1521737711867-e3b97375f902?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxMjcwNXwwfDF8c2VhcmNofDEyfHx3b3JrfGVufDB8fHw&ixlib=rb-1.2.1&q=80&w=1080" loading="lazy"/> </div> <div id="iqzuk" data-anim-type="fadeInRight" class="cell"> <div id="itkix2" class="text-head-lg">11 </div> <div id="i81kgp" class="gpd-text text-parag">Satisfaction rate from our customers. </div> <div id="irmm9f" class="text-head-lg">0.1 </div> <div id="iiaeuu" class="gpd-text text-parag">Average customer ratings out of 5.00! </div> <div id="itpj9o" class="text-head-lg">1 </div> <div id="il50fj" class="gpd-text text-parag">Customers visits every month. </div> </div> </div> </div> </section> <section id="i2n5f" class="gpd-section"> <div id="ixr4e" class="gpd-container"> <h1 id="ik6a8" class="text-head-xl">Our services </h1> <div id="ibw3v" class="gpd-text text-parag">The best page builder for your next project. Great for lead generation, selling products, portfolios, and more. </div> <div id="i4421u" class="gdp-row"> <div id="ijtpz1" data-anim-type="fadeInUp" class="cell card-service"> <h2 id="ie2wrw" class="card-service-title">SEO Tools </h2> <div id="ivlox9" class="gpd-image-block card-service-img"> </div> <div id="i9jemq" class="gpd-text text-content">Great for lead generation, selling products, portfolios, events, and more. </div> </div> <div id="i88nt7" data-anim-type="fadeInUp" class="cell card-service"> <h2 id="ipv09j" class="card-service-title">Google Fonts </h2> <div id="i29tmt" class="gpd-image-block card-service-img"> </div> <div id="iry9ac" class="gpd-text text-content">Great for lead generation, selling products, portfolios, events, and more. </div> </div> <div id="i1oasu" data-anim-type="fadeInUp" class="cell card-service"> <h2 id="ikvinv" class="card-service-title">Custom Code </h2> <div id="iaj8l1" class="gpd-image-block card-service-img"> </div> <div id="ifp7v6" class="gpd-text text-content">Great for lead generation, selling products, portfolios, events, and more. </div> </div> </div> </div> </section> <section id="izttj" class="gpd-section"> <div id="iwqlf" class="gpd-container"> <div id="ieedo" class="gdp-row"> <div id="i4ub9" class="cell"> <img id="i06tg" src="https://images.unsplash.com/photo-1533227268428-f9ed0900fb3b?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MXwxMjcwNXwwfDF8c2VhcmNofDI1fHxidXNpbmVzc3xlbnwwfHx8&ixlib=rb-1.2.1&q=80&w=1080" loading="lazy" data-anim-type="fadeInLeft"/> </div> <div id="i2ngh" class="cell"> <h1 id="if3jc" data-anim-type="fadeInRight" class="text-head-xl">We are ready to help you grow faster. </h1> <div id="isx0u" data-anim-type="fadeInRight" class="gpd-text text-parag">The best page builder for your next project. Great for lead generation, selling products, portfolios, and more. </div> <div id="i16e1" class="gdp-row"> <div id="i3liw" data-anim-type="fadeInUp" class="cell"> <div id="icmzi" class="gdp-row"> <div id="iss8w" class="cell"> <span id="iz1l3" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.52 0 10 4.48 10 10s-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2m-1 14.5l7-7-1.41-1.41L11 13.67l-3.09-3.08L6.5 12l4.5 4.5z"> </path> </svg></span> </div> <div id="iybsi" class="cell"> <div id="iunna" class="gpd-text"> <u> </u>Beautiful Templates </div> </div> </div> </div> <div id="i9mklb" data-anim-type="fadeInUp" class="cell"> <div id="iojbtn" class="gdp-row"> <div id="iqqse4" class="cell"> <span id="iv31zq" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.52 0 10 4.48 10 10s-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2m-1 14.5l7-7-1.41-1.41L11 13.67l-3.09-3.08L6.5 12l4.5 4.5z"> </path> </svg></span> </div> <div id="iuetex" class="cell"> <div id="i0mtuh" class="gpd-text">Better SEO </div> </div> </div> </div> <div id="im71xf" data-anim-type="fadeInUp" class="cell"> <div id="ig75zr" class="gdp-row"> <div id="iaizrh" class="cell"> <span id="ibw3z5" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.52 0 10 4.48 10 10s-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2m-1 14.5l7-7-1.41-1.41L11 13.67l-3.09-3.08L6.5 12l4.5 4.5z"> </path> </svg></span> </div> <div id="ibgalr" class="cell"> <div id="isc1v7" class="gpd-text">Better site load speed </div> </div> </div> </div> <div id="iii4c2" data-anim-type="fadeInUp" class="cell"> <div id="iffvbd" class="gdp-row"> <div id="ib768e" class="cell"> <span id="iabkhf" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M12 2c5.52 0 10 4.48 10 10s-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2m-1 14.5l7-7-1.41-1.41L11 13.67l-3.09-3.08L6.5 12l4.5 4.5z"> </path> </svg></span> </div> <div id="ik4xsj" class="cell"> <div id="i0word" class="gpd-text">Clean code </div> </div> </div> </div> </div> </div> </div> </div> </section> <section id="ictivk" class="gpd-section"> <div id="isno87" class="gpd-container"> <div id="ia96zu" class="gdp-row"> <div id="id5vaq" class="cell"> <a data-type="video" data-zoomable="true" id="i74k2j" href="https://player.vimeo.com/video/354645621?title=0&portrait=0&byline=0&autoplay=1" data-anim-type="bounceIn" class="gpd-lightbox"><span id="i8162r" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M8 5.14v14l11-7-11-7z"> </path> </svg></span></a> <div id="i8ru86" data-anim-type="fadeIn" class="gpd-box"> <h1 id="ishqai" class="text-head-xl">Watch what we do </h1> <div id="iwwjyn" class="gpd-text text-parag">The best page builder for your next project. Great for lead generation, selling products, portfolios, and more. </div> </div> </div> </div> </div> </section> <section id="i7zvem" class="gpd-section"> <div id="irrp5q" class="gpd-container"> <h1 id="iy85e6" class="text-head-xl">Our Testimonials </h1> <div id="iztdnv" class="gpd-text text-parag">The best page builder for your next project. Great for lead generation, selling products, portfolios, and more. </div> <div id="iys767" data-anim-type="fadeIn" class="swiper-slider swiper-container-horizontal"> <div id="im64hx" class="swiper-container"> <div class="swiper-wrapper"> <div id="isfenj" class="swiper-slide testimonial-slide"> <div id="iz7z6p" class="testimonial-card"> <div id="ip0rs6" class="gdp-row"> <div id="ik77ng" class="cell"> <div id="ibpffy" class="gdp-row"> <div id="iucm9h" class="cell"> <div id="i1zb2j" class="gpd-image-block testimonial-profile"> </div> </div> </div> </div> <div id="i7ciyk" class="cell"> <h3 id="i72e5l" class="testimonial-text">"The best page builder for your next project. " </h3> </div> <div id="i05ytu" class="cell"> <div id="i6xks6" class="gdp-row"> <div id="ing1ih" class="cell"> <h4 id="i9t0tb" class="testimonial-name">Maria White </h4> </div> <div id="izcy5o" class="cell"> <div id="ikdkey" class="gpd-text testimonial-pos">Digital Marketer </div> </div> </div> </div> </div> </div> </div> <div id="iunjky" class="swiper-slide testimonial-slide"> <div id="i8mmym" class="testimonial-card"> <div id="i0qnhi" class="gdp-row"> <div id="irspdn" class="cell"> <div id="ipuebf" class="gdp-row"> <div id="io59ah" class="cell"> <div id="imexdw" class="gpd-image-block testimonial-profile"> </div> </div> </div> </div> <div id="ia3o7k" class="cell"> <h3 id="i2a22g" class="testimonial-text">"Choose from basic elements or built-in blocks, drag and drop them inside the canvas, and it's done." </h3> </div> <div id="iw4wgb" class="cell"> <div id="inueyf" class="gdp-row"> <div id="im0yoj" class="cell"> <h4 id="ir0554" class="testimonial-name">Ben Parker </h4> </div> <div id="ink1as" class="cell"> <div id="isgeow" class="gpd-text testimonial-pos">Freelancer </div> </div> </div> </div> </div> </div> </div> <div id="imptbi" class="swiper-slide testimonial-slide"> <div id="igkn14" class="testimonial-card"> <div id="ioep88" class="gdp-row"> <div id="ihg94s" class="cell"> <div id="ib1quj" class="gdp-row"> <div id="idzocc" class="cell"> <div id="i28mt5" class="gpd-image-block testimonial-profile"> </div> </div> </div> </div> <div id="i5utxe" class="cell"> <h3 id="ic9qg4" class="testimonial-text">"Fantastic! Any component inside the canvas is highly customizable." </h3> </div> <div id="ipvxq4" class="cell"> <div id="irsq9v" class="gdp-row"> <div id="i9vs34" class="cell"> <h4 id="ife56j" class="testimonial-name">Amanda River </h4> </div> <div id="id366i" class="cell"> <div id="iyvq3t" class="gpd-text testimonial-pos">Co-Founder </div> </div> </div> </div> </div> </div> </div> <div id="ir5bdh" class="swiper-slide testimonial-slide"> <div id="i23faa" class="testimonial-card"> <div id="igpe2q" class="gdp-row"> <div id="ibrnye" class="cell"> <div id="i460ys" class="gdp-row"> <div id="imumnz" class="cell"> <div id="iiq5sq" class="gpd-image-block testimonial-profile"> </div> </div> </div> </div> <div id="ieuxgx" class="cell"> <h3 id="ifr4yq" class="testimonial-text">"Great for lead generation, selling products, portfolios, and more." </h3> </div> <div id="ia3v4x" class="cell"> <div id="ibkjtj" class="gdp-row"> <div id="itveeo" class="cell"> <h4 id="iki01g" class="testimonial-name">Maria White </h4> </div> <div id="ix5vfd" class="cell"> <div id="ijsnxc" class="gpd-text testimonial-pos">Digital Marketer </div> </div> </div> </div> </div> </div> </div> <div id="idm4d6" class="swiper-slide testimonial-slide"> <div id="iiw6z3" class="testimonial-card"> <div id="i8jlrw" class="gdp-row"> <div id="iln2gu" class="cell"> <div id="i8s7ig" class="gdp-row"> <div id="ig8aoe" class="cell"> <div id="i0kyrl" class="gpd-image-block testimonial-profile"> </div> </div> </div> </div> <div id="i6qxfz" class="cell"> <h3 id="idmlh6" class="testimonial-text">"Choose from basic elements or built-in blocks, drag and drop them inside the canvas, and it's done." </h3> </div> <div id="iweibk" class="cell"> <div id="icb9rw" class="gdp-row"> <div id="i7pr5f" class="cell"> <h4 id="ik92a5" class="testimonial-name">Ben Parker </h4> </div> <div id="ih3h6s" class="cell"> <div id="ikeve9" class="gpd-text testimonial-pos">Freelancer </div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="swiper-pagination"> </div> <div class="swiper-nav swiper-button-prev"> <svg viewBox="0 0 27 44"> <path d="M0,22L22,0l2.1,2.1L4.2,22l19.9,19.9L22,44L0,22L0,22L0,22z" fill="currentColor"> </path> </svg> </div> <div class="swiper-nav swiper-button-next"> <svg viewBox="0 0 27 44"> <path d="M27,22L27,22L5,44l-2.1-2.1L22.8,22L2.9,2.1L5,0L27,22L27,22z" fill="currentColor"> </path> </svg> </div> </div> </div> </section> <section id="i81u1v" class="gpd-section"> <div id="i2qlzf" class="gpd-container"> <div id="i993vg" class="gdp-row"> <div class="cell"> <h1 id="iiosyj" class="gpd-header">Subscribe to our newsletter. <br/> </h1> <div id="i8ijlb" class="gpd-text text-parag">Get the latest news in your inbox. </div> </div> <div id="izvrkh" class="cell"> <form method="post" data-redirect="" id="ib1p0e"> <div id="ikajvh" class="gdp-row"> <div class="cell"> <input type="email" placeholder="Type your email here" name="email" required id="iunh45" class="input"/> </div> <div id="ir7f5m" class="cell"> <button type="submit" id="ity5x6" class="cta-button">Subscribe</button> </div> </div> <div data-form-state="success" id="iz9pwj" class="state-success">Thanks! We received your request </div> <div data-form-state="error" id="iwstqf" class="state-error">An error occurred on processing your request, try again! </div> </form> </div> </div> </div> </section> <section id="im0u3g" class="gpd-section"> <div class="gpd-container"> <div id="iq4rhi" class="gdp-row"> <div id="i4a6eg" class="cell footer-column"> <img id="iiy47x" src="https://cdn.grapedrop.com/u9ea0154168a24ce5be62672fcb3e0565/276d1ffc02af4141a92b9ac09dfd6806_grapedrop-logo-dark-white.svg" loading="lazy"/> <div id="i2lkxq" class="gpd-text">The best page builder for your next project. Great for lead generation, selling products, portfolios, and more. </div> <a id="isxhjm" href="" class="gpd-link footer-link-color">support@grapedrop.com</a> <div id="itpjjh" class="gdp-row"> <div id="ivyzt7" class="cell"> <a href="" target="_blank" id="ivly0k" class="gpd-link-box footer-social-link"><span id="iap5p1" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M7.8 2h8.4C19.4 2 22 4.6 22 7.8v8.4c0 3.2-2.6 5.8-5.8 5.8H7.8C4.6 22 2 19.4 2 16.2V7.8C2 4.6 4.6 2 7.8 2m-.2 2C5.61 4 4 5.61 4 7.6v8.8C4 18.39 5.61 20 7.6 20h8.8c1.99 0 3.6-1.61 3.6-3.6V7.6C20 5.61 18.39 4 16.4 4H7.6m9.65 1.5a1.25 1.25 0 1 1 0 2.5 1.25 1.25 0 0 1 0-2.5M12 7c2.76 0 5 2.24 5 5s-2.24 5-5 5-5-2.24-5-5 2.24-5 5-5m0 2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"> </path> </svg></span></a> </div> <div id="iz0wao" class="cell"> <a href="" target="_blank" id="ihwkxt" class="gpd-link-box footer-social-link"><span id="ih7jpi" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M5 3h14c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2m13 2h-2.5C13.57 5 12 6.57 12 8.5V11h-2v3h2v7h3v-7h3v-3h-3V9c0-.55.45-1 1-1h2V5z"> </path> </svg></span></a> </div> <div id="i3s2ua" class="cell"> <a href="" target="_blank" id="ivu7yg" class="gpd-link-box footer-social-link"><span id="i35zto" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M5 3h14c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2m12.71 6.33c.48-.4 1.04-.88 1.29-1.41-.41.21-.9.34-1.44.41.5-.36.91-.83 1.12-1.47-.52.28-1.05.52-1.71.64-1.55-1.87-5.26-.35-4.6 2.45-2.61-.16-4.2-1.34-5.52-2.79-.75 1.22-.1 3.07.79 3.58-.46-.03-.81-.17-1.14-.33.04 1.54.89 2.28 2.08 2.68-.36.07-.76.09-1.14.03.37 1.07 1.14 1.74 2.46 1.88-.9.76-2.56 1.29-3.9 1.08 1.15.73 2.46 1.31 4.28 1.23 4.41-.2 7.36-3.36 7.43-7.98z"> </path> </svg></span></a> </div> <div id="i3im0b" class="cell"> <a href="" target="_blank" id="im04za" class="gpd-link-box footer-social-link"><span id="i54mfi" class="gpd-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M19 3c1.1 0 2 .9 2 2v14c0 1.1-.9 2-2 2H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h14m-.5 15.5v-5.3c0-1.8-1.46-3.26-3.26-3.26-.85 0-1.84.52-2.32 1.3v-1.11h-2.79v8.37h2.79v-4.93c0-.77.62-1.4 1.39-1.4.77 0 1.4.63 1.4 1.4v4.93h2.79M6.88 8.56a1.686 1.686 0 0 0 0-3.37c-.93 0-1.69.76-1.69 1.69 0 .93.76 1.68 1.69 1.68m1.39 9.94v-8.37H5.5v8.37h2.77z"> </path> </svg></span></a> </div> </div> </div> <div class="cell footer-column"> <h4 id="i09iod" class="footer-title">Pages </h4> <a id="i104le" class="gpd-link footer-link">About Us</a> <a id="iq460j" class="gpd-link footer-link">Contact</a> <a id="ie0c3h" class="gpd-link footer-link">Services</a> <a id="idsxg5" class="gpd-link footer-link">Blog</a> </div> <div id="i1ybqs" class="cell footer-column"> <h4 id="itl95j" class="footer-title">Features </h4> <a id="ifskul" class="gpd-link footer-link">Integrations</a> <a id="ijasxj" class="gpd-link footer-link">Custom Blocks</a> <a id="ihm4kz" class="gpd-link footer-link">API</a> </div> <div id="ikeiog" class="cell footer-column"> <h4 class="footer-title">Legal </h4> <a id="ifmeek" class="gpd-link footer-link">Privacy Policy</a> <a id="i0a0b5" class="gpd-link footer-link">Terms & Conditions</a> <a id="ie946q" class="gpd-link footer-link">Disclaimer</a> </div> </div> </div> </section> <style>html { scroll-behavior: smooth; } </style> <script>var items = document.querySelectorAll('#i3vv9'); for (var i = 0, len = items.length; i < len; i++) { (function(){ var t,e=0,n='gjs-collapse',r='max-height',o='ease-in-out',i=.25,a=function(){ var t,e=document.createElement('void'),n={ transition:'transitionend',OTransition:'oTransitionEnd',MozTransition:'transitionend',WebkitTransition:'webkitTransitionEnd'}; for(t in n)if(void 0!==e.style[t])return n[t]} (),s=function(t){ e=1; var n=function(t){ var e=window.getComputedStyle(t),n=e.display,o=parseInt(e[r]); if('none'!==n&&'0'!==o)return t.offsetHeight; t.style.height='auto',t.style.display='block',t.style.position='absolute',t.style.visibility='hidden'; var i=t.offsetHeight; return t.style.height='',t.style.display='',t.style.position='',t.style.visibility='',i} (t),a=t.style; a.display='block',a.transition=r+' '+i+'s '+o,a.overflowY='hidden',''==a[r]&&(a[r]=0),0==parseInt(a[r])?(a[r]='0',setTimeout(function(){ a[r]=n+'px'} ,10)):a[r]='0'}; n in this||this.addEventListener('click',function(n){ if(n.preventDefault(),!e){ var o=this.closest('.gpd-navbar').querySelector(".gpd-navbar__items"); s(o),t||(o.addEventListener(a,function(){ e=0; var t=o.style; 0==parseInt(t[r])&&(t.display='',t[r]='')} ),t=1)} } ),this[n]=1 } .bind(items[i]))(); } var items = document.querySelectorAll('#isldr'); for (var i = 0, len = items.length; i < len; i++) { (function(){ var t=this,e=function(){ var e='.gpd-lightbox'; if(!t._nolb&&!window.__glb){ for(var n=document.querySelectorAll(e),r=0;r<n.length;r++){ var o=n[r]; o.getAttribute('data-gallery')||o.setAttribute('data-gallery',o.id)} window.__glb=window.GLightbox({ zoomable:!1,selector:e} )} }; if(window.GLightbox)e(); else{ var n='https://unpkg.com/glightbox@3.0.3/dist/css/glightbox.min.css'; if(document.querySelector("link[href=\"".concat(n,"\"]")))return; var r=document.createElement('link'); r.href=n,r.rel='stylesheet',document.head.appendChild(r); var o=document.createElement('script'); o.src='https://unpkg.com/glightbox@3.0.3/dist/js/glightbox.min.js',o.onload=e,document.head.appendChild(o)} } .bind(items[i]))(); } var items = document.querySelectorAll('#imj2u2'); for (var i = 0, len = items.length; i < len; i++) { (function(){ var t=this,e=function(){ var e='.gpd-lightbox'; if(!t._nolb&&!window.__glb){ for(var n=document.querySelectorAll(e),r=0;r<n.length;r++){ var o=n[r]; o.getAttribute('data-gallery')||o.setAttribute('data-gallery',o.id)} window.__glb=window.GLightbox({ zoomable:!1,selector:e} )} }; if(window.GLightbox)e(); else{ var n='https://unpkg.com/glightbox@3.0.3/dist/css/glightbox.min.css'; if(document.querySelector("link[href=\"".concat(n,"\"]")))return; var r=document.createElement('link'); r.href=n,r.rel='stylesheet',document.head.appendChild(r); var o=document.createElement('script'); o.src='https://unpkg.com/glightbox@3.0.3/dist/js/glightbox.min.js',o.onload=e,document.head.appendChild(o)} } .bind(items[i]))(); } var props = { "itkix2":{ "startval":"11","endval":"98","decimals":"0","duration":"3","separator":",","decimal":".","prefix":"","suffix":"%","onscroll":true} ,"irmm9f":{ "startval":"0.1","endval":"4.9","decimals":"1","duration":"3","separator":",","decimal":".","prefix":"","suffix":"","onscroll":true} ,"itpj9o":{ "startval":"1","endval":"17","decimals":"0","duration":"3","separator":",","decimal":".","prefix":"","suffix":"M","onscroll":true} }; var ids = Object.keys(props).map(function(id) { return '#'+id } ).join(','); var els = document.querySelectorAll(ids); for (var i = 0, len = els.length; i < len; i++) { var el = els[i]; (function(t){ var e=this,n=function(){ var n=e,r=new(0,window.countUp.CountUp)(n,t.endval,{ startVal:t.startval,decimalPlaces:t.decimals,duration:t.duration,separator:t.separator,decimal:t.decimal,prefix:t.prefix,suffix:t.suffix} ); if(n.__countUp=r,t.onscroll&&!window._isEditor){ var o,i=!1,a=window.requestAnimationFrame||function(t){ return window.setTimeout(t,16.66)} ,s=function(){ var t=100,e=n.getBoundingClientRect(),i=e.top,a=e.bottom,s=window.innerHeight||document.documentElement.clientHeight; (i<=0&&a>=t||a>=s&&i<=s-t||i>=0&&a<=s)&&(r.start(),window.removeEventListener('scroll',o))}; o=function(){ return a(s)}; try{ window.addEventListener('e',null,{ get passive(){ i=!0} } )} catch(t){ } window.addEventListener('scroll',o,!!i&&{ passive:!0} ),s()} else r.start()}; if(window.countUp)n(); else{ var r='https://unpkg.com/countup.js@2.0.7/dist/countUp.umd.js'; if(document.querySelector("script[href=\"".concat(r,"\"]")))return; var o=document.createElement('script'); o.src=r,o.onload=n,document.head.appendChild(o)} } .bind(el))(props[el.id]); } var items = document.querySelectorAll('#i74k2j'); for (var i = 0, len = items.length; i < len; i++) { (function(){ var t=this,e=function(){ var e='.gpd-lightbox'; if(!t._nolb&&!window.__glb){ for(var n=document.querySelectorAll(e),r=0;r<n.length;r++){ var o=n[r]; o.getAttribute('data-gallery')||o.setAttribute('data-gallery',o.id)} window.__glb=window.GLightbox({ zoomable:!1,selector:e} )} }; if(window.GLightbox)e(); else{ var n='https://unpkg.com/glightbox@3.0.3/dist/css/glightbox.min.css'; if(document.querySelector("link[href=\"".concat(n,"\"]")))return; var r=document.createElement('link'); r.href=n,r.rel='stylesheet',document.head.appendChild(r); var o=document.createElement('script'); o.src='https://unpkg.com/glightbox@3.0.3/dist/js/glightbox.min.js',o.onload=e,document.head.appendChild(o)} } .bind(items[i]))(); } var items = document.querySelectorAll('#iys767'); for (var i = 0, len = items.length; i < len; i++) { (function(){ var t=this,e='https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/js/swiper.min.js',n='https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/css/swiper.min.css',r='{"initialSlide":0,"breakpoints":{"576":{"slidesPerView":1,"spaceBetween":0,"slidesPerGroup":1},"768":{"slidesPerView":1,"spaceBetween":0,"slidesPerGroup":1}},"fadeEffect":{"crossFade":true},"navigation":{"prevEl":"#iys767 .swiper-button-prev","nextEl":"#iys767 .swiper-button-next"},"loop":false,"direction":"horizontal","speed":300,"effect":"slide","spaceBetween":30,"slidesPerView":3,"slidesPerGroup":1,"centeredSlides":false,"slidesOffsetBefore":0,"slidesOffsetAfter":0,"pagination":{"type":"bullets","el":"#iys767 .swiper-pagination","dynamicBullets":false,"clickable":true},"observer":true,"observeParents":true}',o=r?JSON.parse(r):{ } ,i=t.__onLoad,a=t.__inSl; i&&(o.simulateTouch=!1),a&&(o.initialSlide=a); var s=function(){ var e=new Swiper(t.querySelector('.swiper-container'),o); i&&i(e)}; if(window.Swiper)s(); else{ var c=document.head,l=c.querySelector("link[href=\"".concat(n,"\"]")),u=c.querySelector("script[src=\"".concat(e,"\"]")); if(!l){ var d=document.createElement('link'); d.rel='stylesheet',d.href=n,c.appendChild(d)} if(u)u.addEventListener('load',s); else{ var p=document.createElement('script'); p.src=e,p.onload=s,c.appendChild(p)} } } .bind(items[i]))(); } </script>
aljimsondev
A better-auth authentication in action deep diving for authenticating NestJs API and Web application using Next.js with Postgresql database
suman-3
A sleek and premium Next.js project designed to make managing your bank transactions a breeze! 🚀 Easily track all your expenses, customize categories, and manage multiple accounts—all in one place. With the power of Hono.js, our API endpoints are fast, secure, and reliable. Start your journey to better financial management with Track-O-Pay today!
shaunyee
React For Beginners — ReactForBeginners.com Starter files for the React For Beginners course. Come Learn React with me! The code in this repo meant to be a reference point for anyone following along with the video course. To Start Note - one of the dependencies is currently not working with Node.js 10.3, please use version 9.11.1 (or around that, 8.x and 9.x should work fine) until then. cd into catch-of-the-day and follow along with the videos Each numbered folder in stepped-solutions contains the files for the beginning of each correspondingly numbered video, should you need them. So, if you need any code, pull the appropriate file into your catch-of-the-day folder. You are welcome to submit Pull Requests but I'd like to keep the code as similar as possible to the course content. Code Use You are welcome to use this code in your own applications. If you would like to use it for training purposes, please shoot me a message first to make sure it's okay. Frequently Asked Questions ❓ I'm getting error "Pre-built binaries not found for grpc@1.10.1 and node@10.3.0" and "Tried to download(403): https://storage.googleapis.com....." One of the dependencies is currently not working with Node.js 10.3, please use version 9.11.1 (or around that, 8.x and 9.x should work fine) until then. Don't sweat this as it's just build tooling and isn't related to the version of react you are using. ❓ I tried installing the Babel syntax highlighter but it didn't work! There are a few possible options: If you are on Sublime Text 2, you should Upgrade to Sublime Text 3. Some users have reported restarting works You can try the JavaScript Next syntax highlighter instead ❓ I can't set Babel as the default syntax highlighter! Make sure you are in a file with the extension of .js before you do this step - you can't set the default for a file without having a file open! ❓ I can't see the React tab in my dev tools Restart your dev tools or your chrome browser entirely. They will only show up when you are viewing a React app - so make sure you test it on Facebook or another website that is running React. It won't work on your empty main.js file until you import React from 'react'. ❓ npm start doesn't update the app on file save, or doesn't run correctly. There may be a few different causes for this: Webpack currently can't handle folder/file names that contain parentheses. Webpack also has problems running inside folders for Dropbox/Google Drive type services. Git is recommended for keeping your files in sync across multiple computers. Changes In the 2018 RE-Record In March 2018 I re-recorded this course. Here are the things that I've updated. Upgrade to React Router 4 Final API Use React 16.3 Move to external PropTypes Package Use React's new Refs API, remove function refs Remove all use of constructors and super() - use class properties instead Better explain binding, use of this and component instances Moved from React-addons-css-transition-group to react-transition-group and upgraded from 1.x to 2.x Use official Firebase package for Auth as re-base is now only for data binding Move promise based code to async/await Show how to return multiple elements with React.Fragment htaccess Here is the .htaccess file we use in the apache deployment video RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L]
hieu9955
--[[ Vouch My Thread On V3rmillion - TuranYmn12 ]] local SynapseXen_iiiIiIlliII=select;local SynapseXen_ilIIilI=string.byte; local SynapseXen_iIiIIi=string.sub; warn("Vouch My Thread On V3rmillion - TuranYmn12") local SynapseXen_lllliIlIlIIIl=string.char;local SynapseXen_iIIiIliIiiIIIIi=type;local SynapseXen_llliilIIllIiiIIII=table.concat;local unpack=unpack;local setmetatable=setmetatable;local pcall=pcall;local SynapseXen_IiilillliiIi,SynapseXen_iIIIllIlIIll,SynapseXen_IlIIlIIilIililIlll,SynapseXen_iiIii;if bit and bit.bxor then SynapseXen_IiilillliiIi=bit.bxor;SynapseXen_iIIIllIlIIll=function(SynapseXen_liIIiIlIIlIilllIiilI,SynapseXen_illiIII)local SynapseXen_iIlIIlIIIIIiIlli=SynapseXen_IiilillliiIi(SynapseXen_liIIiIlIIlIilllIiilI,SynapseXen_illiIII)if SynapseXen_iIlIIlIIIIIiIlli<0 then SynapseXen_iIlIIlIIIIIiIlli=4294967296+SynapseXen_iIlIIlIIIIIiIlli end;return SynapseXen_iIlIIlIIIIIiIlli end else SynapseXen_IiilillliiIi=function(SynapseXen_liIIiIlIIlIilllIiilI,SynapseXen_illiIII)local SynapseXen_IiIlii=function(SynapseXen_lIIII,SynapseXen_liIiI)return SynapseXen_lIIII%(SynapseXen_liIiI*2)>=SynapseXen_liIiI end;local SynapseXen_IiIlIIlI=0;for SynapseXen_IlIiI=0,31 do SynapseXen_IiIlIIlI=SynapseXen_IiIlIIlI+(SynapseXen_IiIlii(SynapseXen_liIIiIlIIlIilllIiilI,2^SynapseXen_IlIiI)~=SynapseXen_IiIlii(SynapseXen_illiIII,2^SynapseXen_IlIiI)and 2^SynapseXen_IlIiI or 0)end;return SynapseXen_IiIlIIlI end;SynapseXen_iIIIllIlIIll=SynapseXen_IiilillliiIi end;SynapseXen_IlIIlIIilIililIlll=function(SynapseXen_IiIil,SynapseXen_iIiiliillllIllll,SynapseXen_IIilIillIIii)return(SynapseXen_IiIil+SynapseXen_iIiiliillllIllll)%SynapseXen_IIilIillIIii end;SynapseXen_iiIii=function(SynapseXen_IiIil,SynapseXen_iIiiliillllIllll,SynapseXen_IIilIillIIii)return(SynapseXen_IiIil-SynapseXen_iIiiliillllIllll)%SynapseXen_IIilIillIIii end;local function SynapseXen_iliIiIIIiilIliIIil(SynapseXen_iIlIIlIIIIIiIlli)if SynapseXen_iIlIIlIIIIIiIlli<0 then SynapseXen_iIlIIlIIIIIiIlli=4294967296+SynapseXen_iIlIIlIIIIIiIlli end;return SynapseXen_iIlIIlIIIIIiIlli end;local getfenv=getfenv;if not getfenv then getfenv=function()return _ENV end end;local SynapseXen_ilIliiI={}local SynapseXen_IllIiIili={}local SynapseXen_IilllilIlIiIlillllI;local SynapseXen_IiIilliilIIl;local SynapseXen_IiIiIIilIli={}local SynapseXen_iIlIlIl={}for SynapseXen_IlIiI=0,255 do local SynapseXen_IlliilIiIill,SynapseXen_ilIIIlilli=SynapseXen_lllliIlIlIIIl(SynapseXen_IlIiI),SynapseXen_lllliIlIlIIIl(SynapseXen_IlIiI,0)SynapseXen_IiIiIIilIli[SynapseXen_IlliilIiIill]=SynapseXen_ilIIIlilli;SynapseXen_iIlIlIl[SynapseXen_ilIIIlilli]=SynapseXen_IlliilIiIill end;local function SynapseXen_liIIIiIIIllIIilI(SynapseXen_IlllliIIlIliIil,SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi)if SynapseXen_lIIlIllil>=256 then SynapseXen_lIIlIllil,SynapseXen_lIllilIIi=0,SynapseXen_lIllilIIi+1;if SynapseXen_lIllilIIi>=256 then SynapseXen_iiIillliiIIiiiIiI={}SynapseXen_lIllilIIi=1 end end;SynapseXen_iiIillliiIIiiiIiI[SynapseXen_lllliIlIlIIIl(SynapseXen_lIIlIllil,SynapseXen_lIllilIIi)]=SynapseXen_IlllliIIlIliIil;SynapseXen_lIIlIllil=SynapseXen_lIIlIllil+1;return SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi end;local function SynapseXen_iIillIiili(SynapseXen_lIIllIiIillI)local function SynapseXen_llliIllII(SynapseXen_IillllllIiiIliiIIil)local SynapseXen_lIllilIIi='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'SynapseXen_IillllllIiiIliiIIil=string.gsub(SynapseXen_IillllllIiiIliiIIil,'[^'..SynapseXen_lIllilIIi..'=]','')return SynapseXen_IillllllIiiIliiIIil:gsub('.',function(SynapseXen_IiIil)if SynapseXen_IiIil=='='then return''end;local SynapseXen_iliiil,SynapseXen_IIlIIIiillIiIiIIIiii='',SynapseXen_lIllilIIi:find(SynapseXen_IiIil)-1;for SynapseXen_IlIiI=6,1,-1 do SynapseXen_iliiil=SynapseXen_iliiil..(SynapseXen_IIlIIIiillIiIiIIIiii%2^SynapseXen_IlIiI-SynapseXen_IIlIIIiillIiIiIIIiii%2^(SynapseXen_IlIiI-1)>0 and'1'or'0')end;return SynapseXen_iliiil end):gsub('%d%d%d?%d?%d?%d?%d?%d?',function(SynapseXen_IiIil)if#SynapseXen_IiIil~=8 then return''end;local SynapseXen_IIiIi=0;for SynapseXen_IlIiI=1,8 do SynapseXen_IIiIi=SynapseXen_IIiIi+(SynapseXen_IiIil:sub(SynapseXen_IlIiI,SynapseXen_IlIiI)=='1'and 2^(8-SynapseXen_IlIiI)or 0)end;return string.char(SynapseXen_IIiIi)end)end;SynapseXen_lIIllIiIillI=SynapseXen_llliIllII(SynapseXen_lIIllIiIillI)local SynapseXen_iiiIilIiI=SynapseXen_iIiIIi(SynapseXen_lIIllIiIillI,1,1)if SynapseXen_iiiIilIiI=="u"then return SynapseXen_iIiIIi(SynapseXen_lIIllIiIillI,2)elseif SynapseXen_iiiIilIiI~="c"then error("Synapse Xen - Failed to verify bytecode. Please make sure your Lua implementation supports non-null terminated strings.")end;SynapseXen_lIIllIiIillI=SynapseXen_iIiIIi(SynapseXen_lIIllIiIillI,2)local SynapseXen_llIiIl=#SynapseXen_lIIllIiIillI;local SynapseXen_iiIillliiIIiiiIiI={}local SynapseXen_lIIlIllil,SynapseXen_lIllilIIi=0,1;local SynapseXen_IilliIIiilIIllIl={}local SynapseXen_iIlIIlIIIIIiIlli=1;local SynapseXen_IliiIlI=SynapseXen_iIiIIi(SynapseXen_lIIllIiIillI,1,2)SynapseXen_IilliIIiilIIllIl[SynapseXen_iIlIIlIIIIIiIlli]=SynapseXen_iIlIlIl[SynapseXen_IliiIlI]or SynapseXen_iiIillliiIIiiiIiI[SynapseXen_IliiIlI]SynapseXen_iIlIIlIIIIIiIlli=SynapseXen_iIlIIlIIIIIiIlli+1;for SynapseXen_IlIiI=3,SynapseXen_llIiIl,2 do local SynapseXen_iIlllliiiilIiIiIIi=SynapseXen_iIiIIi(SynapseXen_lIIllIiIillI,SynapseXen_IlIiI,SynapseXen_IlIiI+1)local SynapseXen_iIIiiliIllliIiiiIll=SynapseXen_iIlIlIl[SynapseXen_IliiIlI]or SynapseXen_iiIillliiIIiiiIiI[SynapseXen_IliiIlI]if not SynapseXen_iIIiiliIllliIiiiIll then error("Synapse Xen - Failed to verify bytecode. Please make sure your Lua implementation supports non-null terminated strings.")end;local SynapseXen_illIilIIIIIiliIlIIii=SynapseXen_iIlIlIl[SynapseXen_iIlllliiiilIiIiIIi]or SynapseXen_iiIillliiIIiiiIiI[SynapseXen_iIlllliiiilIiIiIIi]if SynapseXen_illIilIIIIIiliIlIIii then SynapseXen_IilliIIiilIIllIl[SynapseXen_iIlIIlIIIIIiIlli]=SynapseXen_illIilIIIIIiliIlIIii;SynapseXen_iIlIIlIIIIIiIlli=SynapseXen_iIlIIlIIIIIiIlli+1;SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi=SynapseXen_liIIIiIIIllIIilI(SynapseXen_iIIiiliIllliIiiiIll..SynapseXen_iIiIIi(SynapseXen_illIilIIIIIiliIlIIii,1,1),SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi)else local SynapseXen_liIiliiiIi=SynapseXen_iIIiiliIllliIiiiIll..SynapseXen_iIiIIi(SynapseXen_iIIiiliIllliIiiiIll,1,1)SynapseXen_IilliIIiilIIllIl[SynapseXen_iIlIIlIIIIIiIlli]=SynapseXen_liIiliiiIi;SynapseXen_iIlIIlIIIIIiIlli=SynapseXen_iIlIIlIIIIIiIlli+1;SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi=SynapseXen_liIIIiIIIllIIilI(SynapseXen_liIiliiiIi,SynapseXen_iiIillliiIIiiiIiI,SynapseXen_lIIlIllil,SynapseXen_lIllilIIi)end;SynapseXen_IliiIlI=SynapseXen_iIlllliiiilIiIiIIi end;return SynapseXen_llliilIIllIiiIIII(SynapseXen_IilliIIiilIIllIl)end;local function SynapseXen_IlilIiiiiIili(SynapseXen_liIIiI,SynapseXen_iIIliIi,SynapseXen_lIillilIilIIli)if SynapseXen_lIillilIilIIli then local SynapseXen_iIIliIIiIilliii=SynapseXen_liIIiI/2^(SynapseXen_iIIliIi-1)%2^(SynapseXen_lIillilIilIIli-1-(SynapseXen_iIIliIi-1)+1)return SynapseXen_iIIliIIiIilliii-SynapseXen_iIIliIIiIilliii%1 else local SynapseXen_ilIllIlliillIIlilli=2^(SynapseXen_iIIliIi-1)if SynapseXen_liIIiI%(SynapseXen_ilIllIlliillIIlilli+SynapseXen_ilIllIlliillIIlilli)>=SynapseXen_ilIllIlliillIIlilli then return 1 else return 0 end end end;local function SynapseXen_IiiliIlIllIil()local SynapseXen_IlIiIil=SynapseXen_IiilillliiIi(3855667269,SynapseXen_IiIilliilIIl)while true do if SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(3855666810,SynapseXen_IiIilliilIIl)then SynapseXen_IilllilIlIiIlillllI=function(SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil)return SynapseXen_IiilillliiIi(SynapseXen_iIiilliiilii-2812,SynapseXen_ilIiIlililllIil+37927)-SynapseXen_IiilillliiIi(1319943582,SynapseXen_IiIilliilIIl)end;SynapseXen_IlIiIil=SynapseXen_IiilillliiIi(SynapseXen_IlIiIil,SynapseXen_IiilillliiIi(2898358907,SynapseXen_IiIilliilIIl))elseif SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(3855667269,SynapseXen_IiIilliilIIl)then SynapseXen_IilllilIlIiIlillllI=function(SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil)return SynapseXen_IiilillliiIi(SynapseXen_iIiilliiilii-8544,SynapseXen_ilIiIlililllIil-42390)-SynapseXen_IiilillliiIi(1319933057,SynapseXen_IiIilliilIIl)end;SynapseXen_IlIiIil=SynapseXen_IlIiIil-SynapseXen_IiilillliiIi(1319941881,SynapseXen_IiIilliilIIl)elseif SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(1804550305,SynapseXen_IllIiIili[6])then SynapseXen_IilllilIlIiIlillllI=function(SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil)return SynapseXen_IiilillliiIi(SynapseXen_iIiilliiilii+30999,SynapseXen_ilIiIlililllIil-42851)-SynapseXen_IiilillliiIi(1319955578,SynapseXen_IiIilliilIIl)end;SynapseXen_IlIiIil=SynapseXen_IlIiIil+SynapseXen_IiilillliiIi(523026661,SynapseXen_IllIiIili[4])elseif SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(1446846680,SynapseXen_IllIiIili[4])then SynapseXen_IilllilIlIiIlillllI=function(SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil)return SynapseXen_IiilillliiIi(SynapseXen_iIiilliiilii+45157,SynapseXen_ilIiIlililllIil+26308)+SynapseXen_IiilillliiIi(846803656,SynapseXen_IllIiIili[1])end;SynapseXen_IlIiIil=SynapseXen_IiilillliiIi(SynapseXen_IlIiIil,SynapseXen_IiilillliiIi(4197231965,SynapseXen_IiIilliilIIl))elseif SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(3007130756,SynapseXen_IiIilliilIIl)then return elseif SynapseXen_IlIiIil==SynapseXen_IiilillliiIi(3488149833,SynapseXen_IllIiIili[1])then SynapseXen_IilllilIlIiIlillllI=function(SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil)return SynapseXen_IiilillliiIi(SynapseXen_iIiilliiilii-18483,SynapseXen_ilIiIlililllIil+19323)+SynapseXen_IiilillliiIi(4236822034,SynapseXen_IllIiIili[8])end;SynapseXen_IlIiIil=SynapseXen_IlIiIil-SynapseXen_IiilillliiIi(1319955946,SynapseXen_IiIilliilIIl)end end end;local function SynapseXen_iIIllIIII(SynapseXen_IiiIlililIlIiiii)local SynapseXen_liillIIlliiiIIl=1;local SynapseXen_iIIIIlIl;local SynapseXen_IIiIllIi;local function SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_IIliII=SynapseXen_ilIIilI(SynapseXen_IiiIlililIlIiiii,SynapseXen_liillIIlliiiIIl,SynapseXen_liillIIlliiiIIl)SynapseXen_liillIIlliiiIIl=SynapseXen_liillIIlliiiIIl+1;return SynapseXen_IIliII end;local function SynapseXen_lIillllliIli()local SynapseXen_lililiiliiIiiiiI,SynapseXen_iIiilliiilii,SynapseXen_ilIiIlililllIil,SynapseXen_IlIlIiiiIilliiliilIl=SynapseXen_ilIIilI(SynapseXen_IiiIlililIlIiiii,SynapseXen_liillIIlliiiIIl,SynapseXen_liillIIlliiiIIl+3)SynapseXen_liillIIlliiiIIl=SynapseXen_liillIIlliiiIIl+4;return SynapseXen_IlIlIiiiIilliiliilIl*16777216+SynapseXen_ilIiIlililllIil*65536+SynapseXen_iIiilliiilii*256+SynapseXen_lililiiliiIiiiiI end;local function SynapseXen_iliiIIiIl()return SynapseXen_lIillllliIli()*4294967296+SynapseXen_lIillllliIli()end;local function SynapseXen_iIIililIiiiill()local SynapseXen_iIiiiIlIiiIllIlliI=SynapseXen_iIIIllIlIIll(SynapseXen_lIillllliIli(),SynapseXen_ilIliiI[1267869007]or(function()local SynapseXen_IiIil="epic gamer vision"SynapseXen_ilIliiI[1267869007]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2294385245,3141878040),SynapseXen_IiilillliiIi(405970966,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{830297185,2707010430,4084762625,4218612234,61280943,1594101614,181454963}return SynapseXen_ilIliiI[1267869007]end)())local SynapseXen_iiiilIIlilllIlIiil=SynapseXen_iIIIllIlIIll(SynapseXen_lIillllliIli(),SynapseXen_ilIliiI[1921484102]or(function()local SynapseXen_IiIil="xen detects custom getfenv"SynapseXen_ilIliiI[1921484102]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2550753609,794375601),SynapseXen_IiilillliiIi(3524560535,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1656675648,1140019836,1820460244,824195461,2101884187,3736967173,1341413341}return SynapseXen_ilIliiI[1921484102]end)())local SynapseXen_lIliiill=1;local SynapseXen_IiIlIiiiillllI=SynapseXen_IlilIiiiiIili(SynapseXen_iiiilIIlilllIlIiil,1,20)*2^32+SynapseXen_iIiiiIlIiiIllIlliI;local SynapseXen_IiiiIlIIilIiIliliiI=SynapseXen_IlilIiiiiIili(SynapseXen_iiiilIIlilllIlIiil,21,31)local SynapseXen_llliIliiiliIIllIii=(-1)^SynapseXen_IlilIiiiiIili(SynapseXen_iiiilIIlilllIlIiil,32)if SynapseXen_IiiiIlIIilIiIliliiI==0 then if SynapseXen_IiIlIiiiillllI==0 then return SynapseXen_llliIliiiliIIllIii*0 else SynapseXen_IiiiIlIIilIiIliliiI=1;SynapseXen_lIliiill=0 end elseif SynapseXen_IiiiIlIIilIiIliliiI==2047 then if SynapseXen_IiIlIiiiillllI==0 then return SynapseXen_llliIliiiliIIllIii*1/0 else return SynapseXen_llliIliiiliIIllIii*0/0 end end;return math.ldexp(SynapseXen_llliIliiiliIIllIii,SynapseXen_IiiiIlIIilIiIliliiI-1023)*(SynapseXen_lIliiill+SynapseXen_IiIlIiiiillllI/2^52)end;local function SynapseXen_iIlilllIII(SynapseXen_liiiliiIiiiIIllIIl)local SynapseXen_iIili;if SynapseXen_liiiliiIiiiIIllIIl then SynapseXen_iIili=SynapseXen_iIiIIi(SynapseXen_IiiIlililIlIiiii,SynapseXen_liillIIlliiiIIl,SynapseXen_liillIIlliiiIIl+SynapseXen_liiiliiIiiiIIllIIl-1)SynapseXen_liillIIlliiiIIl=SynapseXen_liillIIlliiiIIl+SynapseXen_liiiliiIiiiIIllIIl else SynapseXen_liiiliiIiiiIIllIIl=SynapseXen_iIIIIlIl()if SynapseXen_liiiliiIiiiIIllIIl==0 then return""end;SynapseXen_iIili=SynapseXen_iIiIIi(SynapseXen_IiiIlililIlIiiii,SynapseXen_liillIIlliiiIIl,SynapseXen_liillIIlliiiIIl+SynapseXen_liiiliiIiiiIIllIIl-1)SynapseXen_liillIIlliiiIIl=SynapseXen_liillIIlliiiIIl+SynapseXen_liiiliiIiiiIIllIIl end;return SynapseXen_iIili end;local function SynapseXen_IiIIiIiillil(SynapseXen_iIili)local SynapseXen_iIIliIIiIilliii={}for SynapseXen_IlIiI=1,#SynapseXen_iIili do local SynapseXen_llIlillliIl=SynapseXen_iIili:sub(SynapseXen_IlIiI,SynapseXen_IlIiI)SynapseXen_iIIliIIiIilliii[#SynapseXen_iIIliIIiIilliii+1]=string.char(SynapseXen_IiilillliiIi(string.byte(SynapseXen_llIlillliIl),SynapseXen_ilIliiI[3731878160]or(function(...)local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2099685196,3660834920)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3757913695,537086278)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3731878160]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1155421613,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3518260141,SynapseXen_IllIiIili[1]))-string.len(SynapseXen_IiIil)-#{3470132641,661519185,1170834111,2105980783}return SynapseXen_ilIliiI[3731878160]end)("IIiilIlIiIlIii",{},"IlIlIliiIllllIi",9712,1379)))end;return table.concat(SynapseXen_iIIliIIiIilliii)end;local function SynapseXen_iiIIiIilI()local SynapseXen_iIiIlIIiIiilIiIIiiIl={}local SynapseXen_IlililIiiIllI={}local SynapseXen_lilllillilllIilIIlII={}local SynapseXen_IIlIliiiIIiiiIlII={[SynapseXen_ilIliiI[1650717969]or(function(...)local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3700464250,3303314453)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1994470451,2300519919)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1650717969]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2471371589,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(712252886,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{4064943556,4260646729,3002829587,3267003931,824911922,4061971813,585640868,1588812355,2871138580,3155743230}return SynapseXen_ilIliiI[1650717969]end)("IIIi","i",21,6886,14565,5215,"llIil")]=SynapseXen_iIiIlIIiIiilIiIIiiIl,[SynapseXen_ilIliiI[1242733850]or(function(...)local SynapseXen_IiIil="my way to go against expwoiting is to have safety measuwes. i 1 wocawscwipt and onwy moduwes. hewe's how it wowks: this scwipt bewow stowes the moduwes in a tabwe fow each moduwe we send the wist with the moduwes and moduwe infowmation and use inyit a function in my moduwe that wiww stowe the info and aftew it has send to aww the moduwes it wiww dewete them. so whenyevew the cwient twies to hack they cant get the moduwes. onwy this peace of wocawscwipt."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(201016735,3936823982)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3835902591,459092339)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1242733850]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1871408226,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3486054621,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{2741874397,3448725862}return SynapseXen_ilIliiI[1242733850]end)({},{},13361,8232,"ilIlIilIll",3389,{},{},"IllliI")]=SynapseXen_lilllillilllIilIIlII,[SynapseXen_ilIliiI[3534296032]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4264524451,1757095730)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3086103916,1208888876)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3534296032]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1620393180,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4254923180,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{3026704080,1006827184,639630771,1570222280,3240259067,3592785325}return SynapseXen_ilIliiI[3534296032]end)({},{},"Ii",{},{},{})]=SynapseXen_IlililIiiIllI}SynapseXen_IIlIliiiIIiiiIlII[2071787167]=SynapseXen_IiilillliiIi(SynapseXen_IliiiIIIiilIllIIlil(),SynapseXen_ilIliiI[1456950300]or(function()local SynapseXen_IiIil="wait for someone on devforum to say they are gonna deobfuscate this"SynapseXen_ilIliiI[1456950300]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2976524714,3767246373),SynapseXen_IiilillliiIi(1322125970,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{2640766432,2210333402,1235537910,1838294044,3111109465,1004659691,1033569205,3111538094}return SynapseXen_ilIliiI[1456950300]end)())SynapseXen_IliiiIIIiilIllIIlil()SynapseXen_IliiiIIIiilIllIIlil()SynapseXen_IIlIliiiIIiiiIlII[874304623]=SynapseXen_IiilillliiIi(SynapseXen_IliiiIIIiilIllIIlil(),SynapseXen_ilIliiI[4175213627]or(function(...)local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(271199172,60139637)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3262039224,1032953591)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4175213627]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2311581375,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2434465359,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{3771489655,3821262836,2322123662}return SynapseXen_ilIliiI[4175213627]end)({},"iIiIlIiliIliIIiliI",{}))SynapseXen_lIillllliIli()for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IiilillliiIi(SynapseXen_IIiIllIi(),SynapseXen_ilIliiI[3338979896]or(function()local SynapseXen_IiIil="pain is gonna use the backspace method on xen"SynapseXen_ilIliiI[3338979896]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3240398579,380592753),SynapseXen_IiilillliiIi(789167596,SynapseXen_IllIiIili[5]))-string.len(SynapseXen_IiIil)-#{4022989847,390567114,1982735004,77807044,894942979,2831284744,1601796188,3561999850,3132538100,3105919124}return SynapseXen_ilIliiI[3338979896]end)())do SynapseXen_lIillllliIli()local SynapseXen_iIIlilIl=SynapseXen_IiilillliiIi(SynapseXen_lIillllliIli(),SynapseXen_ilIliiI[3608674783]or(function()local SynapseXen_IiIil="this is a christian obfuscator, no cursing allowed in our scripts"SynapseXen_ilIliiI[3608674783]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2404442456,3643760164),SynapseXen_IiilillliiIi(1314717610,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3395694261,2480005133,2078893472,4284303983,3940078644,3815363209,4012679640,1641912613,1964667898,2274081337}return SynapseXen_ilIliiI[3608674783]end)())local SynapseXen_lIlliliIlI=SynapseXen_IliiiIIIiilIllIIlil()SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_iIIiIliIiiIIIIi=SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_illIIilIiIIiIIill={[497366273]=SynapseXen_iIIlilIl,[2075702005]=SynapseXen_lIlliliIlI,[253265259]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,1,6),[1152160448]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,7,14)}if SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[523360511]or(function(...)local SynapseXen_IiIil="imagine using some lua minifier tool and thinking you are a badass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(356405339,2102268817)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3745956193,548978989)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[523360511]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1077598420,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(589961119,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{11064321,342327211,2454213896,1175030178,1399283916,640432413}return SynapseXen_ilIliiI[523360511]end)("liIIllli",8764,{},{},{},{},10169,"lIiI"))then SynapseXen_illIIilIiIIiIIill[1402414475]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,24,32)SynapseXen_illIIilIiIIiIIill[221391887]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,15,23)elseif SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[4074475973]or(function()local SynapseXen_IiIil="print(bytecode)"SynapseXen_ilIliiI[4074475973]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1912978837,3974251338),SynapseXen_IiilillliiIi(2895221055,SynapseXen_IllIiIili[1]))-string.len(SynapseXen_IiIil)-#{3788503389}return SynapseXen_ilIliiI[4074475973]end)())then SynapseXen_illIIilIiIIiIIill[2116109763]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,15,32)elseif SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[2553514265]or(function(...)local SynapseXen_IiIil="i put more time into this shitty list of dead memes then i did into the obfuscator itself"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(583425464,225903522)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3354341724,940647074)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2553514265]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3767344719,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3294543403,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{818881130,2641166741,1416465228,2904398867}return SynapseXen_ilIliiI[2553514265]end)(7105,"IlIIlIi","ilIliiilIiiiilIIIll",{},10675,{}))then SynapseXen_illIIilIiIIiIIill[990094981]=SynapseXen_IlilIiiiiIili(SynapseXen_iIIlilIl,15,32)-131071 end;SynapseXen_lilllillilllIilIIlII[SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_illIIilIiIIiIIill end;SynapseXen_lIillllliIli()SynapseXen_IliiiIIIiilIllIIlil()for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IiilillliiIi(SynapseXen_IIiIllIi(),SynapseXen_ilIliiI[2653029917]or(function(...)local SynapseXen_IiIil="wow xen is shit buy luraph ok"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2684747121,2103883481)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3213315501,1081631010)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2653029917]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(500645172,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(592343085,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2306401165,206755677,1730521950,3087363599,4082464569,2312589097,1265583629,1253977098,3085408702,2889977431}return SynapseXen_ilIliiI[2653029917]end)("IlIliIlliiiIil",3596,11372,"iI",12832,7790,{},{},"liliiII",9331))do SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_iIIiIliIiiIIIIi=SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_lIiilIl;if SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[607044614]or(function(...)local SynapseXen_IiIil="level 1 crook = luraph, level 100 boss = xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2570579146,2503503472)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3720293815,574683093)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[607044614]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1311831610,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(210982268,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2475293098,4029855342,3257600483,15199415,4172582731}return SynapseXen_ilIliiI[607044614]end)(6981,{}))then SynapseXen_lIiilIl=SynapseXen_IliiiIIIiilIllIIlil()~=0 elseif SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[1047017424]or(function(...)local SynapseXen_IiIil="sponsored by ironbrew, jk xen is better"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3930313165,2277362695)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3710709072,584237842)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1047017424]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3807979590,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3249255460,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1865844408}return SynapseXen_ilIliiI[1047017424]end)({}))then SynapseXen_lIiilIl=SynapseXen_iIIililIiiiill()elseif SynapseXen_iIIiIliIiiIIIIi==(SynapseXen_ilIliiI[1434424291]or(function()local SynapseXen_IiIil="now with shitty xor string obfuscation"SynapseXen_ilIliiI[1434424291]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(630522874,3136522014),SynapseXen_IiilillliiIi(3519745702,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1355206098,1452874204,2655529095,3373788803,1613320333,2819424158}return SynapseXen_ilIliiI[1434424291]end)())then SynapseXen_lIiilIl=SynapseXen_iIiIIi(SynapseXen_IiIIiIiillil(SynapseXen_iIlilllIII()),1,-2)end;SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiliiliIiiIiiIliIlI-1]=SynapseXen_lIiilIl end;SynapseXen_lIillllliIli()for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IiilillliiIi(SynapseXen_IIiIllIi(),SynapseXen_ilIliiI[2381264180]or(function()local SynapseXen_IiIil="i'm intercommunication about the most nonecclesiastical dll exploits for esp. they only characterization objects with a antepatriarchal in the geistesgeschichte for the esp."SynapseXen_ilIliiI[2381264180]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2938048768,141602487),SynapseXen_IiilillliiIi(812756732,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-#{3753710585,2882897954,42431269,2131245162}return SynapseXen_ilIliiI[2381264180]end)())do SynapseXen_IlililIiiIllI[SynapseXen_IiliiliIiiIiiIliIlI-1]=SynapseXen_iiIIiIilI()end;return SynapseXen_IIlIliiiIIiiiIlII end;do assert(SynapseXen_iIlilllIII(4)=="\27Xen","Synapse Xen - Failed to verify bytecode. Please make sure your Lua implementation supports non-null terminated strings.")SynapseXen_IIiIllIi=SynapseXen_lIillllliIli;SynapseXen_iIIIIlIl=SynapseXen_lIillllliIli;local SynapseXen_iIiliiliiililill=SynapseXen_iIlilllIII()SynapseXen_IiIilliilIIl=SynapseXen_iliIiIIIiilIliIIil(SynapseXen_IIiIllIi())SynapseXen_lIillllliIli()SynapseXen_IliiiIIIiilIllIIlil()local SynapseXen_lIIlI=0;for SynapseXen_IlIiI=1,#SynapseXen_iIiliiliiililill do local SynapseXen_llIlillliIl=SynapseXen_iIiliiliiililill:sub(SynapseXen_IlIiI,SynapseXen_IlIiI)SynapseXen_lIIlI=SynapseXen_lIIlI+string.byte(SynapseXen_llIlillliIl)end;SynapseXen_lIIlI=SynapseXen_IiilillliiIi(SynapseXen_lIIlI,SynapseXen_IiIilliilIIl)for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IliiiIIIiilIllIIlil()do SynapseXen_IllIiIili[SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_iIIIllIlIIll(SynapseXen_IIiIllIi(),SynapseXen_lIIlI)end;SynapseXen_IiiliIlIllIil()end;return SynapseXen_iiIIiIilI()end;local function SynapseXen_iIlliII(...)return SynapseXen_iiiIiIlliII('#',...),{...}end;local function SynapseXen_liilIIiiiIiIlii(SynapseXen_IIlIliiiIIiiiIlII,SynapseXen_llIll,SynapseXen_lIiiIIlIlIllIIiIil)local SynapseXen_iIiIlIIiIiilIiIIiiIl=SynapseXen_IIlIliiiIIiiiIlII[SynapseXen_ilIliiI[1650717969]or(function(...)local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3700464250,3303314453)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1994470451,2300519919)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1650717969]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2471371589,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(712252886,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{4064943556,4260646729,3002829587,3267003931,824911922,4061971813,585640868,1588812355,2871138580,3155743230}return SynapseXen_ilIliiI[1650717969]end)("IIIi","i",21,6886,14565,5215,"llIil")]local SynapseXen_IlililIiiIllI=SynapseXen_IIlIliiiIIiiiIlII[SynapseXen_ilIliiI[3534296032]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4264524451,1757095730)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3086103916,1208888876)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3534296032]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1620393180,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4254923180,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{3026704080,1006827184,639630771,1570222280,3240259067,3592785325}return SynapseXen_ilIliiI[3534296032]end)({},{},"Ii",{},{},{})]local SynapseXen_lilllillilllIilIIlII=SynapseXen_IIlIliiiIIiiiIlII[SynapseXen_ilIliiI[1242733850]or(function(...)local SynapseXen_IiIil="my way to go against expwoiting is to have safety measuwes. i 1 wocawscwipt and onwy moduwes. hewe's how it wowks: this scwipt bewow stowes the moduwes in a tabwe fow each moduwe we send the wist with the moduwes and moduwe infowmation and use inyit a function in my moduwe that wiww stowe the info and aftew it has send to aww the moduwes it wiww dewete them. so whenyevew the cwient twies to hack they cant get the moduwes. onwy this peace of wocawscwipt."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(201016735,3936823982)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3835902591,459092339)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1242733850]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1871408226,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3486054621,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{2741874397,3448725862}return SynapseXen_ilIliiI[1242733850]end)({},{},13361,8232,"ilIlIilIll",3389,{},{},"IllliI")]return function(...)local SynapseXen_lIIIllIiiIIlil,SynapseXen_llllIilliIllilII=1,-1;local SynapseXen_lIiliiIiIIiIil,SynapseXen_IllIlIIiiliiiliiiIIi={},SynapseXen_iiiIiIlliII('#',...)-1;local SynapseXen_iIIlIiiIiiiIIIi=0;local SynapseXen_IlIlliI={}local SynapseXen_lIiIlIliillllIi={}local SynapseXen_lIiil=setmetatable({},{__index=SynapseXen_IlIlliI,__newindex=function(SynapseXen_IllliIiIIiiilIIlIIII,SynapseXen_lIIIlIIillliiI,SynapseXen_IllIilil)if SynapseXen_lIIIlIIillliiI>SynapseXen_llllIilliIllilII then SynapseXen_llllIilliIllilII=SynapseXen_lIIIlIIillliiI end;SynapseXen_IlIlliI[SynapseXen_lIIIlIIillliiI]=SynapseXen_IllIilil end})local function SynapseXen_iIllIIiIillIli()local SynapseXen_illIIilIiIIiIIill,SynapseXen_lliIiIliI;while true do SynapseXen_illIIilIiIIiIIill=SynapseXen_lilllillilllIilIIlII[SynapseXen_lIIIllIiiIIlil]SynapseXen_lliIiIliI=SynapseXen_illIIilIiIIiIIill[2075702005]SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1;if SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2237059324]or(function()local SynapseXen_IiIil="what are you trying to say? that fucking one dot + dot + dot + many dots is not adding adding 1 dot + dot and then adding all the dots together????"SynapseXen_ilIliiI[2237059324]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(689120648,1894940911),SynapseXen_IiilillliiIi(2568226093,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-#{2115700443}return SynapseXen_ilIliiI[2237059324]end)())then local SynapseXen_IiIiilIIliIIlliI,SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3170008901]or(function(...)local SynapseXen_IiIil="thats how mafia works"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2173487584,979731546)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(917484272,3377508377)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3170008901]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3944331246,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2416379660,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-#{1158708637,3706367876,213133350,587657866,1394594993,401123642,1691909446,3774809651,2054362753,2279351627}return SynapseXen_ilIliiI[3170008901]end)(1231,11053,{})),SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[3115045441]or(function(...)local SynapseXen_IiIil="this is so sad, alexa play ripull.mp4"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(715340527,2380450302)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(524462746,3770513842)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3115045441]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(154598340,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3320293398,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2372983513,1183266862,2575093247,3410736441,3590593174,1729231221,180773794,2099671796,1585577400,3158733547}return SynapseXen_ilIliiI[3115045441]end)("I",2937),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1706423649]or(function()local SynapseXen_IiIil="hi devforum"SynapseXen_ilIliiI[1706423649]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3937627519,2603036986),SynapseXen_IiilillliiIi(1139670956,SynapseXen_IllIiIili[1]))-string.len(SynapseXen_IiIil)-#{3164114190,2749810695,92834522,3716905054,4286087011,1771126990,1564038248}return SynapseXen_ilIliiI[1706423649]end)())][SynapseXen_IiIiilIIliIIlliI]=SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1350440653]or(function(...)local SynapseXen_IiIil="aspect network better obfuscator"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4280985209,650578632)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1711149431,2583820280)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1350440653]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3559747761,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1131200172,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{42645274,2503431295}return SynapseXen_ilIliiI[1350440653]end)(7011,"lilIiiiI","iiIilii",{},{},"lIIiliiilIIIl",5124))then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[1173778920]or(function()local SynapseXen_IiIil="inb4 posted on exploit reports section"SynapseXen_ilIliiI[1173778920]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3284746826,2057650963),SynapseXen_IiilillliiIi(4156750296,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{4209506215}return SynapseXen_ilIliiI[1173778920]end)(),512)local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[706044938]or(function()local SynapseXen_IiIil="SECURE API, IMPOSSIBLE TO BYPASS!"SynapseXen_ilIliiI[706044938]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2837326691,3869576744),SynapseXen_IiilillliiIi(2109759402,SynapseXen_IllIiIili[1]))-string.len(SynapseXen_IiIil)-#{4163246970,1113348721,3219566586,393120346}return SynapseXen_ilIliiI[706044938]end)(),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3941485244]or(function()local SynapseXen_IiIil="double-header fair! this rationalization has a overenthusiastically anticheat! you will get nonpermissible for exploiting!"SynapseXen_ilIliiI[3941485244]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1902707638,3629916122),SynapseXen_IiilillliiIi(2605467173,SynapseXen_IllIiIili[1]))-string.len(SynapseXen_IiIil)-#{1214588667,3136978118,692158314,4151072178,977135190,3750361546,596744374,4251872909,369275992}return SynapseXen_ilIliiI[3941485244]end)())]=SynapseXen_IiIiilIIliIIlliI/SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1651289912]or(function()local SynapseXen_IiIil="xen best rerubi paste"SynapseXen_ilIliiI[1651289912]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3559831008,79599079),SynapseXen_IiilillliiIi(2654855873,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3131123318,689369725,415809644,3344199838,1377412525}return SynapseXen_ilIliiI[1651289912]end)())then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[4165488546]or(function(...)local SynapseXen_IiIil="sometimes it be like that"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3848686573,2729341668)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1455454090,2839502347)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4165488546]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2137784231,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4166416432,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{822315204,1824313775,2568657826,3868013286,3581439433,2670323724}return SynapseXen_ilIliiI[4165488546]end)({},6441))]=not SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2407227799]or(function(...)local SynapseXen_IiIil="xen detects custom getfenv"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1693665372,3569202504)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(345999097,3948964147)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2407227799]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1056613674,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1161164457,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{1315998025,2313707644}return SynapseXen_ilIliiI[2407227799]end)(11820,"III",1012,"IiiIiiIIiiIlIIIiIil","IIiIillIIiiII","illIlIIiIlIIillli",1510,10715),512),SynapseXen_iIIlIiiIiiiIIIi)]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[3435828327]or(function(...)local SynapseXen_IiIil="now with shitty xor string obfuscation"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(650874477,2002969591)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2044443333,2250489865)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3435828327]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(281276930,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(264721401,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1050051155,2917636328,1484511634,2427988989,2625832876}return SynapseXen_ilIliiI[3435828327]end)({},14700,11205,"iIIllliIil",1656,"IIiIiIiIIliiilli",10562,306))then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[4080326789]or(function(...)local SynapseXen_IiIil="can we have an f in chat for ripull"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1538702067,2257088128)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1708059061,2586940403)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4080326789]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1628266068,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3617660070,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{2012208184,2302520333,1167333205,2692622145,520468326,1210355783,2608559832,497975893,2952758983}return SynapseXen_ilIliiI[4080326789]end)(8408))]={}elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2846921207]or(function(...)local SynapseXen_IiIil="my way to go against expwoiting is to have safety measuwes. i 1 wocawscwipt and onwy moduwes. hewe's how it wowks: this scwipt bewow stowes the moduwes in a tabwe fow each moduwe we send the wist with the moduwes and moduwe infowmation and use inyit a function in my moduwe that wiww stowe the info and aftew it has send to aww the moduwes it wiww dewete them. so whenyevew the cwient twies to hack they cant get the moduwes. onwy this peace of wocawscwipt."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2919502725,2212994079)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1106185208,3188784240)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2846921207]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(494536292,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2117336998,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2203197827,3444921354,3311791272}return SynapseXen_ilIliiI[2846921207]end)(792,{},{},"ii",{},{}))then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3721827834]or(function()local SynapseXen_IiIil="https://twitter.com/Ripull_RBLX/status/1059334518581145603"SynapseXen_ilIliiI[3721827834]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(18917392,3242122499),SynapseXen_IiilillliiIi(195197787,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{2256087892,3506819182,3980244327,2962768283,2773627450,438080310,48709041,488076123,3578461152}return SynapseXen_ilIliiI[3721827834]end)(),256),SynapseXen_iIIlIiiIiiiIIIi)]=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[1433741196]or(function(...)local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(910094605,270771872)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4217612763,77373171)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1433741196]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3045745990,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3711652449,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{4078911314,3967836592,3168050681}return SynapseXen_ilIliiI[1433741196]end)({}),512)~=0;if SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[4087240006]or(function(...)local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(687751856,2178731452)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1411011856,2883925452)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4087240006]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1483716376,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(986526131,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{2282971191,331397578,1449769597,400663913,3145137010}return SynapseXen_ilIliiI[4087240006]end)({},{},7997,"ilIIiiIiIIi","lIIllIIlIlli",3210,"iliIliilliiIli",5387))~=0 then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2631474025]or(function(...)local SynapseXen_IiIil="xen best rerubi paste"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2619714012,331464307)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3717260571,577696518)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2631474025]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1770625461,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(769871141,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{3024368584}return SynapseXen_ilIliiI[2631474025]end)(8601,"IIlIliIlIiIll",{},13450,{}))then SynapseXen_lIiil[SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2879206373]or(function(...)local SynapseXen_IiIil="thats how mafia works"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(98563758,2484327930)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2651399016,1643599785)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2879206373]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2189352871,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(416530393,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{2050813996,1617382568,2587344509,2856225852,3485663209}return SynapseXen_ilIliiI[2879206373]end)({},"iIllllllIIIiilIIIii","IilillIiii","iiIiiIllilliiIiIII",13028,6419,{},"liiIllIl",8936,"Iilii"),256)]=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[3753678344]or(function()local SynapseXen_IiIil="epic gamer vision"SynapseXen_ilIliiI[3753678344]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4119231213,3565575909),SynapseXen_IiilillliiIi(1873677490,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2479759445,1090288907,3960333150,3117984197,1431705654,1010956430}return SynapseXen_ilIliiI[3753678344]end)(),262144)]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1914696449]or(function(...)local SynapseXen_IiIil="skisploit is the superior obfuscator, clearly."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3774024766,2644373349)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2752365131,1542568473)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1914696449]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(201873211,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1070169549,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2020212221,3471284216,1840209851,453429031,2622055414,115572401,1720639688,1324718988,574728788}return SynapseXen_ilIliiI[1914696449]end)(13434,4437,"IlIIi"))then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2830735147]or(function(...)local SynapseXen_IiIil="wally bad bird"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(752920657,4211458750)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1183270831,3111723259)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2830735147]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2711940045,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1768875552,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{3729789756,1715957769,331847418,2329479155,947176838,2938409216,3517286981}return SynapseXen_ilIliiI[2830735147]end)({},"iiiIIl",855,12557,140,5399)),SynapseXen_iIIlIiiIiiiIIIi,256)local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3115411478]or(function(...)local SynapseXen_IiIil="wait for someone on devforum to say they are gonna deobfuscate this"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(458972678,2310140010)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1979076591,2315861697)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3115411478]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2376303227,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1373986505,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{706675280,366896630,69308444,2582863214}return SynapseXen_ilIliiI[3115411478]end)({},2725,"IiiiiilI","IiillIiI",10301,{}))local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[555456121]or(function(...)local SynapseXen_IiIil="this is a christian obfuscator, no cursing allowed in our scripts"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2815937657,2543132550)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1891806609,2403127800)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[555456121]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2880008175,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2425071493,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{26726980,564328576,2342687718,2837112661,2174410786,240120290,3989245949,4290257308}return SynapseXen_ilIliiI[555456121]end)({},"lIllliIIIIl",2645,1624,"iiIIIII",2914,{},5855,"i"))local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_llIlillliIl==0 then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1;SynapseXen_llIlillliIl=SynapseXen_lilllillilllIilIIlII[SynapseXen_lIIIllIiiIIlil][497366273]end;local SynapseXen_liIIIIliiliIlli=(SynapseXen_llIlillliIl-1)*50;local SynapseXen_lIliIIlIliiiiIlIIiI=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]if SynapseXen_IiIiilIIliIIlliI==0 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_llllIilliIllilII-SynapseXen_liIilIlIllIill end;for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IiIiilIIliIIlliI do SynapseXen_lIliIIlIliiiiIlIIiI[SynapseXen_liIIIIliiliIlli+SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+SynapseXen_IiliiliIiiIiiIliIlI]end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1026413100]or(function()local SynapseXen_IiIil="yed"SynapseXen_ilIliiI[1026413100]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3201734437,2831891271),SynapseXen_IiilillliiIi(1488104916,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3008286309}return SynapseXen_ilIliiI[1026413100]end)())then if not not SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[923345909]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3598859230,4259167189)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1455391847,2839562505)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[923345909]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3372070810,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(673173638,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{3981098601,3992153047}return SynapseXen_ilIliiI[923345909]end)(4785,"IllIilillliIIIilll",1793,{},6718,"IliIIiiilliIl","lllilillIilIi"))]==(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[4250621570]or(function(...)local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3247539555,3337403881)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3645404903,649543147)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4250621570]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2177307283,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1179552944,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{848292151}return SynapseXen_ilIliiI[4250621570]end)("IIiIlliiliilIilili",3311,{},"iIlIiiIliiIIliiil","IIIIiIIliIII","IIlliiIiliilili"))==0)then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[808620375]or(function()local SynapseXen_IiIil="this is so sad, alexa play ripull.mp4"SynapseXen_ilIliiI[808620375]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3063239576,3828791121),SynapseXen_IiilillliiIi(470708146,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{4035742472}return SynapseXen_ilIliiI[808620375]end)())then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[4208720214]or(function()local SynapseXen_IiIil="now comes with a free n word pass"SynapseXen_ilIliiI[4208720214]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4079861434,4266380639),SynapseXen_IiilillliiIi(1137509206,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{394703420,1341354965,1839321665}return SynapseXen_ilIliiI[4208720214]end)())local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[3518684689]or(function(...)local SynapseXen_IiIil="hi xen crashes on my axon paste plz help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(412402345,4086250547)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3025661196,1269291204)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3518684689]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2893208071,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(163735585,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1082011814,1479261304,1363008302,3308347485}return SynapseXen_ilIliiI[3518684689]end)(12849,{},"il")),SynapseXen_iIIlIiiIiiiIIIi)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1281449554]or(function(...)local SynapseXen_IiIil="double-header fair! this rationalization has a overenthusiastically anticheat! you will get nonpermissible for exploiting!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2888080667,2487504667)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4027422243,267552777)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1281449554]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3363254744,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3199919172,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{392754641,978595395}return SynapseXen_ilIliiI[1281449554]end)({},"llil",574),256)]=SynapseXen_IiIiilIIliIIlliI%SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1263084176]or(function()local SynapseXen_IiIil="luraph better then xen bros :pensive:"SynapseXen_ilIliiI[1263084176]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4012587902,3973125920),SynapseXen_IiilillliiIi(1297147803,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{896654394,2958285801}return SynapseXen_ilIliiI[1263084176]end)())then SynapseXen_llIll[SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[3001754018]or(function(...)local SynapseXen_IiIil="this is a christian obfuscator, no cursing allowed in our scripts"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3027799586,2463801897)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(463152440,3831848750)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3001754018]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2812992511,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2105636456,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2434519076,409387027,4073637875,1965720633,367973857,851385830,231790975,1261723355}return SynapseXen_ilIliiI[3001754018]end)(6478,{},{},{},{},10119),262144)]]=SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1781557157]or(function(...)local SynapseXen_IiIil="epic gamer vision"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1843790589,366030794)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2094898256,2200033088)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1781557157]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4189702654,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3927928800,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{4218340160,770178898,742965055,1738579396,1097249765,1152957718,1850838369,1787730911}return SynapseXen_ilIliiI[1781557157]end)(11990,"iilliiIIlll",8178,"i","iiiiIliii"),256)]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1029053244]or(function()local SynapseXen_IiIil="wow xen is shit buy luraph ok"SynapseXen_ilIliiI[1029053244]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1214384365,3990744572),SynapseXen_IiilillliiIi(3949756343,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{978059057,2371296117,2788707800,3947324985}return SynapseXen_ilIliiI[1029053244]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[560709554]or(function(...)local SynapseXen_IiIil="https://twitter.com/Ripull_RBLX/status/1059334518581145603"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2892654764,74038987)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3807386305,487590689)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[560709554]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(166979830,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4016008845,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{841369674,1876612051,3232204083,3470367259,1451400866,3503796712,1568960560,4151849018}return SynapseXen_ilIliiI[560709554]end)("iiIlI",9371,691,{}),256),SynapseXen_iIIlIiiIiiiIIIi,256)local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_ililIillilIlIIl=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2]local SynapseXen_iIIIillIiilIII=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]+SynapseXen_ililIillilIlIIl;SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]=SynapseXen_iIIIillIiilIII;if SynapseXen_ililIillilIlIIl>0 then if SynapseXen_iIIIillIiilIII<=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1]then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+SynapseXen_illIIilIiIIiIIill[990094981]SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+3]=SynapseXen_iIIIillIiilIII end else if SynapseXen_iIIIillIiilIII>=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1]then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+SynapseXen_illIIilIiIIiIIill[990094981]SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+3]=SynapseXen_iIIIillIiilIII end end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2138682552]or(function()local SynapseXen_IiIil="level 1 crook = luraph, level 100 boss = xen"SynapseXen_ilIliiI[2138682552]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3464425599,343256905),SynapseXen_IiilillliiIi(2493982468,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3136280341,3450533347,787394915,1787458951,1351475724}return SynapseXen_ilIliiI[2138682552]end)())then SynapseXen_iIIlIiiIiiiIIIi=SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2713552582]or(function()local SynapseXen_IiIil="aspect network better obfuscator"SynapseXen_ilIliiI[2713552582]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(37605271,3594474344),SynapseXen_IiilillliiIi(3408804370,SynapseXen_IllIiIili[4]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{212271772,4281564244,2643598803,3654535745}return SynapseXen_ilIliiI[2713552582]end)())]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2924959654]or(function(...)local SynapseXen_IiIil="now with shitty xor string obfuscation"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2003639156,622303559)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1680571385,2614380622)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2924959654]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1157921825,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1507116207,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{766872925,1683654588,1414827462,2486445318,82994825,59632018,1578520714,3377637193,2099171958}return SynapseXen_ilIliiI[2924959654]end)("lIIIIIIlIiIIiiiIiI","Ill",{},{},8386,"ili"))then if SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[1379606661]or(function(...)local SynapseXen_IiIil="sometimes it be like that"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2490554886,1997900129)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2092101808,2202850869)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1379606661]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(336891056,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(931850146,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{291839689,3069105609,3631238555,576199974,3643598414,583600238,1938694880,1910902293}return SynapseXen_ilIliiI[1379606661]end)({},"IIllilliliIlllIilll",{},{},{},1260,"IIiililIliiiIIiiI"))==(SynapseXen_ilIliiI[156434360]or(function(...)local SynapseXen_IiIil="baby i just fell for uwu,,,,,, i wanna be with uwu!11!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3880399858,3027393567)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(984208895,3310730237)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[156434360]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(180895544,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(392115772,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2677713965,3933903096,1511390159,2440670580,1740817051,3697363084}return SynapseXen_ilIliiI[156434360]end)({},3431))then SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[798189332]or(function(...)local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2508730027,2526831873)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1819543490,2475458989)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[798189332]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3553314847,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2658947750,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{3925314502,986257612,2398469987,2743061215,2488289256,3674404554,3924875339,2432944787,3429124189}return SynapseXen_ilIliiI[798189332]end)({},{},"IIIIlIiIiiIlI",{},"llIlilI","lIIIliliiillII","l","IiIlI"),256),SynapseXen_iIIlIiiIiiiIIIi,256)]=SynapseXen_IiIilliilIIl else SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[798189332]or(function(...)local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2508730027,2526831873)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1819543490,2475458989)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[798189332]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3553314847,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2658947750,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{3925314502,986257612,2398469987,2743061215,2488289256,3674404554,3924875339,2432944787,3429124189}return SynapseXen_ilIliiI[798189332]end)({},{},"IIIIlIiIiiIlI",{},"llIlilI","lIIIliliiillII","l","IiIlI"),256),SynapseXen_iIIlIiiIiiiIIIi,256)]=SynapseXen_IllIiIili[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[1379606661]or(function(...)local SynapseXen_IiIil="sometimes it be like that"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2490554886,1997900129)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2092101808,2202850869)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1379606661]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(336891056,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(931850146,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{291839689,3069105609,3631238555,576199974,3643598414,583600238,1938694880,1910902293}return SynapseXen_ilIliiI[1379606661]end)({},"IIllilliliIlllIilll",{},{},{},1260,"IIiililIliiiIIiiI"))]end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1486760293]or(function()local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"SynapseXen_ilIliiI[1486760293]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1388459681,809882014),SynapseXen_IiilillliiIi(740587700,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1847476725,3452634997}return SynapseXen_ilIliiI[1486760293]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2236641028]or(function()local SynapseXen_IiIil="HELP ME PEOPLE ARE CRASHING MY GAME PLZ HELP"SynapseXen_ilIliiI[2236641028]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1504140756,134637720),SynapseXen_IiilillliiIi(1675310788,SynapseXen_IllIiIili[1]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{436757378,734741550,4266216878,2634692168,3841292674,3690322239,32459227,3563206487,1170938818,4274100153}return SynapseXen_ilIliiI[2236641028]end)())local SynapseXen_IiIiilIIliIIlliI=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[4043373179]or(function()local SynapseXen_IiIil="https://twitter.com/Ripull_RBLX/status/1059334518581145603"SynapseXen_ilIliiI[4043373179]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3679614117,3198850719),SynapseXen_IiilillliiIi(241852662,SynapseXen_IllIiIili[2]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2122106213,4086855746,2181138406,196292655,617129979}return SynapseXen_ilIliiI[4043373179]end)(),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_iiiillil,SynapseXen_iiIlIIi;local SynapseXen_iIIIIlliilIIiIl;if SynapseXen_IiIiilIIliIIlliI==1 then return elseif SynapseXen_IiIiilIIliIIlliI==0 then SynapseXen_iIIIIlliilIIiIl=SynapseXen_llllIilliIllilII else SynapseXen_iIIIIlliilIIiIl=SynapseXen_liIilIlIllIill+SynapseXen_IiIiilIIliIIlliI-2 end;SynapseXen_iiIlIIi={}SynapseXen_iiiillil=0;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_liIilIlIllIill,SynapseXen_iIIIIlliilIIiIl do SynapseXen_iiiillil=SynapseXen_iiiillil+1;SynapseXen_iiIlIIi[SynapseXen_iiiillil]=SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]end;return SynapseXen_iiIlIIi,SynapseXen_iiiillil elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1276919324]or(function()local SynapseXen_IiIil="pain is gonna use the backspace method on xen"SynapseXen_ilIliiI[1276919324]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1920922950,1702935224),SynapseXen_IiilillliiIi(1454161955,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1561301518,2768485873}return SynapseXen_ilIliiI[1276919324]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3175492539]or(function()local SynapseXen_IiIil="now comes with a free n word pass"SynapseXen_ilIliiI[3175492539]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2517521152,3920280334),SynapseXen_IiilillliiIi(4218970855,SynapseXen_IllIiIili[5]))-string.len(SynapseXen_IiIil)-#{437691817,4293583718,4292206156}return SynapseXen_ilIliiI[3175492539]end)(),256),SynapseXen_iIIlIiiIiiiIIIi,256)local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[2876908709]or(function()local SynapseXen_IiIil="what are you trying to say? that fucking one dot + dot + dot + many dots is not adding adding 1 dot + dot and then adding all the dots together????"SynapseXen_ilIliiI[2876908709]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2149057689,751918448),SynapseXen_IiilillliiIi(672881608,SynapseXen_IllIiIili[5]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{594312685,3437029541,3317670677,1830656325,939329990,3334494637}return SynapseXen_ilIliiI[2876908709]end)())local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_liIIIIliiliIlli=SynapseXen_liIilIlIllIill+2;local SynapseXen_illiIliiIlliiIi={SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill](SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1],SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2])}for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_llIlillliIl do SynapseXen_lIiil[SynapseXen_liIIIIliiliIlli+SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_illiIliiIlliiIi[SynapseXen_IiliiliIiiIiiIliIlI]end;if SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+3]~=nil then SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2]=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+3]else SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[835993762]or(function(...)local SynapseXen_IiIil="sometimes it be like that"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4231917170,2372567472)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2201001842,2093986065)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[835993762]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1410521845,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(979962808,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{4281670552,2926805203,3637367889,1375068978,4029240021,904434920,2357882320,4258610915,2948268927}return SynapseXen_ilIliiI[835993762]end)({},"ilililiIllIl","IlII",{},{},"IlilIiIiIIiIlll"))then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2210513916]or(function(...)local SynapseXen_IiIil="i put more time into this shitty list of dead memes then i did into the obfuscator itself"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1234372228,2378011985)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(196445911,4098516207)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2210513916]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(236886195,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2223203903,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2216239854,2810762166,2795740392,610247001,3393086092,2988857518,3302636263,2592376282,2742555011,2562799472}return SynapseXen_ilIliiI[2210513916]end)({},10312,8494,"iII",{},{},10185,{},{},{}))]=SynapseXen_lIiiIIlIlIllIIiIil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2351199665]or(function(...)local SynapseXen_IiIil="epic gamer vision"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(482761171,1685268468)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(832496047,3462450285)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2351199665]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4054207262,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3351027909,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{1394626256,3907004110,1698807178,3682305093,905016197,347770680,1593690964,437084549}return SynapseXen_ilIliiI[2351199665]end)({},"llliIIiliIIIll",1501))]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1092482587]or(function()local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"SynapseXen_ilIliiI[1092482587]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3819504874,1036431896),SynapseXen_IiilillliiIi(585532782,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-#{4016805713,3251458695,1718552861,4029301043}return SynapseXen_ilIliiI[1092482587]end)())then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3645746472]or(function()local SynapseXen_IiIil="SECURE API, IMPOSSIBLE TO BYPASS!"SynapseXen_ilIliiI[3645746472]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4136243142,1547721471),SynapseXen_IiilillliiIi(3243955430,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{1053612921,1658471233,3967903466,3742042617,2663546440,2813221150,1064168741}return SynapseXen_ilIliiI[3645746472]end)())local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[1922428200]or(function()local SynapseXen_IiIil="xen detects custom getfenv"SynapseXen_ilIliiI[1922428200]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1862332219,2898851864),SynapseXen_IiilillliiIi(2372307312,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2142611850,222068852,3254809263,2932479521,3807970829,2595633385,1814804066,2785318994,3677612767,3841510777}return SynapseXen_ilIliiI[1922428200]end)())local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1117560265]or(function()local SynapseXen_IiIil="aspect network better obfuscator"SynapseXen_ilIliiI[1117560265]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3787465873,1033424969),SynapseXen_IiilillliiIi(2458627195,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{1203163224}return SynapseXen_ilIliiI[1117560265]end)())]=SynapseXen_IiIiilIIliIIlliI-SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2208683109]or(function(...)local SynapseXen_IiIil="now with shitty xor string obfuscation"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3988036366,1111116459)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1622627659,2672306764)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2208683109]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3123087866,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(516437206,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{1570021632,3353658291}return SynapseXen_ilIliiI[2208683109]end)({},"IliIiIlIIilIill","iiIIiIilIIiiIlliII"))then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[118623159]or(function()local SynapseXen_IiIil="hi devforum"SynapseXen_ilIliiI[118623159]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1829524025,3707937936),SynapseXen_IiilillliiIi(3144577299,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{2833932521,2559729115,4264138448,1988487055,2685534555}return SynapseXen_ilIliiI[118623159]end)(),256),SynapseXen_iIIlIiiIiiiIIIi,256)local SynapseXen_IiIiilIIliIIlliI=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2087810076]or(function()local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"SynapseXen_ilIliiI[2087810076]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3835746994,280963782),SynapseXen_IiilillliiIi(3129772348,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2835817102,3429683721,1752391297,2054752680,2858658666,3187615627}return SynapseXen_ilIliiI[2087810076]end)(),512)local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[3651263893]or(function()local SynapseXen_IiIil="skisploit is the superior obfuscator, clearly."SynapseXen_ilIliiI[3651263893]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(321554525,506766008),SynapseXen_IiilillliiIi(2311241918,SynapseXen_IllIiIili[5]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2402669909,831424396,2368653445}return SynapseXen_ilIliiI[3651263893]end)(),512),SynapseXen_iIIlIiiIiiiIIIi)local SynapseXen_llIlIliI=SynapseXen_lIiil;SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1]=SynapseXen_IiIiilIIliIIlliI;SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]=SynapseXen_IiIiilIIliIIlliI[SynapseXen_llIlillliIl]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[909502538]or(function(...)local SynapseXen_IiIil="level 1 crook = luraph, level 100 boss = xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(206756707,668304607)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4059834447,235154568)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[909502538]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3477488969,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2858557730,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{529212772,435197907,1627621275,860278574,2677555201,4166162242,2955639682,715260586,2182849272}return SynapseXen_ilIliiI[909502538]end)({},{},{},13264,779,{},"IIlIIiil"))then local SynapseXen_liIilIlIllIill=SynapseXen_IlIIlIIilIililIlll(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3462413442]or(function()local SynapseXen_IiIil="aspect network better obfuscator"SynapseXen_ilIliiI[3462413442]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1355262870,3202459030),SynapseXen_IiilillliiIi(2693523338,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3684022900,4277269728,1907037327,204417969,3377068914,2151771293,2015136337}return SynapseXen_ilIliiI[3462413442]end)()),SynapseXen_iIIlIiiIiiiIIIi,256)~=0;local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2993248598]or(function()local SynapseXen_IiIil="imagine using some lua minifier tool and thinking you are a badass"SynapseXen_ilIliiI[2993248598]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2217046237,18266089),SynapseXen_IiilillliiIi(2585666657,SynapseXen_IllIiIili[4]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3629603154,117776414,1686962502,2169930113}return SynapseXen_ilIliiI[2993248598]end)())local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[2520794980]or(function()local SynapseXen_IiIil="SECURE API, IMPOSSIBLE TO BYPASS!"SynapseXen_ilIliiI[2520794980]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3245165577,205377675),SynapseXen_IiilillliiIi(836495133,SynapseXen_IllIiIili[8]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{4205070524,3934037032,2464735355,2965801190}return SynapseXen_ilIliiI[2520794980]end)(),512),SynapseXen_iIIlIiiIiiiIIIi,512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;if SynapseXen_IiIiilIIliIIlliI==SynapseXen_llIlillliIl~=SynapseXen_liIilIlIllIill then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2085303014]or(function()local SynapseXen_IiIil="i put more time into this shitty list of dead memes then i did into the obfuscator itself"SynapseXen_ilIliiI[2085303014]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2040348230,1844605105),SynapseXen_IiilillliiIi(2427661791,SynapseXen_IllIiIili[5]))-string.len(SynapseXen_IiIil)-#{757961985,2495948508,2582476730,1781674083,2939722404,2092690449,3743360362,1655761860}return SynapseXen_ilIliiI[2085303014]end)())then SynapseXen_lIiil[SynapseXen_IlIIlIIilIililIlll(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1467024513]or(function()local SynapseXen_IiIil="wait for someone on devforum to say they are gonna deobfuscate this"SynapseXen_ilIliiI[1467024513]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(28916711,3925111160),SynapseXen_IiilillliiIi(348428103,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-#{3322173644,1930050513,3770000001,3321895535,1149127320,2727537049,3803428133,1705374348}return SynapseXen_ilIliiI[1467024513]end)(),256),SynapseXen_iIIlIiiIiiiIIIi,256)]=-SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2779791701]or(function(...)local SynapseXen_IiIil="xen doesn't come with instance caching, sorry superskater"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3167768857,1003923849)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(476966262,3817991317)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2779791701]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2361815456,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(351126667,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{1722922364,259058570,1474852443,673943308,2630821809,2802985296}return SynapseXen_ilIliiI[2779791701]end)(13757,"lli",{},379),512),SynapseXen_iIIlIiiIiiiIIIi)]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1992998012]or(function()local SynapseXen_IiIil="thats how mafia works"SynapseXen_ilIliiI[1992998012]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3387898916,2977039159),SynapseXen_IiilillliiIi(4232098203,SynapseXen_IllIiIili[5]))-string.len(SynapseXen_IiIil)-#{4284465147,3926733402,1679708434,1118953742,1864518221,2753336235}return SynapseXen_ilIliiI[1992998012]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[136625757]or(function()local SynapseXen_IiIil="i'm intercommunication about the most nonecclesiastical dll exploits for esp. they only characterization objects with a antepatriarchal in the geistesgeschichte for the esp."SynapseXen_ilIliiI[136625757]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2747180887,3993623108),SynapseXen_IiilillliiIi(3379100762,SynapseXen_IllIiIili[5]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2704155339,4182419488,2414213036,1634762891,3363619457,1179684734}return SynapseXen_ilIliiI[136625757]end)(),256)local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[683267537]or(function(...)local SynapseXen_IiIil="hi xen crashes on my axon paste plz help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2515736983,1946408745)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(963605210,3331347726)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[683267537]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3599978363,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2043176867,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{4068226119,956622155,4074348748,1222314837,1610964603,660078373,2539482945}return SynapseXen_ilIliiI[683267537]end)(2309,"iIlIliliilillIlIiI","illiill",{},{},{})),SynapseXen_iIIlIiiIiiiIIIi)local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[3118711944]or(function()local SynapseXen_IiIil="yed"SynapseXen_ilIliiI[3118711944]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2567943667,2084060440),SynapseXen_IiilillliiIi(2878638677,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2894578840,50745850,2679229622,1940174163,3618363976,2995210156}return SynapseXen_ilIliiI[3118711944]end)())local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_illlIillllii,SynapseXen_lliiiiiIIiIliIIll;local SynapseXen_iIIIIlliilIIiIl,SynapseXen_iiiillil;SynapseXen_illlIillllii={}if SynapseXen_IiIiilIIliIIlliI~=1 then if SynapseXen_IiIiilIIliIIlliI~=0 then SynapseXen_iIIIIlliilIIiIl=SynapseXen_liIilIlIllIill+SynapseXen_IiIiilIIliIIlliI-1 else SynapseXen_iIIIIlliilIIiIl=SynapseXen_llllIilliIllilII end;SynapseXen_iiiillil=0;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_liIilIlIllIill+1,SynapseXen_iIIIIlliilIIiIl do SynapseXen_iiiillil=SynapseXen_iiiillil+1;SynapseXen_illlIillllii[SynapseXen_iiiillil]=SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]end;SynapseXen_iIIIIlliilIIiIl,SynapseXen_lliiiiiIIiIliIIll=SynapseXen_iIlliII(SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill](unpack(SynapseXen_illlIillllii,1,SynapseXen_iIIIIlliilIIiIl-SynapseXen_liIilIlIllIill)))else SynapseXen_iIIIIlliilIIiIl,SynapseXen_lliiiiiIIiIliIIll=SynapseXen_iIlliII(SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]())end;SynapseXen_llllIilliIllilII=SynapseXen_liIilIlIllIill-1;if SynapseXen_llIlillliIl~=1 then if SynapseXen_llIlillliIl~=0 then SynapseXen_iIIIIlliilIIiIl=SynapseXen_liIilIlIllIill+SynapseXen_llIlillliIl-2 else SynapseXen_iIIIIlliilIIiIl=SynapseXen_iIIIIlliilIIiIl+SynapseXen_liIilIlIllIill-1 end;SynapseXen_iiiillil=0;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_liIilIlIllIill,SynapseXen_iIIIIlliilIIiIl do SynapseXen_iiiillil=SynapseXen_iiiillil+1;SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_lliiiiiIIiIliIIll[SynapseXen_iiiillil]end end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[314140130]or(function()local SynapseXen_IiIil="sometimes it be like that"SynapseXen_ilIliiI[314140130]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4153317715,2180032601),SynapseXen_IiilillliiIi(953403584,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1327970293,3369889839,1561081892,3977584660,3039870057,3721932429,3616367066,1588568559,3347480265,637269718}return SynapseXen_ilIliiI[314140130]end)())then local SynapseXen_IIiIIll=SynapseXen_IlililIiiIllI[SynapseXen_IiilillliiIi(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[1728557490]or(function(...)local SynapseXen_IiIil="wow xen is shit buy luraph ok"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(229200797,1580028453)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4241052549,53888557)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1728557490]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(831948047,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1769041325,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{1218127556,3990265972,2127276420,447025134}return SynapseXen_ilIliiI[1728557490]end)({},{},"IliIiiiilIiiIll","lliIIIlii"),262144),SynapseXen_iIIlIiiIiiiIIIi)]local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_lllIIIIIllilii;local SynapseXen_liiIllIiii;if SynapseXen_IIiIIll[2071787167]~=0 then SynapseXen_lllIIIIIllilii={}SynapseXen_liiIllIiii=setmetatable({},{__index=function(SynapseXen_IllliIiIIiiilIIlIIII,SynapseXen_lIIIlIIillliiI)local SynapseXen_ilIIllIIil=SynapseXen_lllIIIIIllilii[SynapseXen_lIIIlIIillliiI]return SynapseXen_ilIIllIIil[1][SynapseXen_ilIIllIIil[2]]end,__newindex=function(SynapseXen_IllliIiIIiiilIIlIIII,SynapseXen_lIIIlIIillliiI,SynapseXen_IllIilil)local SynapseXen_ilIIllIIil=SynapseXen_lllIIIIIllilii[SynapseXen_lIIIlIIillliiI]SynapseXen_ilIIllIIil[1][SynapseXen_ilIIllIIil[2]]=SynapseXen_IllIilil end})for SynapseXen_IiliiliIiiIiiIliIlI=1,SynapseXen_IIiIIll[2071787167]do local SynapseXen_lIlIlIlliliiIIlilII=SynapseXen_lilllillilllIilIIlII[SynapseXen_lIIIllIiiIIlil]if SynapseXen_lIlIlIlliliiIIlilII[2075702005]==(SynapseXen_ilIliiI[242770424]or(function(...)local SynapseXen_IiIil="inb4 posted on exploit reports section"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3152083060,1220192731)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1205154328,3089845234)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[242770424]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(924037804,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2330202424,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3789866299,3099052344,1241213637,3151307905,4028784340,2959950049,2153743769,2424504204,2129821080,145902181}return SynapseXen_ilIliiI[242770424]end)(1070,12134,{},7853,10900))then SynapseXen_lllIIIIIllilii[SynapseXen_IiliiliIiiIiiIliIlI-1]={SynapseXen_llIlIliI,SynapseXen_IiilillliiIi(SynapseXen_lIlIlIlliliiIIlilII[1402414475],SynapseXen_ilIliiI[3456403767]or(function(...)local SynapseXen_IiIil="HELP ME PEOPLE ARE CRASHING MY GAME PLZ HELP"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1879467461,2975477903)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4029074198,265865692)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3456403767]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1319692127,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3243817728,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3754604157,1991979527,424502095,16032676,3150318146,3051556100,2437036156}return SynapseXen_ilIliiI[3456403767]end)({},{}))}elseif SynapseXen_lIlIlIlliliiIIlilII[2075702005]==(SynapseXen_ilIliiI[3869754981]or(function()local SynapseXen_IiIil="what are you trying to say? that fucking one dot + dot + dot + many dots is not adding adding 1 dot + dot and then adding all the dots together????"SynapseXen_ilIliiI[3869754981]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3950091599,3952497152),SynapseXen_IiilillliiIi(1803251471,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{3504261387,2959869730,1081625974,2363452620,2226963469,4276616594,879292666}return SynapseXen_ilIliiI[3869754981]end)())then SynapseXen_lllIIIIIllilii[SynapseXen_IiliiliIiiIiiIliIlI-1]={SynapseXen_lIiiIIlIlIllIIiIil,SynapseXen_IiilillliiIi(SynapseXen_lIlIlIlliliiIIlilII[1402414475],SynapseXen_ilIliiI[344199069]or(function(...)local SynapseXen_IiIil="hi devforum"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3615352966,1460889529)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3926523022,368429676)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[344199069]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2063091651,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3023725269,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{964050059,2677284145}return SynapseXen_ilIliiI[344199069]end)({},1985,1536,"IiIIIlIll"))}end;SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end;SynapseXen_lIiIlIliillllIi[#SynapseXen_lIiIlIliillllIi+1]=SynapseXen_lllIIIIIllilii end;SynapseXen_llIlIliI[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[4274845403]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1364070847,3766197869)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2767565870,1527426330)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4274845403]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(252494540,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4036363878,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2351706339,1088107863,3048621917,861046299,451657701,95269082,920960683}return SynapseXen_ilIliiI[4274845403]end)(4812,"iIiIIiIIlIiIlIIi",{},{},7326),256)]=SynapseXen_liilIIiiiIiIlii(SynapseXen_IIiIIll,SynapseXen_llIll,SynapseXen_liiIllIiii)elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1258748049]or(function()local SynapseXen_IiIil="baby i just fell for uwu,,,,,, i wanna be with uwu!11!!"SynapseXen_ilIliiI[1258748049]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3771656275,868317789),SynapseXen_IiilillliiIi(2644708013,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{874770262,630945288,926766837}return SynapseXen_ilIliiI[1258748049]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1240962675]or(function()local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"SynapseXen_ilIliiI[1240962675]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(524606692,531647477),SynapseXen_IiilillliiIi(1314417081,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3408412178,2428226156,1226427377,1620421005,3006260537,1379317871}return SynapseXen_ilIliiI[1240962675]end)(),256)local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2215242418]or(function(...)local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(689630929,1831401016)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1653421152,2641572109)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2215242418]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3621368816,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1483221852,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2833581110,835811667,2936035900,3886424783}return SynapseXen_ilIliiI[2215242418]end)("IiiIlIIliIllIIIliiI",6745,"iiiillIIl",11881,"lilIlll",3156,14565),512)local SynapseXen_llIlIliI,SynapseXen_illlill=SynapseXen_lIiil,SynapseXen_lIiliiIiIIiIil;SynapseXen_llllIilliIllilII=SynapseXen_liIilIlIllIill-1;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_liIilIlIllIill,SynapseXen_liIilIlIllIill+(SynapseXen_IiIiilIIliIIlliI>0 and SynapseXen_IiIiilIIliIIlliI-1 or SynapseXen_IllIlIIiiliiiliiiIIi)do SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_illlill[SynapseXen_IiliiliIiiIiiIliIlI-SynapseXen_liIilIlIllIill]end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1421581441]or(function(...)local SynapseXen_IiIil="skisploit is the superior obfuscator, clearly."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2468231278,3285657202)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3713118115,581871902)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1421581441]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2715296231,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3216913595,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3418924604,2777479621,1011345559,25257896,3089149317,3372614865,1189472727,111475105}return SynapseXen_ilIliiI[1421581441]end)({}))then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[145728382]or(function(...)local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2547816617,1802350727)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2767116177,1527826004)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[145728382]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2670343509,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(758445263,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{4129767295,453511002,1688287614,3288807208}return SynapseXen_ilIliiI[145728382]end)("lIIl","lIl"),512),SynapseXen_iIIlIiiIiiiIIIi,512)local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[3797111921]or(function(...)local SynapseXen_IiIil="inb4 posted on exploit reports section"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(148156656,3229960469)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2229916716,2065085062)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3797111921]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4007484508,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(770608205,SynapseXen_IllIiIili[7]))-string.len(SynapseXen_IiIil)-#{1577752033,3228661776,3299688265,1233074483,187239739}return SynapseXen_ilIliiI[3797111921]end)({},{},"iIiiilIiiiI",{},13378,9510),512),SynapseXen_iIIlIiiIiiiIIIi,512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[138598409]or(function()local SynapseXen_IiIil="wally bad bird"SynapseXen_ilIliiI[138598409]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1014526374,3244241756),SynapseXen_IiilillliiIi(3479108745,SynapseXen_IllIiIili[1]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3482076099,3832592161,4243666486,214571267,3550366920,2602307704,3036008699}return SynapseXen_ilIliiI[138598409]end)(),256)]=SynapseXen_IiIiilIIliIIlliI^SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[739025635]or(function()local SynapseXen_IiIil="i put more time into this shitty list of dead memes then i did into the obfuscator itself"SynapseXen_ilIliiI[739025635]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(244116939,806139598),SynapseXen_IiilillliiIi(1882115399,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2686588078,3246627365,303923969}return SynapseXen_ilIliiI[739025635]end)())then local SynapseXen_llIlillliIl=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[2676871095]or(function(...)local SynapseXen_IiIil="now with shitty xor string obfuscation"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(279064320,860634981)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1927261518,2367724538)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2676871095]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3630313898,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(117954551,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{4106199927,3359230675,1274171720,69865709}return SynapseXen_ilIliiI[2676871095]end)("llliIliIIiIII",5166,"illiiIllIIiiilllll","i",4077,10131))local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_IiilillliiIi(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[841151208]or(function(...)local SynapseXen_IiIil="can we have an f in chat for ripull"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3061383657,138165512)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1045371552,3249606803)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[841151208]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1527521516,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2396751649,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{1690098691,161887376,3002442838,2508632219,1545019958,1832040743,3368843871,712042256}return SynapseXen_ilIliiI[841151208]end)(8639),256),SynapseXen_iIIlIiiIiiiIIIi)]=SynapseXen_llIlIliI[SynapseXen_IiilillliiIi(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[818298267]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3919754284,667063805)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(478575319,3816381729)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[818298267]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2430073438,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(270199456,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{495606355,1928334139,2774637954,962651513,2406548403,1971082653,3384983764}return SynapseXen_ilIliiI[818298267]end)("iliIIIiIl",{},{},{},{},"IIIiiilliIliiI",{},2798),512),SynapseXen_iIIlIiiIiiiIIIi)][SynapseXen_llIlillliIl]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[3232064960]or(function(...)local SynapseXen_IiIil="epic gamer vision"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4165751601,3342466190)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1233661116,3061328853)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3232064960]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3049582834,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1093891094,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{4122697454,3808544793,3708653228,783978545,3965271356,1249708307}return SynapseXen_ilIliiI[3232064960]end)("iIiIlilIIiliII",4538,10360,"IIiIi",8448,{},{},"lI",5529,{}))then local SynapseXen_liIilIlIllIill=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2142125624]or(function()local SynapseXen_IiIil="double-header fair! this rationalization has a overenthusiastically anticheat! you will get nonpermissible for exploiting!"SynapseXen_ilIliiI[2142125624]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(299221591,1828295674),SynapseXen_IiilillliiIi(2175105090,SynapseXen_IllIiIili[8]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{343536414,3161639171,711079424,638101085,2251172812,1659445021,1814629755,4110822512,1918001416,959366881}return SynapseXen_ilIliiI[2142125624]end)())local SynapseXen_IlliilIIli={}for SynapseXen_IiliiliIiiIiiIliIlI=1,#SynapseXen_lIiIlIliillllIi do local SynapseXen_lliiliI=SynapseXen_lIiIlIliillllIi[SynapseXen_IiliiliIiiIiiIliIlI]for SynapseXen_lIiIIIIlllIilI=0,#SynapseXen_lliiliI do local SynapseXen_iIliIIIlIliillliii=SynapseXen_lliiliI[SynapseXen_lIiIIIIlllIilI]local SynapseXen_llIlIliI=SynapseXen_iIliIIIlIliillliii[1]local SynapseXen_liillIIlliiiIIl=SynapseXen_iIliIIIlIliillliii[2]if SynapseXen_llIlIliI==SynapseXen_lIiil and SynapseXen_liillIIlliiiIIl>=SynapseXen_liIilIlIllIill then SynapseXen_IlliilIIli[SynapseXen_liillIIlliiiIIl]=SynapseXen_llIlIliI[SynapseXen_liillIIlliiiIIl]SynapseXen_iIliIIIlIliillliii[1]=SynapseXen_IlliilIIli end end end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[979795998]or(function()local SynapseXen_IiIil="yed"SynapseXen_ilIliiI[979795998]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(398858312,4216395951),SynapseXen_IiilillliiIi(2721691936,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3949266914,401754594,3164774744,1406729473,661060643,3995844427,608586469,4019858367}return SynapseXen_ilIliiI[979795998]end)())then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2799424647]or(function()local SynapseXen_IiIil="what are you trying to say? that fucking one dot + dot + dot + many dots is not adding adding 1 dot + dot and then adding all the dots together????"SynapseXen_ilIliiI[2799424647]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3253953824,2744030812),SynapseXen_IiilillliiIi(751989599,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3017487195,337674584,1681569405,1935044018,2762536087}return SynapseXen_ilIliiI[2799424647]end)()),SynapseXen_iIIlIiiIiiiIIIi)local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[1238265677]or(function(...)local SynapseXen_IiIil="my way to go against expwoiting is to have safety measuwes. i 1 wocawscwipt and onwy moduwes. hewe's how it wowks: this scwipt bewow stowes the moduwes in a tabwe fow each moduwe we send the wist with the moduwes and moduwe infowmation and use inyit a function in my moduwe that wiww stowe the info and aftew it has send to aww the moduwes it wiww dewete them. so whenyevew the cwient twies to hack they cant get the moduwes. onwy this peace of wocawscwipt."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2191700349,209958912)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1442765635,2852233188)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1238265677]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(393880645,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3622840644,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2270646579,341020258,1383972002,3641992108,1407353608,279099956,2604702935,364091733,1848634396,2386858880}return SynapseXen_ilIliiI[1238265677]end)("iliIIiiiIllIIIi","lillIiiIIilIIIIiIl","IlliiIilIiIiIiiIl"),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[254454874]or(function()local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"SynapseXen_ilIliiI[254454874]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1998737687,3991489046),SynapseXen_IiilillliiIi(4049539439,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{1415084362,987018351}return SynapseXen_ilIliiI[254454874]end)(),256)]=SynapseXen_IiIiilIIliIIlliI+SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[4070694624]or(function()local SynapseXen_IiIil="HELP ME PEOPLE ARE CRASHING MY GAME PLZ HELP"SynapseXen_ilIliiI[4070694624]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(4121490827,667076023),SynapseXen_IiilillliiIi(2629874167,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1647383481,1471633429,808956877,2334020355,3529997453}return SynapseXen_ilIliiI[4070694624]end)())then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[1377560976]or(function(...)local SynapseXen_IiIil="xen best rerubi paste"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(2293549849,65191721)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3322556782,972441856)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1377560976]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(850334287,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4149485349,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1314125546,4261567925,1917812994,3749812551,3302043318,1941016047}return SynapseXen_ilIliiI[1377560976]end)("llIlII","iIIIlliillilliII","lililIiilIlIIlIIli",{},{},{}),512)]if not not SynapseXen_IiIiilIIliIIlliI==(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[580469593]or(function()local SynapseXen_IiIil="this is a christian obfuscator, no cursing allowed in our scripts"SynapseXen_ilIliiI[580469593]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1506415888,1060588969),SynapseXen_IiilillliiIi(2043838167,SynapseXen_IllIiIili[4]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2526062234,3181160601,2753595644,2480031894,1978791148}return SynapseXen_ilIliiI[580469593]end)(),512)==0)then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 else SynapseXen_lIiil[SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1366149339]or(function(...)local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1225187306,645071338)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3349845260,945130957)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1366149339]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3012510797,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1478767772,SynapseXen_IllIiIili[5]))-string.len(SynapseXen_IiIil)-#{83473932,3240723155,1285023165,768171859,1955343291,1303198660,258060400,2380430487}return SynapseXen_ilIliiI[1366149339]end)({}),256)]=SynapseXen_IiIiilIIliIIlliI end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2022536208]or(function()local SynapseXen_IiIil="pain is gonna use the backspace method on xen"SynapseXen_ilIliiI[2022536208]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2204642744,2883945894),SynapseXen_IiilillliiIi(1714305068,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{246647391,1250969113,2303190660,1541265052,2771357999,2779203575,413246729,3738841148,1916020268}return SynapseXen_ilIliiI[2022536208]end)())then local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IlIIlIIilIililIlll(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3617082154]or(function()local SynapseXen_IiIil="xen detects custom getfenv"SynapseXen_ilIliiI[3617082154]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(897181679,3612880290),SynapseXen_IiilillliiIi(4245614124,SynapseXen_IllIiIili[4]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{1992049109,2049062640,3703793405}return SynapseXen_ilIliiI[3617082154]end)(),512),SynapseXen_iIIlIiiIiiiIIIi,512)local SynapseXen_IiiliiiIiIII=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_IiIiilIIliIIlliI+1,SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[2951776050]or(function()local SynapseXen_IiIil="https://twitter.com/Ripull_RBLX/status/1059334518581145603"SynapseXen_ilIliiI[2951776050]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2071583718,1090763901),SynapseXen_IiilillliiIi(4203395677,SynapseXen_IllIiIili[6]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2810884872,2235130144,2799733900,1687364483,2094862939}return SynapseXen_ilIliiI[2951776050]end)(),512)do SynapseXen_IiiliiiIiIII=SynapseXen_IiiliiiIiIII..SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]end;SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2300583689]or(function()local SynapseXen_IiIil="my way to go against expwoiting is to have safety measuwes. i 1 wocawscwipt and onwy moduwes. hewe's how it wowks: this scwipt bewow stowes the moduwes in a tabwe fow each moduwe we send the wist with the moduwes and moduwe infowmation and use inyit a function in my moduwe that wiww stowe the info and aftew it has send to aww the moduwes it wiww dewete them. so whenyevew the cwient twies to hack they cant get the moduwes. onwy this peace of wocawscwipt."SynapseXen_ilIliiI[2300583689]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1947696264,3613551627),SynapseXen_IiilillliiIi(3990547440,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2539955412,3667783092,3044910418,2229024049,1164134358,3058349591}return SynapseXen_ilIliiI[2300583689]end)(),256)]=SynapseXen_IiiliiiIiIII elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1341726496]or(function()local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"SynapseXen_ilIliiI[1341726496]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3982887748,3642039223),SynapseXen_IiilillliiIi(2061355182,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{863253678,666823729,1623759694,1346073391,1952132708,2561477551,2332675112,3403960588,296617473,141316335}return SynapseXen_ilIliiI[1341726496]end)())then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+SynapseXen_illIIilIiIIiIIill[990094981]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[3824241399]or(function(...)local SynapseXen_IiIil="now comes with a free n word pass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4285787574,2790263588)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3435370136,859603022)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3824241399]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1238312954,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1581757511,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2676759635,739619433,200905749,2438822970,3674163877,794336556,2185417487,3062733246,3766334588}return SynapseXen_ilIliiI[3824241399]end)(5160,"IllIliliiiIl","II",464))then SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[57854657]or(function()local SynapseXen_IiIil="sometimes it be like that"SynapseXen_ilIliiI[57854657]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1520421415,2539160393),SynapseXen_IiilillliiIi(2204836894,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{162187267,1543585124,3168062294,243810808,2457674415,2249878906,3460846744,2912432451}return SynapseXen_ilIliiI[57854657]end)(),256)]=SynapseXen_llIll[SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[2116109763],SynapseXen_ilIliiI[751506800]or(function()local SynapseXen_IiIil="wait for someone on devforum to say they are gonna deobfuscate this"SynapseXen_ilIliiI[751506800]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(816449309,2823617175),SynapseXen_IiilillliiIi(1477551726,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-#{525631357,92689217}return SynapseXen_ilIliiI[751506800]end)(),262144)]]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[4022314603]or(function()local SynapseXen_IiIil="inb4 posted on exploit reports section"SynapseXen_ilIliiI[4022314603]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2972215391,1169715687),SynapseXen_IiilillliiIi(3124613698,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2858698720,3653472973,3214219833,9691451,1454717233,1039482449,2226076615,350990119,1301903082}return SynapseXen_ilIliiI[4022314603]end)())then local SynapseXen_liIilIlIllIill=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2736546422]or(function()local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"SynapseXen_ilIliiI[2736546422]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3566577806,588045555),SynapseXen_IiilillliiIi(2618027719,SynapseXen_IllIiIili[2]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{2676965340,2971627755,302410272,195862392,3226151894,888206166,2242590360,1070180757}return SynapseXen_ilIliiI[2736546422]end)(),256)local SynapseXen_IiIiilIIliIIlliI=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[1430549856]or(function()local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"SynapseXen_ilIliiI[1430549856]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(333553587,2837262521),SynapseXen_IiilillliiIi(1182069311,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-#{1473332793,685762398,942984063,1615505711,3752817238,1856888132,2123082311}return SynapseXen_ilIliiI[1430549856]end)(),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;local SynapseXen_illlIillllii,SynapseXen_lliiiiiIIiIliIIll;local SynapseXen_iIIIIlliilIIiIl;local SynapseXen_lIliiIilIiIliIIi=0;SynapseXen_illlIillllii={}if SynapseXen_IiIiilIIliIIlliI~=1 then if SynapseXen_IiIiilIIliIIlliI~=0 then SynapseXen_iIIIIlliilIIiIl=SynapseXen_liIilIlIllIill+SynapseXen_IiIiilIIliIIlliI-1 else SynapseXen_iIIIIlliilIIiIl=SynapseXen_llllIilliIllilII end;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_liIilIlIllIill+1,SynapseXen_iIIIIlliilIIiIl do SynapseXen_illlIillllii[#SynapseXen_illlIillllii+1]=SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]end;SynapseXen_lliiiiiIIiIliIIll={SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill](unpack(SynapseXen_illlIillllii,1,SynapseXen_iIIIIlliilIIiIl-SynapseXen_liIilIlIllIill))}else SynapseXen_lliiiiiIIiIliIIll={SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]()}end;for SynapseXen_iIIIillIiilIII in next,SynapseXen_lliiiiiIIiIliIIll do if SynapseXen_iIIIillIiilIII>SynapseXen_lIliiIilIiIliIIi then SynapseXen_lIliiIilIiIliIIi=SynapseXen_iIIIillIiilIII end end;return SynapseXen_lliiiiiIIiIliIIll,SynapseXen_lIliiIilIiIliIIi elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[3342870101]or(function(...)local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1098654455,3243870432)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2324931777,1970056600)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3342870101]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(879888796,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2144473618,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{919989867,902504007,893782500,1740171295,236817768,828322005}return SynapseXen_ilIliiI[3342870101]end)(2306,1639,10015))then local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[901575753]or(function()local SynapseXen_IiIil="can we have an f in chat for ripull"SynapseXen_ilIliiI[901575753]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(1884837356,482614670),SynapseXen_IiilillliiIi(573574027,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{325233660,430931876,473829056,508350055}return SynapseXen_ilIliiI[901575753]end)())local SynapseXen_llIlillliIl=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[1664700482]or(function(...)local SynapseXen_IiIil="so if you'we nyot awawe of expwoiting by this point, you've pwobabwy been wiving undew a wock that the pionyeews used to wide fow miwes. wobwox is often seen as an expwoit-infested gwound by most fwom the suwface, awthough this isn't the case."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3257893979,2163280725)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(329713319,3965245807)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1664700482]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(834088162,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1036295520,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3013420400,3490577637,277337370,2374358973}return SynapseXen_ilIliiI[1664700482]end)("Ililil",{},{}),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;SynapseXen_llIlIliI[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1470730946]or(function(...)local SynapseXen_IiIil="now with shitty xor string obfuscation"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(110468070,1701971327)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4001280741,293708894)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1470730946]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3301197694,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3917524624,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{1066071833,1911478638,1149950825,1913962050,2467382136,2053466071,3470701894,4019475454,2472974025,4093939791}return SynapseXen_ilIliiI[1470730946]end)(9686,"ilillIlIIliIilii",{},{},8343,{},225,"iII"),256)]=SynapseXen_IiIiilIIliIIlliI*SynapseXen_llIlillliIl elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[647291093]or(function()local SynapseXen_IiIil="level 1 crook = luraph, level 100 boss = xen"SynapseXen_ilIliiI[647291093]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2817563015,1026498027),SynapseXen_IiilillliiIi(1512791828,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-#{1838575768,2257542774}return SynapseXen_ilIliiI[647291093]end)())then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[576662871]or(function()local SynapseXen_IiIil="double-header fair! this rationalization has a overenthusiastically anticheat! you will get nonpermissible for exploiting!"SynapseXen_ilIliiI[576662871]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3976995595,1268439748),SynapseXen_IiilillliiIi(1511637436,SynapseXen_IllIiIili[8]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3291510289,2809583531,1367132121,1959605637,1424853659}return SynapseXen_ilIliiI[576662871]end)(),256),SynapseXen_iIIlIiiIiiiIIIi)]=#SynapseXen_lIiil[SynapseXen_IlIIlIIilIililIlll(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3371193562]or(function()local SynapseXen_IiIil="luraph better then xen bros :pensive:"SynapseXen_ilIliiI[3371193562]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2288930547,3662104352),SynapseXen_IiilillliiIi(478599674,SynapseXen_IiIilliilIIl))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3020565151,2770346504,2270703905,3633594914,2890819244,3377389278,2186404920,283981792,2782870530,3025609851}return SynapseXen_ilIliiI[3371193562]end)(),512),SynapseXen_iIIlIiiIiiiIIIi,512)]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[4221415109]or(function(...)local SynapseXen_IiIil="aspect network better obfuscator"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1067718852,1889820468)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3748988154,545977057)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4221415109]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2731171624,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2741059596,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1596271682,1175515567,755984112,1479839235,279488799,964221340,1863654551}return SynapseXen_ilIliiI[4221415109]end)({},{}))then local SynapseXen_liIilIlIllIill=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3369655354]or(function(...)local SynapseXen_IiIil="sponsored by ironbrew, jk xen is better"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(286844601,3096835924)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1611551968,2683385912)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3369655354]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1187943456,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2716665094,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{2381423366,4230956279,1753928317,3951660238,1647034545,1731176534,1830351785}return SynapseXen_ilIliiI[3369655354]end)("llIIllIIl"),256)~=0;local SynapseXen_IiIiilIIliIIlliI=SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[4008609059]or(function(...)local SynapseXen_IiIil="i'm intercommunication about the most nonecclesiastical dll exploits for esp. they only characterization objects with a antepatriarchal in the geistesgeschichte for the esp."local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(4261984341,2239086953)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3718156101,576816505)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[4008609059]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3936275405,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1516378656,SynapseXen_IllIiIili[3]))-string.len(SynapseXen_IiIil)-#{1676316590,2845277242,2194953648,3918601822,785182510}return SynapseXen_ilIliiI[4008609059]end)(13803,{}),512)local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[81649470]or(function(...)local SynapseXen_IiIil="https://twitter.com/Ripull_RBLX/status/1059334518581145603"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(704654177,818231341)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1774818592,2520163017)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[81649470]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2356094829,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3690510443,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{1292403090,950125183,2541484540,3267197489}return SynapseXen_ilIliiI[81649470]end)("ilIIiIiIiiiIiiI",9420,9436,{}),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;if SynapseXen_IiIiilIIliIIlliI<=SynapseXen_llIlillliIl~=SynapseXen_liIilIlIllIill then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[2467764959]or(function()local SynapseXen_IiIil="double-header fair! this rationalization has a overenthusiastically anticheat! you will get nonpermissible for exploiting!"SynapseXen_ilIliiI[2467764959]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(3593758339,1327472104),SynapseXen_IiilillliiIi(3615522064,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{55543442,2719482109,104643524,1059462578}return SynapseXen_ilIliiI[2467764959]end)())then local SynapseXen_llIlIliI=SynapseXen_lIiil;for SynapseXen_IiliiliIiiIiiIliIlI=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[3122272476]or(function()local SynapseXen_IiIil="print(bytecode)"SynapseXen_ilIliiI[3122272476]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2982119709,1504300805),SynapseXen_IiilillliiIi(2797150099,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{2883263919,3058454807}return SynapseXen_ilIliiI[3122272476]end)()),SynapseXen_iIIlIiiIiiiIIIi),SynapseXen_IlIIlIIilIililIlll(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[2597103828]or(function()local SynapseXen_IiIil="baby i just fell for uwu,,,,,, i wanna be with uwu!11!!"SynapseXen_ilIliiI[2597103828]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2018439280,3939206900),SynapseXen_IiilillliiIi(2376768497,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-#{346363697,721421327,2759737618}return SynapseXen_ilIliiI[2597103828]end)(),512),SynapseXen_iIIlIiiIiiiIIIi,512)do SynapseXen_llIlIliI[SynapseXen_IiliiliIiiIiiIliIlI]=nil end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[3666688125]or(function(...)local SynapseXen_IiIil="wait for someone on devforum to say they are gonna deobfuscate this"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(48399372,960146993)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(1786130797,2508849454)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3666688125]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(2288674435,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(4246617630,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{264873246,3401314478,2765841441,2161790801,784000120}return SynapseXen_ilIliiI[3666688125]end)({},{},3871,1701,{}))then local SynapseXen_liIilIlIllIill=SynapseXen_iiIii(SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[354431681]or(function(...)local SynapseXen_IiIil="hi my 2.5mb script doesn't work with xen please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3830450957,3372262749)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4253961637,40971906)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[354431681]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4292903492,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3107756467,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{1290432859,1361356339}return SynapseXen_ilIliiI[354431681]end)("lliiil","iIIiIlIillliII",13900,13219,"lllilIliIl",13489),256),SynapseXen_iIIlIiiIiiiIIIi,256)local SynapseXen_llIlIliI=SynapseXen_lIiil;SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]=assert(tonumber(SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]),'`for` initial value must be a number')SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1]=assert(tonumber(SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+1]),'`for` limit must be a number')SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2]=assert(tonumber(SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2]),'`for` step must be a number')SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]=SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill]-SynapseXen_llIlIliI[SynapseXen_liIilIlIllIill+2]SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+SynapseXen_illIIilIiIIiIIill[990094981]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[692402037]or(function(...)local SynapseXen_IiIil="pain exist is gonna connect the dots of xen"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3437684567,569710411)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2860092423,1434877888)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[692402037]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4079699863,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1974284966,SynapseXen_IllIiIili[2]))-string.len(SynapseXen_IiIil)-#{650199574,3118996635}return SynapseXen_ilIliiI[692402037]end)({},{},{},{},"illilIlllIliIiI",3165,2468,"lilliIiI",8195,13200))then local SynapseXen_liIilIlIllIill=SynapseXen_IiilillliiIi(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[291239603]or(function()local SynapseXen_IiIil="can we have an f in chat for ripull"SynapseXen_ilIliiI[291239603]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2797485475,3175164985),SynapseXen_IiilillliiIi(2669734829,SynapseXen_IllIiIili[5]))-SynapseXen_lliIiIliI-string.len(SynapseXen_IiIil)-#{3345807030,187880329,1369359626,3348813068,2427666207,1019193477,1719122445,3731613071,2157188545,2317189261}return SynapseXen_ilIliiI[291239603]end)(),256),SynapseXen_iIIlIiiIiiiIIIi)~=0;local SynapseXen_IiIiilIIliIIlliI=SynapseXen_IiilillliiIi(SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[59187052]or(function(...)local SynapseXen_IiIil="SYNAPSE XEN [FE BYPASS] [BETTER THEN LURAPH] [AMAZING] OMG OMG OMG !!!!!!"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1450483434,1613336802)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(2587793030,1707184119)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[59187052]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1734999676,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(1310198808,SynapseXen_IllIiIili[4]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{264033034,1586736003,786300194,2438804926,4067534066,193556765,1597835105}return SynapseXen_ilIliiI[59187052]end)("ililiIIillllIiIiil",{},7450,9558,"iIlllilIlilIIiiI",{},{}),512),SynapseXen_iIIlIiiIiiiIIIi)local SynapseXen_llIlillliIl=SynapseXen_IlIIlIIilIililIlll(SynapseXen_illIIilIiIIiIIill[221391887],SynapseXen_ilIliiI[2298690079]or(function(...)local SynapseXen_IiIil="this is a christian obfuscator, no cursing allowed in our scripts"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3855861487,2738919071)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(308903986,3986052401)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2298690079]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(3006325876,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(3137897211,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{3702000188,44391006,3907146043,1060885919,3485654034,2504497337,3167999101,623789593,441296014}return SynapseXen_ilIliiI[2298690079]end)(1494,{},{},"I","iIIlIII",{},"liliilllIiIl","lIiliIIiiIIIliIiIIi"),512)local SynapseXen_llIlIliI=SynapseXen_lIiil;if SynapseXen_IiIiilIIliIIlliI>255 then SynapseXen_IiIiilIIliIIlliI=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_IiIiilIIliIIlliI-256]else SynapseXen_IiIiilIIliIIlliI=SynapseXen_llIlIliI[SynapseXen_IiIiilIIliIIlliI]end;if SynapseXen_llIlillliIl>255 then SynapseXen_llIlillliIl=SynapseXen_iIiIlIIiIiilIiIIiiIl[SynapseXen_llIlillliIl-256]else SynapseXen_llIlillliIl=SynapseXen_llIlIliI[SynapseXen_llIlillliIl]end;if SynapseXen_IiIiilIIliIIlliI<SynapseXen_llIlillliIl~=SynapseXen_liIilIlIllIill then SynapseXen_lIIIllIiiIIlil=SynapseXen_lIIIllIiiIIlil+1 end elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[1568519711]or(function(...)local SynapseXen_IiIil="imagine using some lua minifier tool and thinking you are a badass"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(861680411,1471142044)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(186040660,4108951289)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[1568519711]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(789819650,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(89438623,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-#{853453066,980479337,3769715234}return SynapseXen_ilIliiI[1568519711]end)("IlilIIII",{},{},"iIilIIillil",2391,{},"IiiiiiliIlilillil","IIIIl"))then SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[1905368379]or(function()local SynapseXen_IiIil="xen detects custom getfenv"SynapseXen_ilIliiI[1905368379]=SynapseXen_IiilillliiIi(SynapseXen_IilllilIlIiIlillllI(2692449827,2661056874),SynapseXen_IiilillliiIi(3261085041,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-#{1632327575,1930377681,1905056953,212405841,2469398940}return SynapseXen_ilIliiI[1905368379]end)())]=SynapseXen_lIiil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[353212024]or(function(...)local SynapseXen_IiIil="HELP ME PEOPLE ARE CRASHING MY GAME PLZ HELP"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3607159982,156784333)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(3178700562,1116276706)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII-SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[353212024]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1005507438,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2870634435,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{1902143466}return SynapseXen_ilIliiI[353212024]end)("lIlIIl",{},"IiiIIIlIiliiII",{},8672,14069))]elseif SynapseXen_lliIiIliI==(SynapseXen_ilIliiI[173439088]or(function(...)local SynapseXen_IiIil="hi xen doesn't work on sk8r please help"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1059528245,2939363215)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(46754117,4248179688)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[173439088]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(1714350070,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(919395086,SynapseXen_IllIiIili[6]))-string.len(SynapseXen_IiIil)-#{2303423572,2710341201,683628049,3943602682,515273488}return SynapseXen_ilIliiI[173439088]end)("lIIl","IiIilliliIIIlllil","lliiillIiIIlliI",14637,"Iliii",{},"IilllilII",{},{},"iiIIIll"))then SynapseXen_lIiiIIlIlIllIIiIil[SynapseXen_IiilillliiIi(SynapseXen_illIIilIiIIiIIill[1402414475],SynapseXen_ilIliiI[3523058013]or(function(...)local SynapseXen_IiIil="xen best rerubi paste"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(3852552762,2056703574)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(4177679069,117269333)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[3523058013]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(4119129938,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(2520411378,SynapseXen_IllIiIili[8]))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{3196699788,3789754827,990223203,115981466}return SynapseXen_ilIliiI[3523058013]end)("iIiIIiI",8352))]=SynapseXen_lIiil[SynapseXen_iiIii(SynapseXen_illIIilIiIIiIIill[1152160448],SynapseXen_ilIliiI[2230035691]or(function(...)local SynapseXen_IiIil="HELP ME PEOPLE ARE CRASHING MY GAME PLZ HELP"local SynapseXen_liliIililIillII=SynapseXen_IilllilIlIiIlillllI(1738791236,1062700834)local SynapseXen_liIIilliilIllIIIiii={...}for SynapseXen_IlIiI,SynapseXen_liiilIiliIlliiil in pairs(SynapseXen_liIIilliilIllIIIiii)do local SynapseXen_illiIiiIlliliIllllI;local SynapseXen_lilillii=type(SynapseXen_liiilIiliIlliiil)if SynapseXen_lilillii=="number"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil elseif SynapseXen_lilillii=="string"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_liiilIiliIlliiil:len()elseif SynapseXen_lilillii=="table"then SynapseXen_illiIiiIlliliIllllI=SynapseXen_IilllilIlIiIlillllI(319599164,3975386687)end;SynapseXen_liliIililIillII=SynapseXen_liliIililIillII+SynapseXen_illiIiiIlliliIllllI end;SynapseXen_ilIliiI[2230035691]=SynapseXen_IiilillliiIi(SynapseXen_IiilillliiIi(518561465,SynapseXen_liliIililIillII),SynapseXen_IiilillliiIi(145843426,SynapseXen_IiIilliilIIl))-string.len(SynapseXen_IiIil)-SynapseXen_lliIiIliI-#{3337905640,2951218746,3710270269}return SynapseXen_ilIliiI[2230035691]end)("I",{},{}),256)]end end end;local SynapseXen_illlIillllii={...}for SynapseXen_IiliiliIiiIiiIliIlI=0,SynapseXen_IllIlIIiiliiiliiiIIi do if SynapseXen_IiliiliIiiIiiIliIlI>=SynapseXen_IIlIliiiIIiiiIlII[874304623]then SynapseXen_lIiliiIiIIiIil[SynapseXen_IiliiliIiiIiiIliIlI-SynapseXen_IIlIliiiIIiiiIlII[874304623]]=SynapseXen_illlIillllii[SynapseXen_IiliiliIiiIiiIliIlI+1]else SynapseXen_lIiil[SynapseXen_IiliiliIiiIiiIliIlI]=SynapseXen_illlIillllii[SynapseXen_IiliiliIiiIiiIliIlI+1]end end;local SynapseXen_IiIiilIIliIIlliI,SynapseXen_llIlillliIl=SynapseXen_iIllIIiIillIli()if SynapseXen_IiIiilIIliIIlliI and SynapseXen_llIlillliIl>0 then return unpack(SynapseXen_IiIiilIIliIIlliI,1,SynapseXen_llIlillliIl)end;return end end;local function SynapseXen_Iliii(SynapseXen_lIIiiIIlIlIiIIi,SynapseXen_llIll)local SynapseXen_IllIIIlIilI=SynapseXen_iIIllIIII(SynapseXen_lIIiiIIlIlIiIIi)return SynapseXen_liilIIiiiIiIlii(SynapseXen_IllIIIlIilI,SynapseXen_llIll or getfenv(0)),SynapseXen_IllIIIlIilI end;return SynapseXen_Iliii(SynapseXen_iIillIiili("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"),getfenv())()
Bellmatts
🚀 Build type-safe Next.js API handlers with Zod validation and composable middleware, enhancing your development experience without leaving standard routes.
programming-with-ia
A typesafe and structured way to build Next.js App Router API handlers. Get a tRPC-like developer experience with Zod validation and composable middleware, without leaving your standard API routes.
pom421
Better handlers for writing API endpoints in Next.js