level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_6_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 0, 0 }, modTags = { "caster" }, },
	["SpellsHinderOnHitChanceEldritchImplicitPinnaclePresence2"] = { type = "Eater", affix = "", "While a Pinnacle Atlas Boss is in your Presence, 80% chance to Hinder Enemies on Hit with Spells", statOrder = { 9670 }, level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_5_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 0, 0 }, modTags = { "caster" }, },
	["SpellsHinderOnHitChanceEldritchImplicitPinnaclePresence3"] = { type = "Eater", affix = "", "While a Pinnacle Atlas Boss is in your Presence, 85% chance to Hinder Enemies on Hit with Spells", statOrder = { 9670 }, level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_4_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 120, 0 }, modTags = { "caster" }, },
	["SpellsHinderOnHitChanceEldritchImplicitPinnaclePresence4"] = { type = "Eater", affix = "", "While a Pinnacle Atlas Boss is in your Presence, 90% chance to Hinder Enemies on Hit with Spells", statOrder = { 9670 }, level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_3_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 120, 0 }, modTags = { "caster" }, },
	["SpellsHinderOnHitChanceEldritchImplicitPinnaclePresence5"] = { type = "Eater", affix = "", "While a Pinnacle Atlas Boss is in your Presence, 95% chance to Hinder Enemies on Hit with Spells", statOrder = { 9670 }, level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_2_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 120, 0 }, modTags = { "caster" }, },
	["SpellsHinderOnHitChanceEldritchImplicitPinnaclePresence6"] = { type = "Eater", affix = "", "While a Pinnacle Atlas Boss is in your Presence, Hinder Enemies on Hit with Spells", statOrder = { 9670 }, level = 75, group = "SpellsHinderOnHitChancePinnaclePresence", weightKey = { "no_tier_1_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 120, 0 }, modTags = { "caster" }, },
	["IncreasedAccuracyPercentEldritchImplicit1"] = { type = "Eater", affix = "", "(9-10)% increased Global Accuracy Rating", statOrder = { 1318 }, level = 75, group = "IncreasedAccuracyPercent", weightKey = { "no_tier_6_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 1000, 0 }, modTags = { "attack" }, },
	["IncreasedAccuracyPercentEldritchImplicit2"] = { type = "Eater", affix = "", "(11-12)% increased Global Accuracy Rating", statOrder = { 1318 }, level = 75, group = "IncreasedAccuracyPercent", weightKey = { "no_tier_5_eldritch_implicit", "gloves", "default", }, weightVal = { 0, 1000, 0 }, modTags = { "attack" }, },
	["IncreasedAccuracyPercentEldritchImplicit3"] = { type = "Eater", affix = "", "(13-14)% increased Global Accuracy Rating",


ataDocument } from '../metadataDocument';

/**
 * Strategy for comiting decompositions to the file system.
 *
 * Of particular interest is deletion. If an aggregate object has fine grain tracking for its bits then these will be
 * deleted independently of a decomposition. If not, then deletion might be the responsibility of this strategy (by
 * looking at what's "missing" from the decompositions viz a viz the workspace).
 */
export interface DecompositionCommitStrategy {
  commit(
    documents: Map<string, MetadataDocument>,
    existingPaths: string[],
    createDuplicates: boolean,
    forceoverwrite: boolean
  ): Promise<[string[], string[], string[], string[]]>;
}
/**
 * Defines a simple type to identify the state for this checker.
 */
export interface RemoteListState {

  /**
   * Keeps track of the sorting criteria used in the last request.
   */
  orderBy?: string;

  /**
   * Keeps track of the number of sequentially loaded pages.
   */
  loadedPagesCount?: number;

  /**
   * Keeps track of the number of sequentially loaded pages.
   */
  totalPages?: number;

  /**
   * Keeps track of the number of items count.
   */
  itemsCount?: number;
}
import {Clock} from './clock';

/**
 *  Timer
 *
 *  @version 3.1
 *  @author M Thokchom (thokchomonline@gmail.com)
 */

/**
 * Timer Class
 *
 * This class inherits from clock class and provides timer functionality
 */
export class Timer extends Clock{

	private _running: boolean;
	private _setTime: number;
	private _startTime: number;
	private _stopTime: number;

	constructor() {
		super();
		this.reset();
	}

	public start(time?: number): void{
		if(time){
			this._startTime = this._currentTime - (time - this._currentTime );
		}else{
			this._startTime = this._currentTime;
		}

		this._running   = true;
	}

	public stop(): void{
		if(this._running){
			this._stopTime   = this._currentTime;
		}
		this._running   = false;
	}

	public pause(): void{
		this._running   = false;
	}

	public resume(): void{
		this._running   = true;
	}

	public reset(): void{
		this._startTime = this._currentTime;
		this._stopTime  = this._currentTime;
		this._running   = false;
	}

	public getValue(){
		var timerValue: {
			duration: number,
			startTime: number,
			currentTime: number
		} = {
			duration    : ((this._running ? this._currentTime : this._stopTime) - this._startTime) || 0,
			currentTime : this._currentTime,
			startTime   : this._startTime
		}

		return  timerValue;
	}

	public setValue(time: number):void{

		if(!this._startTime || this._running){
			this._startTime = this._currentTime - time;
		}

		if(!this._running){
			this._stopTime = this._startTime + time
		}
	}

	public getStatus(): boolean{
		return this._running;
	}

}/**
 * @license
 * Copyright 2019 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * Non-editable, serializable text field. Behaves like a
 *    normal label but is serialized to XML. It may only be
 *    edited programmatically.
 *
 * @class
 */
// Former goog.module ID: Blockly.FieldLabelSerializable

import {
  FieldLabel,
  FieldLabelConfig,


ui` 前缀的，使用comfyui软件导出的工作流json作为内容
  2. `nodeflow-obcanvas` 前缀的，使用obsidian canvas文件的内容 (用记事本打开，会发现里面是一个json格式)
  3. `nodeflow-list` 前缀的，表示这是一个对标mermaid/plantuml的，用轻文字描述图表的格式。
    具体语法参考 [NodeFlow List Grammer](https://linczero.github.io/MdNote_Public/ProductDoc/Plugin/NodeFlow/docs/zh/NodeFlow%20List%20Grammer.html)
  4. `nodeflow-listitem` 前缀的，beta测试中。与 `nodeflow-list` 相似，但能支持多种项类型，如颜色、markdown等
  5. 这些类型更具体的用法见[文档](https://linczero.github.io/MdNote_Public/ProductDoc/Plugin/NodeFlow/README.show.htm)

Example - List Grammer (举例 - 列表语法)：

````md
```nodeflow-list
- nodes
  - node1:KSample
    - Latent, o
    - model, i
    - positive, i
    - negative, i
    - Latent, i
    - seed,
    - control_after_generate,, randomize
    - steps,, 20
    - CFG,, 8.0
    - sampler_name,, euler
    - scheduler,, normal
    - denoise,, 1.00
    - io defaultTest, i , test
    - io defaultTest, o, test
    - t1:noValueTest,
    - t2:,, noKeyTest
      mul lines test
  - node2:KSample
    - 潜空间, o
    - 模型, i
    - 正面条件, i
    - 负面条件, i
    - 潜空间, i
    - 种子,
    - 运行后操作,
    - 步数,
    - CFG,
    - 采样器/采样方法,
    - 调度器,
    - 降噪,
  - translate
- edges
  - node1,Latent, translate,l
  - translate,r, node2, 潜空间
```
````

You can alse use the demo use case by filling in `demo`/`demo2`/`demo3` in the code block and checking that it works (你也可以在代码块内填写 `demo`/`demo2`/`demo3` 来使用demo用例，并检查其是否正常工作)

### Method 2: Independent file (方式二: 独立文件)

- en

  Directly put comfyui's exported `workflow.json` file in the library, will automatically identify the json suffix

  Directly modify the extension of comfyui's exported workflow.json file to `.workflow_json`, which can also be correctly identified
- zh

  直接将comfyui的导出 `workflow.json` 文件放在库里，会自动识别json后缀的

  直接将comfyui的导出workflow.json文件扩展名修改成`.workflow_json`，也能正确识别

## TODO

- feat
  - ~~支持socket的name-value显示~~ (241027)
  - ~~Obsidian版本的全屏优化~~
- enhance
  - [非全屏状态下的中间拖拽优化](https://github.com/bcakmakoglu/vue-flow/issues/1557)
  - [带节点组的情况下进行自动布局](https://github.com/bcakmakoglu/vue-flow/discussions/1658)
  - 代码优化
    - ~~整理一下，捋一下各种节点类型，


Character.DIRECTIONALITY_ARABIC_NUMBER) {
                        dd = Character.DIRECTIONALITY_RIGHT_TO_LEFT;
                        break;
                    }
                }

                for (int y = j; y < k; y++) {
                    if (dd == cur)
                        chInfo[y] = cur;
                    else
                        chInfo[y] = SOR;
                }

                j = k - 1;
            }
        }

        // dump(chdirs, n, "final");

        // extra: enforce that all tabs and surrogate characters go the
        // primary direction
        // TODO: actually do directions right for surrogates

        for (int j = 0; j < n; j++) {
            char c = chs[j];

            if (c == '\t' || (c >= 0xD800 && c <= 0xDFFF)) {
                chInfo[j] = SOR;
            }
        }

        return dir;
    }

    private static final char FIRST_CJK = '\u2E80';
    /**
     * Returns true if the specified character is one of those specified
     * as being Ideographic (class ID) by the Unicode Line Breaking Algorithm
     * (http://www.unicode.org/unicode/reports/tr14/), and is therefore OK
     * to break between a pair of.
     *
     * @param includeNonStarters also return true for category NS
     *                           (non-starters), which can be broken
     *                           after but not before.
     */
    private static final boolean isIdeographic(char c, boolean includeNonStarters) {
        if (c >= '\u2E80' && c <= '\u2FFF') {
            return true; // CJK, KANGXI RADICALS, DESCRIPTION SYMBOLS
        }
        if (c == '\u3000') {
            return true; // IDEOGRAPHIC SPACE
        }
        if (c >= '\u3040' && c <= '\u309F') {
            if (!includeNonStarters) {
                switch (c) {
                case '\u3041': //  # HIRAGANA LETTER SMALL A
                case '\u3043': //  # HIRAGANA LETTER SMALL I
                case '\u3045': //  # HIRAGANA LETTER SMALL U
                case '\u3047': //  # HIRAGANA LETTER SMALL E
                case '\u3049': //  # HIRAGANA LETTER SMALL O
                case '\u3063': //  # HIRAGANA LETTER SMALL TU
                case '\u3083': //  # HIRAGANA LETTER SMALL YA
                case '\u3085': //  # HIRAGANA LETTER SMALL YU
                case '\u3087': //  # HIRAGANA LETTER SMALL YO
                case '\u308E': //  # HIRAGANA LETTER SMALL WA
                case '\u3095': //  # HIRAGANA LETTER SMALL KA
                case '\u3096': //  # HIRAGANA LETTER SMALL KE
                case '\u309B': //  # KATAKANA-HIRAGANA VOICED SOUND MARK
                case '\u309C': //  # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
                case '\u309D': //  # HIRAGANA ITERATION MARK
                case '\u309E': //  # HIRAGANA VOICED ITERATION MARK
                    return false;
                }
            }
            return true; // Hiragana (except small characters)
        }
        if (c >= '\u30A0' && c <= '\u30FF') {
            if (!includeNonStarters) {
                switch (c) {
                case '\u30A0': //  # KATAKANA-HIRAGANA DOUBLE HYPHEN
                case '\u30A1': //  # KATAKANA LETTER SMALL A
                case '\u30A3': //  # KATAKANA LETTER SMALL I
                case '\u30A5': //  # KATAKANA LETTER SMALL U
                case '\u30A7': //  # KATAKANA LETTER SMALL E
                case '\u30A9': //  # KATA


Cache, icon)
				end
			end
		end
		return self.searchCache;
	end

	function IconDataProvider:GetIconByIndex(index)
		if self.searchQuery then
			return self:GetSearchCache(self:GetNumIcons())[index];
		end
		return IconDataProviderMixin.GetIconByIndex(self, index);
	end

	function Bindings:CreateIconDataProvider(...)
		return CreateAndInitFromMixin(IconDataProvider, ...);
	end
end


backup cloud_controller -c /home/cfsupp/cloudfoundry/.deployments/rest/config -v /home/cfsupp/cloudfoundry/vcap/bin
    	health_manager : RUNNING
    	mongodb_gateway : RUNNING
    	router : RUNNING
    	redis_gateway : RUNNING
    	redis_node : RUNNING
    	mongodb_node : RUNNING
    	mysql_gateway : RUNNING
    	cloud_controller : RUNNING

2. Start components installed on the **_dea_** deployment node (`10.20.143.187`)

    	$ ~/cloudfoundry/vcap/dev_setup/bin/vcap_dev -n dea start
    	Using cloudfoundry config from /home/cfsupp/cloudfoundry/.deployments/dea/config
    	Executing /home/cfsupp/cloudfoundry/.deployments/dea/deploy/rubies/ruby-1.9.2-p180/bin/ruby /home/cfsupp/cloudfoundry/vcap/dev_setup/bin/vcap start dea -c /home/cfsupp/cloudfoundry/.deployments/dea/config -v /home/cfsupp/cloudfoundry/vcap/bin
    	dea : RUNNING

3. Start components installed on the **_mysql0_** deployment node (`10.20.143.188`)

    	$ ~/cloudfoundry/vcap/dev_setup/bin/vcap_dev -n mysql0 start
    	Using cloudfoundry config from /home/cfsupp/cloudfoundry/.deployments/mysql0/config
    	Executing /home/cfsupp/cloudfoundry/.deployments/mysql0/deploy/rubies/ruby-1.9.2-p180/bin/ruby /home/cfsupp/cloudfoundry/vcap/dev_setup/bin/vcap start mysql_backup mysql_node -c /home/cfsupp/cloudfoundry/.deployments/mysql0/config -v /home/cfsupp/cloudfoundry/vcap/bin
    	mysql_node : RUNNING

4. Start components installed on the **_mysql1_** deployment node (`10.20.143.189`)

    	$ ~/cloudfoundry/vcap/dev_setup/bin/vcap_dev -n mysql1 start**
   	 	Using cloudfoundry config from /home/cfsupp/cloudfoundry/.deployments/mysql1/config
    	Executing /home/cfsupp/cloudfoundry/.deployments/mysql1/deploy/rubies/ruby-1.9.2-p180/bin/ruby /home/cfsupp/cloudfoundry/vcap/dev_setup/bin/vcap start mysql_backup mysql_node -c /home/cfsupp/cloudfoundry/.deployments/mysql1/config -v /home/cfsupp/cloudfoundry/vcap/bin
    	mysql_node : RUNNING

## Multi Node Installation Verification

The cloud_controller component listens for commands on the `api.vcap.me` endpoint, which points to `127.0.0.1`. Run the vcap command-line client, `vmc`, on the node where cloud_controller is running (the **rest** node at `10.20.143.190`).

    $ vmc target

    [http://api.vcap.me]

    $ vmc info

    VMware's Cloud Application Platform
    For support visit http://support.cloudfoundry.com

    Target: http://api.vcap.me (v0.999)
    Client: v0.3.12

    $ vmc register
    Email: user@vmware.com
    Password: *******
    Verify Password: *******
    Creating New User: OK
    Successfully logged into [http://api.vcap.me]

    $ vmc info

    VMware's Cloud Application Platform
    For support visit http://support.cloudfoundry.com

    Target: http://api.vcap.me (v0.999)
    Client: v0.3.12

    User: user@vmware.com
    Usage: Memory (0B of 2.0G total)
     Services (0 of 16 total)
     Apps (0 of 20 total)

    $ vmc services

    ============== System Services =========


using std::iterator;
using std::list;

using fawkes::upoint_t;

namespace firevision {

/** @class GradientClassifier <fvclassifiers/gradient.h>
 * Gradient classifier.
 * Uses the difference of the current and the last value.
 */

/** Constructor.
 * @param scanlines list of scanline models (Does only work with ScanlineGrid)
 * @param q Qualifier for a single pixel (The qualifier gets deleted by this class)
 * @param threshold minimum rise required for classification
 * @param max_size of an object to be detected (if 0 value will be ignored)
 * @param use_rising_flank
 *           if true the classification can start on a rising flank
 * @param use_falling_flank
 *           if true the classification can start on a falling flank
 */
GradientClassifier::GradientClassifier(std::list<ScanlineGrid *> *scanlines,
                                       Qualifier                 *q,
                                       unsigned int               threshold,
                                       unsigned int               max_size,
                                       bool                       use_rising_flank,
                                       bool                       use_falling_flank)
: Classifier("GradientClassifier")
{
	if (!scanlines)
		throw fawkes::NullPointerException("GradientClassifier: scanlines may not be null!");
	if (!q)
		throw fawkes::NullPointerException("GradientClassifier: the Qualifier may not be null!");

	_scanlines = scanlines;
	_q         = q;

	_max_size = 999999; //Infinite...
	set_threshold(threshold, max_size);
	set_edges(use_rising_flank, use_falling_flank);
}

/** Destructor.
 */
GradientClassifier::~GradientClassifier()
{
	if (_q)
		delete _q;
}

/** Threshold setter.
 * @param threshold minimum rise required for classification
 * @param max_size of an object to be detected (if 0 value will not be set)
 */
void
GradientClassifier::set_threshold(unsigned int threshold, unsigned int max_size)
{
	_threshold = threshold;

	if (max_size)
		_max_size = max_size;
}

/** Edge setter.
 * @param use_rising_edge
 *           if true the classification can start on a rising edge
 * @param use_falling_edge
 *           if true the classification can start on a falling edge
 */
void
GradientClassifier::set_edges(bool use_rising_edge, bool use_falling_edge)
{
	_use_rising_edge  = use_rising_edge;
	_use_falling_edge = use_falling_edge;
}

/** Set source buffer.
 * @param yuv422_planar a YUV422 planar buffer with the source image to
 * classify. The classifier may NOT modify the image in any way. If that is
 * required the classifier shall make a copy of the image.
 * @param width width of buffer in pixels
 * @param height height of buffer in pixels
 */
void
GradientClassifier::set_src_buffer(unsigned char *yuv422_planar,
                                   unsigned int   width,
                                   unsigned int   height)
{
	Classifier::set_src_buffer(yuv422_planar, width, height);

	_q->set_buffer(yuv422_planar, width, height);
}

std::list<ROI> *
GradientClassifier::classify()
{
	if (_q->get_buffer() == NULL) {
		//cout << "GradientClassifier: ERROR, src buffer not set


++)
				{
					// Copy the lumel
					originalBlock[(v<<2)+u]=blockSrc[u];
				}

				// Next line
				blockSrc+=lumelCount;
			}

			// Get min and max alpha
			uint8 alphaMin=255;
			uint8 alphaMax=0;

			// Scan
			for (uint i=0; i<16; i++)
			{
				// Min ?
				if (originalBlock[i]<alphaMin)
					alphaMin=originalBlock[i];
				if (originalBlock[i]>alphaMax)
					alphaMax=originalBlock[i];
			}

			// *** Try to compress by 2 methods

			// Blcok uncompressed
			uint8 uncompressedBlock[4*4];

			// Pack the block
			packLumelBlock (compressedData, originalBlock, alphaMin, alphaMax);

			// Unpack the block
			unpackLumelBlock (uncompressedBlock, compressedData);

			// Eval error
			uint firstMethod=evalLumelBlock (originalBlock, uncompressedBlock, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE);

			// second compression
			uint8 secondCompressedBlock[NL_BLOCK_LUMEL_COMPRESSED_SIZE];
			packLumelBlock (secondCompressedBlock, originalBlock, alphaMax, alphaMin);

			// Unpack the block
			unpackLumelBlock (uncompressedBlock, secondCompressedBlock);

			// Eval error
			uint secondMethod=evalLumelBlock (originalBlock, uncompressedBlock, NL_LUMEL_BY_TILE, NL_LUMEL_BY_TILE);

			// Second best ?
			if (secondMethod<firstMethod)
			{
				// Copy compressed data
				memcpy (compressedData, secondCompressedBlock, NL_BLOCK_LUMEL_COMPRESSED_SIZE);
			}

			// Next source block
			compressedData+=NL_BLOCK_LUMEL_COMPRESSED_SIZE;

			// Next block on the line
			blockLine+=4;
		}

		// Next line of block
		pLumelSrc+=lumelCount*4;
	}
}

// ***************************************************************************
void		CPatch::resetCompressedLumels ()
{
	// Number of lumel by lines
	uint lumelCount=OrderS*NL_LUMEL_BY_TILE;

	// Number of block in a line
	nlassert ((lumelCount&0x3)==0);
	uint numLumelBlock=lumelCount>>2;

	// Number of line
	uint lineCount=OrderT*NL_LUMEL_BY_TILE;

	// Number of block line
	nlassert ((lineCount&0x3)==0);
	uint numLineBlock=lineCount>>2;

	// Size of the lumel array
	uint size=numLineBlock*numLumelBlock*8;

	// 4 bits per lumel
	CompressedLumels.resize (size);

	// No line have shadows.
	memset (&CompressedLumels[0], 0, size);
}

// ***************************************************************************
// ***************************************************************************
// Functions (C/ASM).
// ***************************************************************************
// ***************************************************************************

// ***************************************************************************
#define		a00	tex[0]
#define		a10	tex[1]
#define		a20	tex[2]
#define		a30	tex[3]
#define		a40	tex[4]

#define		a01	tex[5]
#define		a11	tex[6]
#define		a21	tex[7]
#define		a31	tex[8]
#define		a41	tex[9]

#define		a02	tex[10]
#define		a12	tex[11]
#define		a22	tex[12]
#define		a32	tex[13]
#define		a42	tex


/	mflr r0
/* 8044AB34 00447A74  90 01 00 14 */	stw r0, 0x14(r1)
/* 8044AB38 00447A78  80 04 00 34 */	lwz r0, 0x34(r4)
/* 8044AB3C 00447A7C  2C 00 00 02 */	cmpwi r0, 2
/* 8044AB40 00447A80  41 82 00 0C */	beq .L_8044AB4C
/* 8044AB44 00447A84  2C 00 00 01 */	cmpwi r0, 1
/* 8044AB48 00447A88  40 82 00 28 */	bne .L_8044AB70
.L_8044AB4C:
/* 8044AB4C 00447A8C  38 00 00 00 */	li r0, 0
/* 8044AB50 00447A90  38 A0 00 00 */	li r5, 0
/* 8044AB54 00447A94  98 03 00 34 */	stb r0, 0x34(r3)
/* 8044AB58 00447A98  80 C4 00 24 */	lwz r6, 0x24(r4)
/* 8044AB5C 00447A9C  38 80 18 00 */	li r4, 0x1800
/* 8044AB60 00447AA0  80 6D 98 58 */	lwz r3, spSysIF__8PSSystem@sda21(r13)
/* 8044AB64 00447AA4  80 06 00 0C */	lwz r0, 0xc(r6)
/* 8044AB68 00447AA8  90 0D 86 78 */	stw r0, mActiveSectionFlag__8GameFlow@sda21(r13)
/* 8044AB6C 00447AAC  4B EE DA C5 */	bl playSystemSe__Q28PSSystem5SysIFFUlUl
.L_8044AB70:
/* 8044AB70 00447AB0  80 01 00 14 */	lwz r0, 0x14(r1)
/* 8044AB74 00447AB4  7C 08 03 A6 */	mtlr r0
/* 8044AB78 00447AB8  38 21 00 10 */	addi r1, r1, 0x10
/* 8044AB7C 00447ABC  4E 80 00 20 */	blr
.endfn menuSelect__Q25Title7SectionFR4Menu

.if version == 0
.fn doDraw__Q25Title7SectionFR8Graphics, global
/* 8044AB80 00447AC0  94 21 FF F0 */	stwu r1, -0x10(r1)
/* 8044AB84 00447AC4  7C 08 02 A6 */	mflr r0
/* 8044AB88 00447AC8  90 01 00 14 */	stw r0, 0x14(r1)
/* 8044AB8C 00447ACC  93 E1 00 0C */	stw r31, 0xc(r1)
/* 8044AB90 00447AD0  7C 9F 23 78 */	mr r31, r4
/* 8044AB94 00447AD4  93 C1 00 08 */	stw r30, 8(r1)
/* 8044AB98 00447AD8  7C 7E 1B 78 */	mr r30, r3
/* 8044AB9C 00447ADC  38 7F 00 BC */	addi r3, r31, 0xbc
/* 8044ABA0 00447AE0  81 84 00 BC */	lwz r12, 0xbc(r4)
/* 8044ABA4 00447AE4  81 8C 00 14 */	lwz r12, 0x14(r12)
/* 8044ABA8 00447AE8  7D 89 03 A6 */	mtctr r12
/* 8044ABAC 00447AEC  4E 80 04 21 */	bctrl
/* 8044ABB0 00447AF0  80 1E 00 48 */	lwz r0, 0x68(r30)
/* 8044ABB4 00447AF4  2C 00 00 03 */	cmpwi r0, 3
/* 8044ABB8 00447AF8  41 82 00 44 */	be


More infos at Github

You found a bug?

    Write me an email at m.lueckert@me.com
    or open a GitHub issue here

<!DOCTYPE html>

    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>20.手写组合API</title>


 - To add extra data to return value.
 */

export function proxy(proxyObject: any, append = {}) {
  return Object.assign(JSON.parse(JSON.stringify(proxyObject)), append);
}
import { Router } from "express";
const DataRouter = Router();
const puppeteer = require('puppeteer');
const GameModel = require('../models/GameModel').GameModel;
const NotificationModel = require('../models/NotificationModel').NotificationModel;

DataRouter.post("/addGame", async (req, res) => {

    const { email, name, startDate , finishDate, duration , description} = req.body;
    const payload = {
        email: email,
        name : name,
        startDate : startDate,
        finishDate : finishDate,
        duration : duration,
        description : description
    }
    const game = new GameModel(payload);
  try {
    const games = await GameModel.findOne({ name : name});
    if (games != null){
      res.status(400).send();
    }else{
      await game.save();
      res.send({game});
    }

  } catch (error) {
    res.status(500).send(error);
  }

})

DataRouter.post("/getGames", async (req, res) => {

  const { email } = req.body;

  try {
    const games = await GameModel.find({ email: email });
    if (games == null){
      res.status(400).send();
    }else{
      res.send(games);
    }

  } catch (error) {
    res.status(500).send(error);
  }

})

DataRouter.post("/addNotification", async (req, res) => {

    const { name, price } = req.body;
    const payload = {
        name : name,
        price : price
    }
    const notification = new NotificationModel (payload);
  try {
    const notifications = await NotificationModel .findOne({ name : name});
    if (notifications != null){
      res.status(400).send();
    }else{
      await notification.save();
      res.send({game: notification});
    }

  } catch (error) {
    res.status(500).send(error);
  }

})

DataRouter.get("/getNotifications", async (req, res) => {

    try {
      const notifications = await NotificationModel.find({ });
      if (notifications == null){
        res.status(400).send();
      }else{

        res.send({notifications});
      }

    } catch (error) {
      res.status(500).send(error);
    }

  })

export = DataRouter;
import { BadRequestException } from '@nestjs/common';

export class CreateCategoryException extends BadRequestException {
  constructor(error?: string) {
    super('There was an error creating the category.', error);
  }
}
import {
  AfterViewInit,
  Component,
  ElementRef,
  EventEmitter,
  Input,
  Output,
  ViewChild,
} from '@angular/core';
import { TrailService } from 'src/app/services/trails/trail.service';
import { environment } from 'src/environments/environment';
import Swal from 'sweetalert2';

@Component({
  selector: 'app-file-uploader',
  templateUrl: './file-uploader.component.html',
  styleUrls: ['./file-uploader.component.scss'],
})
export class FileUploaderComponent implements AfterViewInit {
  baseUrl = environment.host;
  status?: string;
  @Input() filepath?: string | null;
  @Output() filePathEvent = new EventEmitter<string>();
  @ViewChild('dragArea') dragArea?: ElementRef;
  constructor(private trailService: TrailService) {}

  ngAfterViewInit(): void {
    this.handleDragArea();
  }

  /**
   * Listen t


rintf(stderr, "Page render failed: error=%d\n", err);
		return EXIT_FAILURE;
	}

	err = MuOfficeRender_waitUntilComplete(render);
	if (err)
	{
		fprintf(stderr, "Page render failed to complete: error=%d\n", err);
		return EXIT_FAILURE;
	}

	/* Kill the render */
	MuOfficeRender_destroy(render);

	/* Output the bitmap */
	save_png(&bitmap, "out1.png");
	free(bitmap.memptr);

	MuOfficePage_destroy(page);

	MuOfficeDoc_destroy(doc);

	return EXIT_SUCCESS;
}

int main(int argc, char **argv)
{
	MuOfficeLib *mu;
	MuError err;
	int ret;

	err = MuOfficeLib_create(&mu);
	if (err)
	{
		fprintf(stderr, "Failed to create lib instance: error=%d\n", err);
		return EXIT_FAILURE;
	}

	ret = test_async(mu);
	if (ret)
		return ret;

	ret = test_sync(mu);
	if (ret)
		return ret;

	MuOfficeLib_destroy(mu);

	return EXIT_SUCCESS;
}

/*
	Code beneath here calls MuPDF directly, purely because
	this is the easiest way to get PNG saving functionality.
	This is not part of the test, which is why this is put
	at the end.
*/

#include "mupdf/fitz.h"

static void
save_png(const MuOfficeBitmap *bitmap, const char *filename)
{
	fz_context *ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
	fz_pixmap *pix;

	if (ctx == NULL)
	{
		fprintf(stderr, "save_png failed!\n");
		exit(EXIT_FAILURE);
	}

	fz_try(ctx)
	{
		pix = fz_new_pixmap_with_data(ctx, fz_device_rgb(ctx), bitmap->width, bitmap->height, NULL, 1, bitmap->lineSkip, bitmap->memptr);

		fz_save_pixmap_as_png(ctx, pix, filename);
	}
	fz_always(ctx)
	{
		fz_drop_pixmap(ctx, pix);
	}
	fz_catch(ctx)
	{
		fprintf(stderr, "save_png failed!\n");
		fz_drop_context(ctx);
		exit(EXIT_FAILURE);
	}

	fz_drop_context(ctx);
}


MSC_VER))
    #include <crtdbg.h>				/* for _CrtDbgReport */
    /* Use MessageBox(NULL, msg, "warning", MB_OK)' instead of the other calls if you want to debug a Win32 service */
    /* Remember to activate the 'allow service to interact with desktop' flag of the service */
    #define SOCK_DEBUG_MESSAGE(msg) { _CrtDbgReport(_CRT_WARN, NULL, 0, NULL, "%s\n", msg); fprintf(stderr, "%s\n", msg); }
  #else
    #define SOCK_DEBUG_MESSAGE(msg) { fprintf(stderr, "%s\n", msg); }
  #endif
#endif

/****************************************************
 *                                                  *
 * Exported functions / definitions                 *
 *                                                  *
 ****************************************************/

/* 'checkonly' flag, into the rpsock_bufferize() */
#define SOCKBUF_CHECKONLY 1
/* no 'checkonly' flag, into the rpsock_bufferize() */
#define SOCKBUF_BUFFERIZE 0

/* no 'server' flag; it opens a client socket */
#define SOCKOPEN_CLIENT 0
/* 'server' flag; it opens a server socket */
#define SOCKOPEN_SERVER 1

/*
 * Flags for sock_recv().
 */
#define SOCK_RECEIVEALL_NO	0x00000000	/* Don't wait to receive all data */
#define SOCK_RECEIVEALL_YES	0x00000001	/* Wait to receive all data */

#define SOCK_EOF_ISNT_ERROR	0x00000000	/* Return 0 on EOF */
#define SOCK_EOF_IS_ERROR	0x00000002	/* Return an error on EOF */

/*
 * \}
 */

#ifdef __cplusplus
extern "C" {
#endif

/*
 * \defgroup ExportedFunc Exported Functions
 */

/*
 * \addtogroup ExportedFunc
 * \{
 */

int sock_init(char *errbuf, int errbuflen);
void sock_cleanup(void);
void sock_fmterror(const char *caller, int errcode, char *errbuf, int errbuflen);
void sock_geterror(const char *caller, char *errbuf, int errbufsize);
int sock_initaddress(const char *address, const char *port,
    struct addrinfo *hints, struct addrinfo **addrinfo,
    char *errbuf, int errbuflen);
int sock_recv(SOCKET sock, void *buffer, size_t size, int receiveall,
    char *errbuf, int errbuflen);
int sock_recv_dgram(SOCKET sock, void *buffer, size_t size,
    char *errbuf, int errbuflen);
SOCKET sock_open(struct addrinfo *addrinfo, int server, int nconn, char *errbuf, int errbuflen);
int sock_close(SOCKET sock, char *errbuf, int errbuflen);

int sock_send(SOCKET sock, const char *buffer, size_t size,
    char *errbuf, int errbuflen);
int sock_bufferize(const char *buffer, int size, char *tempbuf, int *offset, int totsize, int checkonly, char *errbuf, int errbuflen);
int sock_discard(SOCKET sock, int size, char *errbuf, int errbuflen);
int	sock_check_hostlist(char *hostlist, const char *sep, struct sockaddr_storage *from, char *errbuf, int errbuflen);
int sock_cmpaddr(struct sockaddr_storage *first, struct sockaddr_storage *second);

int sock_getmyinfo(SOCKET sock, char *address, int addrlen, char *port, int portlen, int flags, char *errbuf, int errbuflen);

int sock_getascii_addrport(const struct sockaddr_storage *sockaddr, char *address, int addrlen, char *port, int portlen, int flags, char *errbuf, int errbuflen);
int sock_present2network(const char *address, struct sockaddr_storage *sockaddr, int addr_family, char *errbuf, int errbuflen);

#ifdef __cplusplus
}
#endif

/*
 * \}
 */

/*
 * \}
 */

#endif


mary>
  /// The field to sort Java Servers.
    ///
  /// </summary>
  public enum JavaServerSortBy {
      [EnumMember(Value = "serverName")]
      ServerName,
      [EnumMember(Value = "serverVersion")]
      ServerVersion,
      [EnumMember(Value = "serverInstanceCount")]
      ServerInstanceCount,
      [EnumMember(Value = "approximateDeployedApplicationCount")]
      ApproximateDeployedApplicationCount,
      [EnumMember(Value = "timeFirstSeen")]
      TimeFirstSeen,
      [EnumMember(Value = "timeLastSeen")]
      TimeLastSeen
  }
}


/***************************************************************************
 *   Copyright (C) 2007 by Diolan                                          *
 *   www.diolan.com                                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifndef USAGE_UPDATE_H_INCLUDED
#define USAGE_UPDATE_H_INCLUDED

#include "../osdep/osdep.h"

#include "usage_descriptor.h"

class UsageUpdate
{
public:

	/**
	*	Initializes usage descriptor object.
	*/
	UsageUpdate(
		unsigned int id,	/**< Numerical ID for current argument. */
		UsageDescriptor::ValueRelevance valueRelevance, /**< The relevance of the value for current argument. */
		std::string valueAlias, /**< Alias for value to be displayed in usage. */
		std::string description /**< Argument description to be displayed in usage. */
		);

	/**
	*	Checks whether current usage descriptor has the numerical ID equal to provided one.
	*
	*   @param	id	Numerical ID to check with.
	*   @return
	*		\arg true if id corresponds to current usage descriptor.
	*		\arg false if id doesn't corresponds to current usage descriptor.
	*/
	bool operator==(const unsigned int &id);

	operator unsigned int() const
	{ return _id;};
	std::string valueAlias() const {return _valueAlias;};
	std::string description() const {return _description;};
	UsageDescriptor::ValueRelevance valueRelevance() const {return _valueRelevance;};
private:
	unsigned int _id;	/**< Numerical ID for current argument. */
	UsageDescriptor::ValueRelevance _valueRelevance;	/**< The relevance of the value for current argument. */
	std::string _valueAlias;		/**< Alias for value to be displayed in usage. */
	std::string _description;	/**< Argument description to be displayed in usage. */
};

#endif // USAGE_UPDATE_H_INCLUDED


 $0xee, XM0, XM1, XM0
    movdqu XM0, 16(ARG1)

    movdqu XM1, XM2
    vpslldq $4, XM2, XM3
    vpxor XM3, XM2, XM2
    vpslldq $4, XM3, XM3
    vpxor XM3, XM2, XM2
    vpslldq $4, XM3, XM3
    vpxor XM3, XM2, XM2
    vpermilps $0xff, XM0, XM3
    vpxor XM3, XM2, XM2
    movdqu XM2, 32(ARG1)

    vshufps $0x4e, XM2, XM0, XM1
    aeskeygenassist $0x02, XM2, XM0
    KEY_EXPANSION_HELPER_192 XM1, XM3
    vpermilps $0xff, XM0, XM0
    vpxor XM1, XM0, XM0
    movdqu XM0, 48(ARG1)

    vshufps $0x4e, XM0, XM2, XM1
    vpslldq $8, XM1, XM2
    vpslldq $4, XM2, XM3
    vpxor  XM3, XM2, XM2
    vpermilps $0xff, XM0, XM3
    vpxor  XM3, XM2, XM2
    aeskeygenassist $0x04, XM2, XM3
    vpermilps $0xff, XM3, XM3
    vpsrldq $8, XM1, XM4
    vpslldq $12, XM4, XM4
    vpxor  XM4, XM1, XM1
    vpxor  XM3, XM1, XM1
    vshufps $0xee, XM1, XM2, XM2
    movdqu XM2, 64(ARG1)

    vshufps $0x4e, XM2, XM0, XM1
    KEY_EXPANSION_HELPER_192 XM1, XM3
    vpermilps $0xff, XM2, XM0
    vpxor XM1, XM0, XM0
    movdqu XM0, 80(ARG1)

    vshufps $0x4e, XM0, XM2, XM1
    aeskeygenassist $0x08, XM0, XM2
    KEY_EXPANSION_HELPER_192 XM1, XM3
    vpermilps $0xff, XM2, XM2
    vpxor XM1, XM2, XM2
    movdqu XM2, 96(ARG1)

    vshufps $0x4e, XM2, XM0, XM1
    vpslldq $8, XM1, XM0
    vpslldq $4, XM0, XM3
    vpxor  XM3, XM0, XM0
    vpermilps $0xff, XM2, XM3
    vpxor  XM3, XM0, XM0
    aeskeygenassist $0x10, XM0, XM3
    vpermilps $0xff, XM3, XM3
    vpsrldq $8, XM1, XM4
    vpslldq $12, XM4, XM4
    vpxor  XM4, XM1, XM1
    vpxor  XM3, XM1, XM1
    vshufps $0xee, XM1, XM0, XM0
    movdqu XM0, 112(ARG1)

    vshufps $0x4e, XM0, XM2, XM1
    KEY_EXPANSION_HELPER_192 XM1, XM3
    vpermilps $0xff, XM0, XM2
    vpxor XM1, XM2, XM2
    movdqu XM2, 128(ARG1)

    vshufps $0x4e, XM2, XM0, XM1
    aeskeygenassist $0x20, XM


.login(url, username, password);

	let map: Map<string, Evaluation[]> = new Map();

	for(let i = 0; i < 3; i++)
	{
		const skills = await session.evaluations(`Trimestre ${i+1}`);

		skills.forEach(
			area =>
			{
				let evaluations: Evaluation[];

				if(map.has(area.name)) evaluations = map.get(area.name);
				else evaluations = [];

				area.evaluations.forEach(
					e =>
					{
						let level = new Evaluation(e.name, e.coefficient, e.date);

						e.levels.forEach(
							l =>
							{
								level.levels.push(
									{
										name: l.name,
										short: l.value.short as evaluationShort,
										long: l.value.long as evaluationLong
									}
								);
							}
						);

						// _e.levels.forEach(
						// 	l =>
						// 	{
						// 		levels.push({
						// 			short: l.value.short as evaluationShort,
						// 			long: l.value.long as evaluationLong
						// 		});

						// 		moyenne[l.value.short]++;
						// 		if(l.value.short != 'Abs' && l.value.short != 'Ne') moyenne['Total']++;
						// 	}
						// );

						evaluations.push(level);
					}
				);

				map.set(area.name, evaluations);
			}
		);
	}

	console.log(map);

	let moyenne: Map<string, Map<string, Moyenne>> = new Map();

	map.forEach(
		(area, key) =>
		{
			let m: Map<string, Moyenne> = new Map();

			let areaM = new Moyenne(key, area[0].coef);

			area.forEach(
				e =>
				{
					var _date = `${e.date.getMonth()}/${e.date.getFullYear()}`;

					let _m: Moyenne;

					if(m.has(_date)) _m = m.get(_date);
					else _m = new Moyenne(key, e.coef);

					e.levels.forEach(
						l =>
						{
							_m.increment(l.short);
							areaM.increment(l.short);
						}
					);

					_m.calculate();

					m.set(_date, _m);
				}
			);

			areaM.calculate();

			m.set('$All', areaM);

			moyenne.set(key, m);
		}
	);

	console.log(moyenne);

	// let moyenne = { 'A+': 0, 'A': 0, 'C': 0, 'E': 0, 'Abs': 0, 'Ne': 0, 'Total': 0 };

	// map.forEach(
	// 	(_m, key) =>
	// 	{
	// 		str += `${key}: \n`;

	// 		_m.forEach(
	// 			(evalNote, evalName) =>
	// 			{
	// 				str += `  ${evalName}: \n`;
	// 				evalNote.forEach(n => str += `   - ${getColor(n.short)}${n.long}\u001b[0m\n`)
	// 			}
	// 		)
	// 	}
	// );

	fs.writeFileSync("./index.html",
		`<html>

<head>
	<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
	<script type="text/javascript">
		google.charts.load('current', { 'packages': ['corechart'] });
		google.charts.setOnLoadCallback(drawChart);

		function drawChart()
		{
			var data = google.visualization.arrayToDataTable([
				['Mois', 'Moyenne', 'Français', 'Anglais'],
				['07/20


 la pantalla parece trivial, hay muchas formas de hacerlo y muchas trampas, según el efecto que busque. De hecho, hay una [API de arrastrar y soltar](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API) completa que puedes probar. No lo usamos en este módulo porque el efecto que queríamos era algo diferente, pero pruebe esta API en su propio proyecto y vea lo que puede lograr.

** Tarea: [Trabajar un poco más con el DOM](assignment.es.md)

# टेरारियम प्रोजेक्ट पार्ट 2: सीएसएस का परिचय

![सीएसएस का परिचय](/sketchnotes/webdev101-css.png)
> [टोमोमी इमुरा](https://twitter.com/girlie_mac) द्वारा स्केचनेट

## पूर्व व्याख्यान प्रश्नोत्तरी

[पूर्व व्याख्यान प्रश्नोत्तरी](https://ashy-river-0debb7803.1.azurestaticapps.net/quiz/17?loc=hi)

### परिचय

CSS, या कैस्केडिंग स्टाइल शीट्स, वेब विकास की एक महत्वपूर्ण समस्या को हल करते हैं: आपकी वेब साइट को कैसे अच्छा बनाया जाए। अपने ऐप्स को स्टाइल करना उन्हें अधिक उपयोगी और अच्छे दिखने वाला बनाता है; आप रिस्पॉन्सिव वेब डिज़ाइन (RWD) बनाने के लिए CSS का भी उपयोग कर सकते हैं - जिससे आपके ऐप्स को कोई फर्क नहीं पड़ता कि वे किस स्क्रीन के आकार को प्रदर्शित करते हैं। CSS केवल आपके ऐप को अच्छा बनाने के बारे में नहीं है; इसकी कल्पना में एनिमेशन और ट्रांसफ़ॉर्म शामिल हैं जो आपके ऐप्स के लि


u32, u32, u32) = (2, 13, 22);
    const BIG_SIGMA_1: (u32, u32, u32) = (6, 11, 25);
    const SMALL_SIGMA_0: (u32, u32, usize) = (7, 18, 3);
    const SMALL_SIGMA_1: (u32, u32, usize) = (17, 19, 10);

    // FIPS 180-4 4.2.2
    const K: &'static [Self] = &[
        Self(0x428a2f98),
        Self(0x71374491),
        Self(0xb5c0fbcf),
        Self(0xe9b5dba5),
        Self(0x3956c25b),
        Self(0x59f111f1),
        Self(0x923f82a4),
        Self(0xab1c5ed5),
        Self(0xd807aa98),
        Self(0x12835b01),
        Self(0x243185be),
        Self(0x550c7dc3),
        Self(0x72be5d74),
        Self(0x80deb1fe),
        Self(0x9bdc06a7),
        Self(0xc19bf174),
        Self(0xe49b69c1),
        Self(0xefbe4786),
        Self(0x0fc19dc6),
        Self(0x240ca1cc),
        Self(0x2de92c6f),
        Self(0x4a7484aa),
        Self(0x5cb0a9dc),
        Self(0x76f988da),
        Self(0x983e5152),
        Self(0xa831c66d),
        Self(0xb00327c8),
        Self(0xbf597fc7),
        Self(0xc6e00bf3),
        Self(0xd5a79147),
        Self(0x06ca6351),
        Self(0x14292967),
        Self(0x27b70a85),
        Self(0x2e1b2138),
        Self(0x4d2c6dfc),
        Self(0x53380d13),
        Self(0x650a7354),
        Self(0x766a0abb),
        Self(0x81c2c92e),
        Self(0x92722c85),
        Self(0xa2bfe8a1),
        Self(0xa81a664b),
        Self(0xc24b8b70),
        Self(0xc76c51a3),
        Self(0xd192e819),
        Self(0xd6990624),
        Self(0xf40e3585),
        Self(0x106aa070),
        Self(0x19a4c116),
        Self(0x1e376c08),
        Self(0x2748774c),
        Self(0x34b0bcb5),
        Self(0x391c0cb3),
        Self(0x4ed8aa4a),
        Self(0x5b9cca4f),
        Self(0x682e6ff3),
        Self(0x748f82ee),
        Self(0x78a5636f),
        Self(0x84c87814),
        Self(0x8cc70208),
        Self(0x90befffa),
        Self(0xa4506ceb),
        Self(0xbef9a3f7),
        Self(0xc67178f2),
    ];
}

impl Word for Wrapping<u64> {
    const ZERO: Self = Self(0);
    type InputBytes = [u8; 8];

    #[inline(always)]
    fn from_be_bytes(input: Self::InputBytes) -> Self {
        Self(u64::from_be_bytes(input))
    }

    #[


Id) -> (Balance, Balance) {
		let trading_pair = TradingPair::new(currency_id_a, currency_id_b);
		let (pool_0, pool_1) = Self::liquidity_pool(trading_pair);
		if currency_id_a == trading_pair.0 {
			(pool_0, pool_1)
		} else {
			(pool_1, pool_0)
		}
	}

	/// Swap native token for social token
	/// Exact native token in, social token out
	#[transactional]
	fn do_swap_native_token_for_social_token(
		who: &T::AccountId,
		supply_currency: FungibleTokenId,
		amount_in: Balance,
		target_currency: FungibleTokenId,
		amount_out_min: Balance,
	) -> Result<Balance, DispatchError> {
		ensure!(
			supply_currency.is_native_token_currency_id(),
			Error::<T>::InvalidTradingCurrency
		);
		ensure!(
			target_currency.is_social_token_currency_id(),
			Error::<T>::InvalidTradingCurrency
		);

		ensure!(
			matches!(
				Self::trading_pair_statuses(TradingPair::new(supply_currency, target_currency)),
				TradingPairStatus::Enabled
			),
			Error::<T>::TradingPairMustBeEnabled
		);

		let (supply_pool, target_pool) = Self::get_liquidity(supply_currency, target_currency);
		ensure!(
			!supply_pool.is_zero() && !target_pool.is_zero(),
			Error::<T>::InsufficientLiquidity
		);

		let social_token_out = Self::get_amount_out(supply_pool, target_pool, amount_in);
		ensure!(!social_token_out.is_zero(), Error::<T>::InsufficientLiquidity);

		ensure!(social_token_out >= amount_out_min, Error::<T>::InsufficientTargetAmount);

		let dex_module_account_id = Self::account_id();

		// Transfer native token in
		let native_token_amount_in_balance: BalanceOf<T> =
			TryInto::<BalanceOf<T>>::try_into(amount_in).unwrap_or_default();
		T::NativeCurrency::transfer(
			who,
			&dex_module_account_id,
			native_token_amount_in_balance,
			ExistenceRequirement::KeepAlive,
		)?;

		Self::_swap(supply_currency, target_currency, amount_in, social_token_out);

		// Transfer out the social token
		T::FungibleTokenCurrency::transfer(target_currency, &dex_module_account_id, who, social_token_out)?;

		Self::deposit_event(Event::Swap(
			who.clone(),
			vec![supply_currency, target_currency],
			amount_in,
			social_token_out,
		));

		Ok(social_token_out)
	}

	/// Swap social token with exact target native token
	/// Social token in, Exact native token out
	#[transactional]
	fn do_swap_token_for_exact_native_token(
		who: &T::AccountId,
		supply_currency: FungibleTokenId,
		target_currency: FungibleTokenId,
		amount_out: Balance,
		amount_in_max: Balance,
	) -> Result<Balance, DispatchError> {
		ensure!(
			supply_currency.is_social_token_currency_id(),
			Error::<T>::InvalidTradingCurrency
		);
		ensure!(
			target_currency.is_native_token_currency_id(),
			Error::<T>::InvalidTradingCurrency
		);

		ensure!(
			matches!(
				Self::trading_pair_statuses(TradingPair::new(supp


error('all args must have same length!');
    }

    // invoke native method
    final resultBatch = await kAmapLocationFluttifyChannel.invokeMethod('com.amap.api.location.AMapLocationClient::getDeviceId_batch', [for (int __i__ = 0; __i__ < var0.length; __i__++) {"var0": var0[__i__]}]);

    return (resultBatch as List).cast<String>().map((__result__) => __result__).toList();
  }

  //endregion
}// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import, unused_local_variable, dead_code, unnecessary_cast
//////////////////////////////////////////////////////////
// GENERATED BY FLUTTIFY. DO NOT EDIT IT.
//////////////////////////////////////////////////////////

import 'dart:typed_data';

import 'package:amap_map_fluttify/src/ios/ios.export.g.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';

import 'package:foundation_fluttify/foundation_fluttify.dart';
import 'package:core_location_fluttify/core_location_fluttify.dart';

class MAHeatMapVectorOverlayRender extends MAOverlayRenderer  {
  //region constants
  static const String name__ = 'MAHeatMapVectorOverlayRender';

  @override
  final String tag__ = 'amap_map_fluttify';

  //endregion

  //region creators
  static Future<MAHeatMapVectorOverlayRender> create__({ bool init = true /* ios only */ }) async {
    final refId = await MethodChannel('me.yohom/amap_map_fluttify', StandardMethodCodec(FluttifyMessageCodec('amap_map_fluttify'))).invokeMethod('ObjectFactory::createMAHeatMapVectorOverlayRender', {'init': init});
    final object = MAHeatMapVectorOverlayRender()..refId = refId;
    return object;
  }

  static Future<List<MAHeatMapVectorOverlayRender>> create_batch__(int length, { bool init = true /* ios only */ }) async {
    if (false) {
      return Future.error('all args must have same length!');
    }
    final List resultBatch = await MethodChannel('me.yohom/amap_map_fluttify', StandardMethodCodec(FluttifyMessageCodec('amap_map_fluttify'))).invokeMethod('ObjectFactory::create_batchMAHeatMapVectorOverlayRender', {'length': length, 'init': init});

    final List<MAHeatMapVectorOverlayRender> typedResult = resultBatch.map((result) => MAHeatMapVectorOverlayRender()..refId = result).toList();
    return typedResult;
  }

  //endregion

  //region getters
  Future<MAHeatMapVectorOverlay> get_heatOverlay() async {
    final __result__ = await MethodChannel('me.yohom/amap_map_fluttify', StandardMethodCodec(FluttifyMessageCodec('amap_map_fluttify'))).invokeMethod("MAHeatMapVectorOverlayRender::get_heatOverlay", {'__this__': this});
    return __result__ == null ? null : (MAHeatMapVectorOverlay()..refId = __result__);
  }

  //endregion

  //region setters

  //endregion

  //region methods

  Future<MAHeatMapVectorOverlayRender> initWithHeatOverlay(MAHeatMapVectorOverlay heatOverlay) async {
    // print log
    if (fluttifyLogEnabled) {
      debugPrint('fluttify-dart: MAHeatMapVectorOverlayRender@$refId::initWithHeatOverlay([])');
    }

    // invoke native method
    final __result__ = await MethodChannel('me.yohom/amap_map_fluttify', StandardMethodCodec(FluttifyMessageCodec(


lue: u8) -> EPI_HB16CFG3_RDWSR {
        match value {
            0 => EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_2,
            1 => EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_4,
            2 => EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_6,
            3 => EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_8,
            _ => unreachable!(),
        }
    }
    #[doc = "Checks if the value of the field is `EPI_HB16CFG3_RDWS_2`"]
    #[inline(always)]
    pub fn is_epi_hb16cfg3_rdws_2(&self) -> bool {
        *self == EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_2
    }
    #[doc = "Checks if the value of the field is `EPI_HB16CFG3_RDWS_4`"]
    #[inline(always)]
    pub fn is_epi_hb16cfg3_rdws_4(&self) -> bool {
        *self == EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_4
    }
    #[doc = "Checks if the value of the field is `EPI_HB16CFG3_RDWS_6`"]
    #[inline(always)]
    pub fn is_epi_hb16cfg3_rdws_6(&self) -> bool {
        *self == EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_6
    }
    #[doc = "Checks if the value of the field is `EPI_HB16CFG3_RDWS_8`"]
    #[inline(always)]
    pub fn is_epi_hb16cfg3_rdws_8(&self) -> bool {
        *self == EPI_HB16CFG3_RDWSR::EPI_HB16CFG3_RDWS_8
    }
}
#[doc = "Values that can be written to the field `EPI_HB16CFG3_RDWS`"]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum EPI_HB16CFG3_RDWSW {
    #[doc = "Active RDn is 2 EPI clocks"]
    EPI_HB16CFG3_RDWS_2,
    #[doc = "Active RDn is 4 EPI clocks"]
    EPI_HB16CFG3_RDWS_4,
    #[doc = "Active RDn is 6 EPI clocks"]
    EPI_HB16CFG3_RDWS_6,
    #[doc = "Active RDn is 8 EPI clocks"]
    EPI_HB16CFG3_RDWS_8,
}
impl EPI_HB16CFG3_RDWSW {
    #[allow(missing_docs)]
    #[doc(hidden)]
    #[inline(always)]
    pub fn _bits(&self) -> u8 {
        match *self {
            EPI_HB16CFG3_RDWSW::EPI_HB16CFG3_RDWS_2 => 0,
            EPI_HB16CFG3_RDWSW::EPI_HB16CFG3_RDWS_4 => 1,
            EPI_HB16CFG3_RDWSW::EPI_HB16CFG3_RDWS_6 => 2,
            EPI_HB16CFG3_RDWSW::EPI_HB16CFG3_RDWS_8 => 3,
        }
    }
}
#[doc = r"Proxy"]
pub struct _EPI_HB16CFG3_RDWSW<'a> {
    w: &'a mut W,
}
impl<'a> _EPI_HB16CFG3_RDWSW<'a> {
    #[doc = r"Writes `variant` to the field"]
    #[inline(always)]
    pub fn variant(self, variant: EPI_HB16CFG3_RDWSW)


ts */
.scroll-wrapper {
	overflow-x: auto;
	white-space: nowrap;
	-webkit-overflow-scrolling: touch;
	padding: 1rem 0;
}

.scroll-wrapper ul {
	display: inline-flex;
	padding: 0;
	margin: 0;
}

.scroll-wrapper ul li {
	display: inline-block;
	margin-right: 1rem;
	width: 100%; /* Ensure buttons take full width on smaller screens */
	box-sizing: border-box;
}

/* End of Responsive Tables & Button Section */

/* Menu Button */
#navPanelToggle {
	display: block; /* Ensure the button is displayed as a block element */
	position: fixed; /* Position the button fixed on the viewport */
	top: 1rem; /* Adjust top position as needed */
	right: 1rem; /* Adjust right position as needed */
	z-index: 1000; /* Ensure the button appears above other content */
	padding: 0.5rem 1rem; /* Add padding to the button */
	background-color: #18bfef; /* Button background color */
	color: #fff; /* Button text color */
	border: none; /* Remove button border */
	border-radius: 0.25rem; /* Apply border radius */
	font-size: 1rem; /* Button font size */
	text-decoration: none; /* Remove default link underline */
}

#navPanelToggle:hover {
	background-color: #FFA500; /* Change background color on hover */
	color: #fff; /* Change text color on hover */

}

.center-container {
	display: flex;
	justify-content: center;
	width: 100%;
	text-align: center;
}

.center-container h2 {
	margin: 0; /* Optional: to remove any default margins */
}
/* End of personally added CSS */

/* Form */

form {
	margin: 0 0 2rem 0;
}

form > :last-child {
	margin-bottom: 0;
}

form > .fields {
	display: -moz-flex;
	display: -webkit-flex;
	display: -ms-flex;
	display: flex;
	-moz-flex-wrap: wrap;
	-webkit-flex-wrap: wrap;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	width: calc(100% + 3rem);
	margin: -1.5rem 0 2rem -1.5rem;
}

form > .fields > .field {
	-moz-flex-grow: 0;
	-webkit-flex-grow: 0;
	-ms-flex-grow: 0;
	flex-grow: 0;
	-moz-flex-shrink: 0;
	-webkit-flex-shrink: 0;
	-ms-flex-shrink: 0;
	flex-shrink: 0;
	padding: 1.5rem 0 0 1.5rem;
	width: calc(100% - 1.5rem);
}

form > .fields > .field.half {
	width: calc(50% - 0.75rem);
}

form > .fields > .field.third {
	width: calc(100%/3 - 0.5rem);
}

form > .fields > .field.quarter {
	width: calc(25% - 0.375rem);
}

@media screen and (max-width: 480px) {

	form > .fields {
		width: calc(100% + 3rem);
		margin: -1.5rem 0 2rem -1.5rem;
	}

	form > .fields > .field {
		padding: 1.5rem 0 0 1.5rem;
		width: calc(100% - 1.5rem);
	}

	form > .fields > .field.half {
		width: calc(100% - 1.5rem);
	}

	form > .fields


buildCounterSslPoliciesList++;
  if (buildCounterSslPoliciesList < 3) {
    o.id = 'foo';
    o.items = buildUnnamed788();
    o.kind = 'foo';
    o.nextPageToken = 'foo';
    o.selfLink = 'foo';
    o.warning = buildSslPoliciesListWarning();
  }
  buildCounterSslPoliciesList--;
  return o;
}

void checkSslPoliciesList(api.SslPoliciesList o) {
  buildCounterSslPoliciesList++;
  if (buildCounterSslPoliciesList < 3) {
    unittest.expect(o.id!, unittest.equals('foo'));
    checkUnnamed788(o.items!);
    unittest.expect(o.kind!, unittest.equals('foo'));
    unittest.expect(o.nextPageToken!, unittest.equals('foo'));
    unittest.expect(o.selfLink!, unittest.equals('foo'));
    checkSslPoliciesListWarning(o.warning!);
  }
  buildCounterSslPoliciesList--;
}

core.List<core.String> buildUnnamed790() => ['foo', 'foo'];

void checkUnnamed790(core.List<core.String> o) {
  unittest.expect(o, unittest.hasLength(2));
  unittest.expect(o[0], unittest.equals('foo'));
  unittest.expect(o[1], unittest.equals('foo'));
}

core.int buildCounterSslPoliciesListAvailableFeaturesResponse = 0;
api.SslPoliciesListAvailableFeaturesResponse
buildSslPoliciesListAvailableFeaturesResponse() {
  final o = api.SslPoliciesListAvailableFeaturesResponse();
  buildCounterSslPoliciesListAvailableFeaturesResponse++;
  if (buildCounterSslPoliciesListAvailableFeaturesResponse < 3) {
    o.features = buildUnnamed790();
  }
  buildCounterSslPoliciesListAvailableFeaturesResponse--;
  return o;
}

void checkSslPoliciesListAvailableFeaturesResponse(
  api.SslPoliciesListAvailableFeaturesResponse o,
) {
  buildCounterSslPoliciesListAvailableFeaturesResponse++;
  if (buildCounterSslPoliciesListAvailableFeaturesResponse < 3) {
    checkUnnamed790(o.features!);
  }
  buildCounterSslPoliciesListAvailableFeaturesResponse--;
}

core.List<api.SslPolicy> buildUnnamed791() => [
  buildSslPolicy(),
  buildSslPolicy(),
];

void checkUnnamed791(core.List<api.SslPolicy> o) {
  unittest.expect(o, unittest.hasLength(2));
  checkSslPolicy(o[0]);
  checkSslPolicy(o[1]);
}

core.int buildCounterSslPoliciesScopedListWarningData = 0;
api.SslPoliciesScopedListWarningData buildSslPoliciesScopedListWarningData() {
  final o = api.SslPoliciesScopedListWarningData();
  buildCounterSslPoliciesScopedListWarningData++;
  if (buildCounterSslPoliciesScopedListWarningData < 3) {
    o.key = 'foo';
    o.value = 'foo';
  }
  buildCounterSslPoliciesScopedListWarningData--;
  return o;
}

void checkSslPoliciesScopedListWarningData(
  api.SslPoliciesScopedListWarningData o,
) {
  buildCounterSslPoliciesScopedListWarningData++;
  if (buildCounterSslPoliciesScopedListWarningData < 3) {
    unittest.expect(o.key!, unittest.equals('foo'));
    unittest.expect(o.value!, unittest.equals('foo'));
  }
  buildCounterSslPoliciesScopedListWarningData--;
}

core.List<api.SslPolicies


Game(player.guildId);
            newLoadedConfig.multiplier = Math.max(1, newLoadedConfig.multiplier - calcAmount);
            newLoadedConfig.spells.activeBless = Math.max(0, newLoadedConfig.spells.activeBless - calcAmount);
            newLoadedConfig.multiplier = newLoadedConfig.multiplier <= 0 ? 1 : newLoadedConfig.multiplier;
            await this.Database.updateGame(player.guildId, newLoadedConfig);
            actionsChannel.send(this.setImportantMessage(`${player.name}${player.titles.current !== 'None' ? ` the ${player.titles.current}` : ''}s${calcAmount > 1 ? ` ${calcAmount}x ` : ' '}${spell} just wore off.\nCurrent Active Bless: ${newLoadedConfig.spells.activeBless}\nCurrent Multiplier is: ${newLoadedConfig.multiplier}x`));
          }, 1800000 * 2); // 60 minutes
        } else {
          author.send(`You do not have enough gold! This spell costs ${globalSpells.bless.spellCost} gold. You're lacking ${globalSpells.bless.spellCost - player.gold.current} gold.`);
        }
        break;

      case 'home':
        if (player.gold.current >= globalSpells.home.spellCost) {
          player.gold.current -= globalSpells.home.spellCost;
          const randomHome = this.MapManager.getRandomTown();
          player.map = randomHome;
          actionsChannel.send(`${player.name}${player.titles.current !== 'None' ? ` the ${player.titles.current}` : ''} just cast ${spell} and teleported back to ${randomHome.name}.`);
          author.send(`Teleported back to ${randomHome.name}.`);
          await this.Database.savePlayer(player)
            .then(() => {
              author.send('Spell has been cast!');
            });
        } else {
          author.send(`You do not have enough gold! This spell costs ${globalSpells.home.spellCost} gold.You are lacking ${globalSpells.home.spellCost - player.gold.current} gold.`);
        }
        break;
    }
  }

  async placeBounty(params) {
    const { author, Bot, recipient, amount } = params;
    const bountyPlacer = await this.Database.loadPlayer(author.id, { pastEvents: 0, pastPvpEvents: 0 });
    if (bountyPlacer.gold.current < amount) {
      return author.send('You need more gold to place this bounty');
    }
    const bountyRecipient = await this.Database.loadPlayer(recipient, { pastEvents: 0, pastPvpEvents: 0 });
    if (!bountyRecipient) {
      return author.send('This player does not exist.');
    }

    bountyPlacer.gold.current -= Number(amount);
    bountyRecipient.currentBounty += Number(amount);
    const actionsChannel = await Bot.guilds.cache.get(bountyPlacer.guildId).channels.cache.find(channel => channel.name === 'actions' && channel.type === 'text');
    await this.Database.savePlayer(bountyPlacer);
    await this.Database.savePlayer(bountyRecipient);
    await actionsChannel.send(this.setImportantMessage(`${bountyPlacer.name} just put a bounty of ${amount} gold on ${bountyRecipient.name}'s head!`));

    return author.send(`Bounty of ${amount} placed on ${bountyRecipient.name}'s head!`);
  }

  async playerEventLog(params) {
    const { author, amount } = params;
    const playerLog = await this.Database.loadActionLog(author);
    if (playerLog.log) {
      return this.generateLog(playerLog.log, amount);
    }
  }

  async playerPvpLog(params) {
    const { author, amount } = params;
    const playerLog = await this.Database.loadPvpLog(author);
    if (playerLog.log) {
      return this.generateLog(pl


量名)`，如`$(var)`

##### 示例

```makefile
src=add.o div.o multi.o sub.o main.o
target=app
$(target):$(src)
	$(CC) $^ -o $@

add.o:add.c
	$(CC) -c $^ -o $@

div.o:div.c
	$(CC) -c $^ -o $@

multi.o:multi.c
	$(CC) -c $^ -o $@

sub.o:sub.c
	$(CC) -c $^ -o $@

main.o:main.c
	$(CC) -c $^ -o $@
```

![image-20210902103929268](01Linux系统编程入门/image-20210902103929268.png)

#### 方式四：Makefile+模式匹配

##### 知识点

当所要编译的文件过多时，使用模式匹配能够简化操作

![image-20210902095522095](01Linux系统编程入门/image-20210902095522095.png)

##### 示例

```makefile
src=add.o div.o multi.o sub.o main.o
target=app
$(target):$(src)
	$(CC) $^ -o $@

%.o:%.c
	$(CC) -c $< -o $@
```

![image-20210902104314203](01Linux系统编程入门/image-20210902104314203.png)

#### 方法五：Makefile + 函数

##### 知识点

- `$(wildcard PATTERN...)`

  - 功能：获取指定目录下指定类型的文件列表

  - 参数：PATTERN 指的是某个或多个目录下的对应的某种类型的文件，如果有多个目录，一般使用空格间隔

  - 返回：得到的若干个文件的文件列表，文件名之间使用空格间隔

  - 示例

    ![image-20210902100119333](01Linux系统编程入门/image-20210902100119333.png)

- `$(patsubst <pattern>,<replacement>,<text>)`

  - 功能：查找`<text>`中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式`<pattern>`，如果匹配的话，则以`<replacement>`替换

  - `<pattern>`可以包括通配符`%`，表示任意长度的字串。如果`<replacement>`中也包含`%`，那么，`<replacement>`中的这个`%`将是`<pattern>`中的那个%所代表的字串。(可以用`\`来转义，以`\%`来表示真实含义的`%`字符)

  - 返回：函数返回被替换过后的字符串

  - 示例

    ![image-20210902100350848](01Linux系统编程入门/image-20210902100350848.png)

##### 示例

```makefile
src=$(wildcard ./*.c)
objs=$(patsubst %.c, %.o, $(src))
target=app
$(target):$(objs)
	$(CC) $^ -o $@

%.o:%.c
	$(CC) -c $< -o $@
```

![image-20210902104748931](01Linux系统


 || StartValue->getType()->isPointerTy()) &&
         "StartValue is not a pointer for pointer induction");
  assert((IK != IK_IntInduction || StartValue->getType()->isIntegerTy()) &&
         "StartValue is not an integer for integer induction");

  // Check the Step Value. It should be non-zero integer value.
  assert((!getConstIntStepValue() || !getConstIntStepValue()->isZero()) &&
         "Step value is zero");

  assert((IK != IK_PtrInduction || getConstIntStepValue()) &&
         "Step value should be constant for pointer induction");
  assert((IK == IK_FpInduction || Step->getType()->isIntegerTy()) &&
         "StepValue is not an integer");

  assert((IK != IK_FpInduction || Step->getType()->isFloatingPointTy()) &&
         "StepValue is not FP for FpInduction");
  assert((IK != IK_FpInduction ||
          (InductionBinOp &&
           (InductionBinOp->getOpcode() == Instruction::FAdd ||
            InductionBinOp->getOpcode() == Instruction::FSub))) &&
         "Binary opcode should be specified for FP induction");

  if (Casts) {
    for (auto &Inst : *Casts) {
      RedundantCasts.push_back(Inst);
    }
  }
}

int InductionDescriptor::getConsecutiveDirection() const {
  ConstantInt *ConstStep = getConstIntStepValue();
  if (ConstStep && (ConstStep->isOne() || ConstStep->isMinusOne()))
    return ConstStep->getSExtValue();
  return 0;
}

ConstantInt *InductionDescriptor::getConstIntStepValue() const {
  if (isa<SCEVConstant>(Step))
    return dyn_cast<ConstantInt>(cast<SCEVConstant>(Step)->getValue());
  return nullptr;
}

bool InductionDescriptor::isFPInductionPHI(PHINode *Phi, const Loop *TheLoop,
                                           ScalarEvolution *SE,
                                           InductionDescriptor &D) {

  // Here we only handle FP induction variables.
  assert(Phi->getType()->isFloatingPointTy() && "Unexpected Phi type");

  if (TheLoop->getHeader() != Phi->getParent())
    return false;

  // The loop may have multiple entrances or multiple exits; we can analyze
  // this phi if it has a unique entry value and a unique backedge value.
  if (Phi->getNumIncomingValues() != 2)
    return false;
  Value *BEValue = nullptr, *StartValue = nullptr;
  if (TheLoop->contains(Phi->getIncomingBlock(0))) {
    BEValue = Phi->getIncomingValue(0);
    StartValue = Phi->getIncomingValue(1);
  } else {
    assert(TheLoop->contains(Phi->getIncomingBlock(1)) &&
           "Unexpected Phi node in the loop");
    BEValue = Phi->getIncomingValue(1);
    StartValue = Phi->getIncomingValue(0);
  }

  BinaryOperator *BOp = dyn_cast<BinaryOperator>(BEValue);
  if (!BOp)
    return false;

  Value *Addend = nullptr;
  if (BOp->getOpcode() == Instruction::FAdd) {
    if (BOp->getOperand(0) == Phi)
      Addend = BOp->getOperand(1);
    else if (BOp->getOperand(1) == Phi)
      Addend = BOp->getOperand(0);
  } else if (BOp->getOpcode() == Instruction::FSub)
    if (BOp->getOperand(0) == Phi)
      Addend = BOp->getOperand(1);

  if (!Addend)
    return false;

  // The addend should be loop invariant
  if (auto *I = dyn_cast<Instruction>(Addend))
    if (TheLoop->contains(I))
      return false;

  // FP Step has unknown SCEV
  const SCEV *Step = SE->getUnknown(Addend);
  D = InductionDescriptor(StartValue, IK_FpInduction,


ion not found\n");
			goto err;
		}
		ret = acpi_bind_one(dev, adev);
		if (ret)
			goto err;

		if (type->setup) {
			type->setup(dev);
			goto done;
		}
	} else {
		adev = ACPI_COMPANION(dev);

		if (dev_is_pci(dev)) {
			pci_acpi_setup(dev, adev);
			goto done;
		} else if (dev_is_platform(dev)) {
			acpi_configure_pmsi_domain(dev);
		}
	}

	if (adev->handler && adev->handler->bind)
		adev->handler->bind(dev);

done:
	acpi_handle_debug(ACPI_HANDLE(dev), "Bound to device %s\n",
			  dev_name(dev));

	return;

err:
	dev_dbg(dev, "No ACPI support\n");
}

void acpi_device_notify_remove(struct device *dev)
{
	struct acpi_device *adev = ACPI_COMPANION(dev);

	if (!adev)
		return;

	if (dev_is_pci(dev))
		pci_acpi_cleanup(dev, adev);
	else if (adev->handler && adev->handler->unbind)
		adev->handler->unbind(dev);

	acpi_unbind_one(dev);
}


dError: winapi::um::handleapi::INVALID_HANDLE_VALUE,
    }
}

#[cfg(windows)]
fn zeroed_process_information() -> winapi::um::processthreadsapi::PROCESS_INFORMATION {
    winapi::um::processthreadsapi::PROCESS_INFORMATION {
        hProcess: std::ptr::null_mut(),
        hThread: std::ptr::null_mut(),
        dwProcessId: 0,
        dwThreadId: 0,
    }
}

#[cfg(windows)]
fn run_command(cmdline: &str) -> anyhow::Result<TaskResult> {
    // Don't want to run `cmd /c` since that limits cmd line length to 8192 bytes.
    // std::process::Command can't take a string and pass it through to CreateProcess unchanged,
    // so call that ourselves.

    // TODO: Set this to just 0 for console pool jobs.
    let process_flags = winapi::um::winbase::CREATE_NEW_PROCESS_GROUP;

    let mut startup_info = zeroed_startupinfo();
    startup_info.cb = std::mem::size_of::<winapi::um::processthreadsapi::STARTUPINFOA>() as u32;
    startup_info.dwFlags = winapi::um::winbase::STARTF_USESTDHANDLES;

    let mut process_info = zeroed_process_information();

    let mut mut_cmdline = cmdline.to_string() + "\0";

    let create_process_success = unsafe {
        winapi::um::processthreadsapi::CreateProcessA(
            std::ptr::null_mut(),
            mut_cmdline.as_mut_ptr() as *mut i8,
            std::ptr::null_mut(),
            std::ptr::null_mut(),
            /*inherit handles = */ winapi::shared::ntdef::TRUE.into(),
            process_flags,
            std::ptr::null_mut(),
            std::ptr::null_mut(),
            &mut startup_info,
            &mut process_info,
        )
    };
    if create_process_success == 0 {
        // TODO: better error?
        let error = unsafe { winapi::um::errhandlingapi::GetLastError() };
        bail!("CreateProcessA failed: {}", error);
    }

    unsafe {
        winapi::um::handleapi::CloseHandle(process_info.hThread);
    }

    unsafe {
        winapi::um::synchapi::WaitForSingleObject(
            process_info.hProcess,
            winapi::um::winbase::INFINITE,
        );
    }

    let mut exit_code: u32 = 0;
    unsafe {
        winapi::um::processthreadsapi::GetExitCodeProcess(process_info.hProcess, &mut exit_code);
    }

    unsafe {
        winapi::um::handleapi::CloseHandle(process_info.hProcess);
    }

    let mut output = Vec::new();
    // TODO: Set up pipes so that we can print the process's output.
    //output.append(&mut cmd.stdout);
    //output.append(&mut cmd.stderr);
    let success = exit_code == 0;

    Ok(TaskResult {
        success,
        output,
        discovered_deps: None,
    })
}

/// Tracks faked "thread ids" -- integers assigned to build tasks to track
/// paralllelism in perf trace output.
struct ThreadIds {
    /// An entry is true when claimed, false or nonexistent otherwise.
    slots: Vec<bool>,
}
impl ThreadIds {
    fn new() -> Self {
        ThreadIds { slots: Vec::new() }
    }

    fn claim(&mut self) -> usize {
        match self.slots.iter().position(|&used| !used) {
            Some(idx) => {


result = "_parent";
					break;
				case PreloadFlags.Global:
					result = "_global";
					break;
				default:
					result = "";
					break;
			}
			return result;
		}
		public void ToSwf(SwfWriter w)
        {
            w.AppendByte((byte)ActionKind.DefineFunction2);
            w.AppendUI16(Length - 3); // don't incude def byte and len

            w.AppendString(FunctionName);
            w.AppendUI16((uint)Parameters.Count);
            w.AppendByte((byte)RegisterCount);

            w.AppendBit((Preloads & PreloadFlags.Parent) > 0);
            w.AppendBit((Preloads & PreloadFlags.Root) > 0);
            w.AppendBit(SuppressSuperFlag);
            w.AppendBit((Preloads & PreloadFlags.Super) > 0);
            w.AppendBit(SuppressArgumentsFlag);
            w.AppendBit((Preloads & PreloadFlags.Arguments) > 0);
            w.AppendBit(SuppressThisFlag);
            w.AppendBit((Preloads & PreloadFlags.This) > 0);
            w.AppendBits(0, 7);
            w.AppendBit((Preloads & PreloadFlags.Gl


44;
      te[9] = n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44;
      te[13] = n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34;
      te[2] = n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44;
      te[6] = n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44;
      te[10] = n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44;
      te[14] = n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34;
      te[3] = n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43;
      te[7] = n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43;
      te[11] = n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43;
      te[15] = n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33;

      var det = n11 * te[0] + n21 * te[4] + n31 * te[8] + n41 * te[12];

      if (det === 0) {
        throw new Error("Can't invert matrix, determinant is 0");
      }

      Matrix4.multiplyByScalar(result, 1 / det, result);

      return result;
    }

    /**
     * Transposes a matrix.
     *
     * @param {Zia.Matrix4} matrix - The matrix to transpose.
     * @param {Zia.Matrix4} result - The object in which to place the calculated result.
     *
     * @returns {Zia.Matrix4} The modified result parameter.
     *
     * @example
     * var result = Zia.Matrix4.transpose(
     *   Zia.Matrix4.createRotationX(Math.PI, new Zia.Matrix4()),
     *   new Zia.Matrix4());
     */
    static transpose(matrix: Matrix4, result = new Matrix4()) {
      var te = matrix.elements;
      var re = result.elements;
      var tmp: number;

      tmp = te[1]; re[1] = te[4]; re[4] = tmp;
      tmp = te[2]; re[2] = te[8]; re[8] = tmp;
      tmp = te[6]; re[6] = te[9]; re[9] = tmp;

      tmp = te[3]; re[3] = te[12]; re[12] = tmp;
      tmp = te[7]; re[7] = te[13]; re[13] = tmp;
      tmp = te[11]; re[11] = te[14]; re[14] = tmp;

      return result;
    };

    /**
     * Gets the translat


      movapd nb300nf_qq(%esp),%xmm3
        mulpd  %xmm1,%xmm5 ## xmm5=eps*Fp
        addpd  %xmm4,%xmm5 ## xmm5=VV
        mulpd  %xmm3,%xmm5 ## vcoul=qq*VV
        ## at this point mm5 contains vcoul
        ## increment vcoul - then we can get rid of mm5
        ## update vctot
        addpd  nb300nf_vctot(%esp),%xmm5
        movapd %xmm5,nb300nf_vctot(%esp)

        ## should we do one more iteration?
        subl $2,nb300nf_innerk(%esp)
        jl    _nb_kernel300nf_ia32_sse2.nb300nf_checksingle
        jmp   _nb_kernel300nf_ia32_sse2.nb300nf_unroll_loop
_nb_kernel300nf_ia32_sse2.nb300nf_checksingle:
        movl  nb300nf_innerk(%esp),%edx
        andl  $1,%edx
        jnz    _nb_kernel300nf_ia32_sse2.nb300nf_dosingle
        jmp    _nb_kernel300nf_ia32_sse2.nb300nf_updateouterdata
_nb_kernel300nf_ia32_sse2.nb300nf_dosingle:
        movl nb300nf_charge(%ebp),%esi
        movl nb300nf_pos(%ebp),%edi
        movl  nb300nf_innerjjnr(%esp),%ecx
        movl  (%ecx),%eax
        xorpd  %xmm6,%xmm6
        movlpd (%esi,%eax,8),%xmm6      ## xmm6(0) has the charge
        mulsd  nb300nf_iq(%esp),%xmm6
        movapd %xmm6,nb300nf_qq(%esp)

        leal  (%eax,%eax,2),%eax

        ## move coordinates to xmm0-xmm2
        movlpd (%edi,%eax,8),%xmm0
        movlpd 8(%edi,%eax,8),%xmm1
        movlpd 16(%edi,%eax,8),%xmm2

        ## move nb300nf_ix-iz to xmm4-xmm6
        movapd nb300nf_ix(%esp),%xmm4
        movapd nb300nf_iy(%esp),%xmm5
        movapd nb300nf_iz(%esp),%xmm6

        ## calc dr
        subsd %xmm0,%xmm4
        subsd %xmm1,%xmm5
        subsd %xmm2,%xmm6

        ## square it
        mulsd %xmm4,%xmm4
        mulsd %xmm5,%xmm5
        mulsd %xmm6,%xmm6
        addsd %xmm5,%xmm4
        addsd %xmm6,%xmm4
        ## rsq in xmm4

        cvtsd2ss %xmm4,%xmm5
        rsqrtss %xmm5,%xmm5
        cvtss2sd %xmm5,%xmm2    ## lu in low xmm2

        ## lookup seed in xmm2
        movapd %xmm2,%xmm5      ## copy of lu
        mulsd %xmm2,%xmm2       ## lu*lu
        movapd nb300nf_three(%esp),%xmm1
        mulsd %xmm4,%xmm2       ## rsq*lu*lu
        movapd nb300nf_half(%esp),%xmm0
        subsd %xmm2,%xmm1       ## 30-rsq*lu*lu
        mulsd %xmm5,%xmm1
        mulsd %xmm0,%xmm1       ## xmm0=iter1 of rinv (new lu)

        movapd %xmm1,%xmm5      ## copy of lu
        mulsd %xmm1,%xmm1       ## lu*lu
        movapd nb300nf_three(%esp),%xmm2
        mulsd %xmm4,%xmm1       ## rsq*lu*lu
        movapd nb300nf_half


	local newPose = self:GetSurfacePose():GetInverse() * pose
	local rot = newPose:GetRotation()
	if planeSide == geometry.PLANE_SIDE_FRONT then
		rot = rot180Yaw * rot
		if self:IsMirrored() then
			rot:MirrorAxis(math.AXIS_X)
		end
	end
	newPose:SetRotation(rot)
	local pos = newPose:GetOrigin()
	if planeSide == geometry.PLANE_SIDE_FRONT then
		if self:IsMirrored() == false then
			pos:Rotate(rot180Yaw)
		elseif ignoreMirror ~= true then
			pos.z = -pos.z
		end
	end
	newPose:SetOrigin(pos)
	return self:GetTargetPose() * newPose
end
ents.register_component("portal", Component, "gameplay", ents.EntityComponent.FREGISTER_BIT_NETWORKED)
Component.EVENT_ON_PORTAL_ORIGIN_CHANGED =
	ents.register_component_event(ents.COMPONENT_PORTAL, "on_portal_origin_changed")


            },
            right: {
              type: "NumericLiteral",
              value: 3,
            },
          },
        },
      ],
    });
  });

  test("if (x >= 3) x = 5;", () => {
    expect(parser.parse(`if (x >= 3) x = 5;`)).toStrictEqual({
      type: "Program",
      body: [
        {
          type: "IfStatement",
          test: {
            type: "BinaryExpression",
            operator: ">=",
            left: {
              type: "Identifier",
              name: "x",
            },
            right: {
              type: "NumericLiteral",
              value: 3,
            },
          },
          consequent: {
            type: "ExpressionStatement",
            expression: {
              type: "AssignmentExpression",
              operator: "=",
              left: {
                type: "Identifier",
                name: "x",
              },
              right: {
                type: "NumericLiteral",
                value: 5,
              },
            },
          },
          alternate: null,
        },
      ],
    });
  });
});
import { IActions } from '../scenes/Root/rootActions';

export interface ICase<T> {
    state: T;
    payload?: unknown;
}

// fixme: rename ISwitch to SwitchMap
export interface ISwitch<T> {
    [s: string]: ({ state, payload }: ICase<T>) => T;
}

// fixme: rename Switch to SwitchMap
export const createReducer =
    <T>(Switch: ISwitch<T>, stateInit: T) =>
        (state: T = stateInit, { type, payload }: IActions<unknown>): T => (
            Switch.hasOwnProperty(type) ? Switch[type]({ state, payload }) :
                state
        );

export default createReducer;
class Credits extends Phaser.State {

	bg: Phaser.Sprite;
	go: Phaser.Sprite;
	p1: Phaser.Sprite;
	p2: Phaser.Sprite;
	tu: Phaser.Sprite;
	tt: Phaser.Sprite;

	constructor(){
		super();
	}

	preload() {
		 this.load.image('bg', '../images/credits/credit_background.png');
		 this.load.image('go', '../images/credits/game_over.png');
		 this.load.image('p1', '../images/credits/people1.png');
		 this.load.image('p2', '../images/credits/people2.png');
		 this.load.image('tu', '../images/credits/thank_you.png');
		 this.load.image('tt', '../images/credits/the_team.png');

	}

	create() {
		this.bg = this.game.add.sprite(16, 16, 'bg');

		this.tt = this.game.add.sprite(this.game.width/2, 140, 'tt');
		this.tt.anchor.setTo(.5);
		this.tt.alpha = 0;

		this.go = this.game.add.sprite(this.game.width/2, 64, 'go');
		this.go.anchor.setTo(.5);

		this.p1 = this.game.add.sprite(this.game.width/2, 300, 'p1');
		this.p1.anchor.setTo(.5);
		this.p1.alpha = 0;

		this.p2 = this.game.add.sprite(this.game.width/2, 300, 'p2');
		this.p2.anchor.setTo(.5);
		this.p2.alpha = 0;

		this.tu = this.game.add.sprite(this.game.width/2, 300, 'tu');
		this.tu.anchor.setTo(.5);
		this.tu.alpha = 0;

		var tween1 = this.add.tween(this.p1).to({ alpha: 1 }, 2000, Phaser.Easing.Linear.None, true);
		var tweenTt = this.add.tween(this.tt).to({ alpha: 1 }, 2000, Phaser.Easing.Linear.None, true);

		tween1.onComplete.add(function(){
			this.p1.destroy();
			var tween2 = this.add.tween(this.p2).to({ alpha: 1 }, 2000, Phaser.Easing.Linear.None, true);
			tween2.onComplete.add(


data-nestable-action='toggle']
 ========================================================================== */
/*
 * 1. Makes text unselectable. Happens if double clicked by mistake
 */
[data-nestable-action='toggle'] {
  cursor: pointer;
  /* 1 */
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
/* Sub-object `.uk-nestable-toggle`
 ========================================================================== */
.uk-nestable-toggle {
  display: inline-block;
  visibility: hidden;
}
.uk-nestable-toggle:after {
  content: "\f147";
  font-family: FontAwesome;
}
.uk-parent > :not(.uk-nestable-list) .uk-nestable-toggle {
  visibility: visible;
}
/*
 * Collapsed
 */
.uk-collapsed .uk-nestable-list {
  display: none;
}
.uk-collapsed .uk-nestable-toggle:after {
  content: "\f196";
}
/* Sub-object `uk-nestable-panel`
 ========================================================================== */
.uk-nestable-panel {
  padding: 5px;
  background: #f7f7f7;
  border-radius: 4px;
  border: 1px solid rgba(0, 0, 0, 0.2);
  border-bottom-color: rgba(0, 0, 0, 0.3);
  background-origin: border-box;
  background-image: -webkit-linear-gradient(top, #ffffff, #eeeeee);
  background-image: linear-gradient(to bottom, #ffffff, #eeeeee);
  text-shadow: 0 1px 0 #ffffff;
}
/*! UIkit 2.24.2 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
.uk-tooltip{display:none;position:absolute;z-index:1030;box-sizing:border-box;max-width:200px;padding:5px 8px;background:#333;color:rgba(255,255,255,.7);font-size:12px;line-height:18px;border-radius:3px;text-shadow:0 1px 0 rgba(0,0,0,.5)}.uk-tooltip:after{content:"";display:block;position:absolute;width:0;height:0;border:5px dashed #333}.uk-tooltip-top-left:after,.uk-tooltip-top-right:after,.uk-tooltip-top:after{bottom:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent;border-top-color:#333}.uk-tooltip-bottom-left:after,.uk-tooltip-bottom-right:after,.uk-tooltip-bottom:after{top:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent;border-bottom-color:#333}.uk-tooltip-bottom:after,.uk-tooltip-top:after{left:50%;margin-left:-5px}.uk-tooltip-bottom-left:after,.uk-tooltip-top-left:after{left:10px}.uk-tooltip-bottom-right:after,.uk-tooltip-top-right:after{right:10px}.uk-tooltip-left:after{right:-5px;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent;border-left-color:#333}.uk-tooltip-right:after{left:-5px;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent;border-right-color:#333}/*! UIkit 2.24.2 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
.uk-progress{box-sizing:border-box;height:20px;margin-bottom:15px;background:#f7f7f7;overflow:hidden;line-height:20px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.07),inset 0 2px 2px rgba(0,0,0,.07);border-radius:4px}*+.uk-progress{margin-top:15px}.uk-progress-bar{width:0;height:100


 Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*
Argus monitors GitHub and/or other URLs for version changes.
On a version change, send notification(s) and/or webhook(s).
*/
package main

import (
	"flag"
	"fmt"

	_ "modernc.org/sqlite"

	cfg "github.com/release-argus/Argus/config"
	"github.com/release-argus/Argus/db"
	"github.com/release-argus/Argus/testing"
	logutil "github.com/release-argus/Argus/util/log"
	"github.com/release-argus/Argus/web"
)

var (
	configFile       = flag.String("config.file", "config.yml", "Argus configuration file path.")
	configCheckFlag  = flag.Bool("config.check", false, "Print the fully-parsed config.")
	testCommandsFlag = flag.String("test.commands", "", "Put the name of the Service to test the `commands` of.")
	testNotifyFlag   = flag.String("test.notify", "", "Put the name of the Notify service to send a test message.")
	testServiceFlag  = flag.String("test.service", "", "Put the name of the Service to test the version query.")
)

// main loads the config and then calls service.Track to monitor
// each Service of the config for version changes and acts on
// them as defined. It also sets up the Web UI and SaveHandler.
func main() {
	flag.Parse()
	flagset := make(map[string]bool)
	flag.Visit(func(f *flag.Flag) { flagset[f.Name] = true })

	var config cfg.Config
	config.Load(*configFile, &flagset)

	// config.check
	config.Print(configCheckFlag)
	// test.*
	testing.CommandTest(testCommandsFlag, &config)
	testing.NotifyTest(testNotifyFlag, &config)
	testing.ServiceTest(testServiceFlag, &config)

	// Count of active services to monitor (if log level INFO or above).
	if logutil.Log.Level > 1 {
		// Count active services.
		serviceCount := len(config.Order)
		for _, key := range config.Order {
			if !config.Service[key].Options.GetActive() {
				serviceCount--
			}
		}

		// Log active count.
		msg := fmt.Sprintf("Found %d services to monitor:", serviceCount)
		logutil.Log.Info(msg, logutil.LogFrom{}, true)

		// Log names of active services.
		for _, key := range config.Order {
			if config.Service[key].Options.GetActive() {
				fmt.Printf("  - %s\n", config.Service[key].Name)
			}
		}
	}

	// Setup DB and last known service versions.
	db.Run(&config)

	// Track all targets for changes in version and act on any found changes.
	go config.Service.Track(&config.Order, &config.OrderMutex)

	// Web server.
	web.Run(&config)
}
// Copyright [2025] [Argus]
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required


aram url A page URL for which to remove a visit.
     * @param timestamp A unix timestamp, milliseconds, of a visit to be removed.
     */
    suspend fun deleteVisit(url: String, timestamp: Long)
}

/**
 * Information to record about a visit.
 *
 * @property visitType The transition type for this visit. See [VisitType].
 * @property redirectSource Optional; if this visit is redirecting to another page,
 *  what kind of redirect is it? See [RedirectSource] for the options.
 */
data class PageVisit(
    val visitType: VisitType,
    val redirectSource: RedirectSource? = null,
)

/**
 * A redirect source describes how a page redirected to another page.
 */
enum class RedirectSource {
    // The page temporarily redirected to another page.
    TEMPORARY,

    // The page permanently redirected to another page.
    PERMANENT,
}

/**
 * Metadata information observed in a page to record.
 *
 * @property title The title of the page.
 * @property previewImageUrl The preview image of the page (e.g. the hero image), if available.
 */
data class PageObservation(
    val title: String? = null,
    val previewImageUrl: String? = null,
)

/**
 * Information about a top frecent site. This represents a most frequently visited site.
 *
 * @property url The URL of the page that was visited.
 * @property title The title of the page that was visited, if known.
 */
data class TopFrecentSiteInfo(
    val url: String,
    val title: String?,
)

/**
 * Frecency threshold options for fetching top frecent sites.
 */
enum class FrecencyThresholdOption {
    /** Returns all visited pages. */
    NONE,

    /** Skip visited pages that were only visited once. */
    SKIP_ONE_TIME_PAGES,
}

/**
 * Information about a history visit.
 *
 * @property url The URL of the page that was visited.
 * @property title The title of the page that was visited, if known.
 * @property visitTime The time the page was visited in integer milliseconds since the unix epoch.
 * @property visitType What the transition type of the visit is, expressed as [VisitType].
 * @property previewImageUrl The preview image of the page (e.g. the hero image), if available.
 * @property isRemote Distinguishes visits made on the device and those that come from Sync.
 */
data class VisitInfo(
    val url: String,
    val title: String?,
    val visitTime: Long,
    val visitType: VisitType,
    val previewImageUrl: String?,
    var isRemote: Boolean,
)

/**
 * Visit type constants as defined by Desktop Firefox.
 */
@Suppress("MagicNumber")
enum class VisitType(val type: Int) {

    // User followed a link.
    LINK(1),

    // User typed a URL or selected it from the UI (autocomplete results, etc).
    TYPED(2),
    BOOKMARK(3),
    EMBED(4),
    REDIRECT_PERMANENT(5),
    REDIRECT_TEMPORARY(6),
    DOWNLOAD(7),
    FRAMED_LINK(8),
    RELOAD(9),
}

/**
 * Encapsulates a set of properties which define a result of querying history storage.
 *
 * @property id A permanent identifier which might be used for caching or at the UI layer.
 * @property url A URL of the page.
 * @property score An unbounded, nonlinear score (larger is more relevant) which is used to rank
 *  this [SearchResult] against others.
 * @property title An optional title of the page.
 */
data class SearchResult(
    val id: String,
    val url: String,
    val score: Int,
    val title: String? = null,
)
package org.mozilla.rocket.content.news.ui

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.PagedList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.mozilla.focus.tele


kHOdKIYV1yjgW1sDEwtpDdbZj
GMBvwG5gTz+TQuM/8d3czn+bF93ddY/shlUl+51X+T1XDVMiFrYqL225tFVbeQ4vcyS10ShMPx58qb0U
uMw4MQjevp3gwcguOawxZM5xz5b9qBewJkVCG0KEUS3hzaTTz3+IQpO2z7twpbtpHsRcZ5+aaaKwvrul
O+MzMnNJN2fxRVnFwz0TFN8f4b4wGBhPOpx9Xfs9GqAdGRG5sK/xUGxtB0sWR4y2pyZH8p2Qd6RmpCvX
3rdlEi5J1bqpWO/2Z6XOwis5r+ei+G5QCcIDzsRrkY3C818/dwvUPNF2IJGhoM2G29KZUHvyY3jq6n2c
XxdwfwO9LF8yTpgo30vHw1bYJ3qDoTYcbGm4r49wv3L2Wmq36Fx2HXYJAHCPyzk6Y0+Y0ubnzZ/wJGIW
TctRQeW94saD+9fLkGMptFGECdMLfyDV4ElxyR6RUZXekTPap9HKi1gbfHUdzDZfU7cHRife24td5xwE
7HYvFcgFexbJl1TgM/1nksH9amhfn5UiG/fRI2atSDgqncMvZEWK0Qv4uK6eaHpsmmfDJ0zgj//4y6+j
jCiN/nYLX7QULs9awc4GxatQ7/3Bdy3aHQxHFtrm76hcavAI17HsKm3JOck00jEkhGt8vAph15Mf3ELb
XmY1GA9yjdaCdK6UzAVF+rPTtLf1wNt5/wPm83+z+VZmc6FtlPWhc/GjQxS/2LQytY+A7peiQ0ZTy2Wa
tnh4mzD6/Q+/MP39b58ra3C/Nrk3G8OjMFM4vVSU6sIchZ9vK1TbPg9vk+I3z2MKF5mrxOg/Lvatwh22
vWpLQS/Z8XLK9rysPc+/bbco7EmwotBlbDfkj/+9TP/sV04UMeM9bdverH9fqu67QZ1MsOSqbk1ZnZ9V
KZc2Xa5qvlzVhGkrWgaXRYLrWjJf15r5uhbNha2ar23Z3N66ua1zc4VYfRG43ZdceSMVLqWt/fpv5OVu
59wlNrvAM5e3d3GXtYiOev7lv38HAAD//9mDnR4qJAAA
`,
	},

	"/css/app.css": {
		name:    "app.css",
		local:   "ui/css/app.css",
		size:    2681,
		modtime: 1500000000,
		compressed: `
H4sIAAAAAAAC/5xW227jOAx9z1cQCBZpdyuvbSR7cYACA+R5/kG2mFioIhkSHbcz6L8P5FvsOM40yZNK
i4eH5KHYnI7qBVIjPuDnAgAgR3nIKQGAKAxP+bY2mhPavTJVArkUAvV28blYLDOjCTW1jkduD1IzMkUC
m3+K9+0FHEDGVfZUowKrrzzXOIHmJ5kZ3eJUUlCeQDSBOFvaULa


reset command without any pre-configured scope.

`store:allow-save`

Enables the save command without any pre-configured scope.

`store:deny-save`

Denies the save command without any pre-configured scope.

`store:allow-set`

Enables the set command without any pre-configured scope.

`store:deny-set`

Denies the set command without any pre-configured scope.

`store:allow-values`

Enables the values command without any pre-configured scope.

`store:deny-values`

Denies the values command without any pre-configured scope.

# Вклад (CONTRIBUTING)

### Вступление
Если вы заливаете свои изменения в первый раз, то обязательно полностью прочтите данную статью. Так вы минимизируете количество возникающих в процессе вопросов.

## Работа с гитом
Весьма подробный гайд по работе с технологией git на примере консоли, описан на нашей основной Вики: [ССЫЛКА](https://wiki.taucetistation.org/Git/Git-console). Прочитайте на досуге.

#### Готовая помощь

Перед началом работы с проектом зайдите в папку `tools/_git-hooks` и прочитайте README файл. После этого запуститите install скрипт под вашу систему. Так вы подключите к своему локальному репозиторю скрипты, которые облегчат вам вашу жизнь котрибьютера в будущем.

Также в папке `tools/_git-helpers` вы можете найти скрипты, которые исполняют комплексную логику. Всё описание можно найти в README.

### Рекомендации по гиту
В интернете очень много статей на эту тему. Если вы новичок, то прочитайте одну-две. Обратите внимание на такие темы, как: разрешение конфликтов (Merge Conflicts), Git Workflows, атомарные коммиты.

## Коммит
### Оформление
Давайте своим коммитам адекватные названия. Не обязательно помещать в них детальное описание вносимых изменений (хотя и желательно), но имена в формате `fuck`, `shit`, `changes`, `qwerty`, `12345` и т.д. крайне не приветствуются и считаются признаком плохого тона.

Если в своём коммите вы фиксите/закрываете какой-то ишью, не давайте распознава


  int char = source.codeUnitAt(i);
      if (char == 0x0a || char == 0x0d) {
        lineEnd = i;
        break;
      }
    }
    int length = lineEnd - lineStart;
    int start = lineStart;
    int end = lineEnd;
    String prefix = "";
    String postfix = "";
    if (length > 78) {
      // Can't show entire line. Try to anchor at the nearest end, if
      // one is within reach.
      int index = offset - lineStart;
      if (index < 75) {
        end = start + 75;
        postfix = "...";
      } else if (end - offset < 75) {
        start = end - 75;
        prefix = "...";
      } else {
        // Neither end is near, just pick an area around the offset.
        start = offset - 36;
        end = offset + 36;
        prefix = postfix = "...";
      }
    }
    String slice = source.substring(start, end);
    int markOffset = offset - start + prefix.length;
    return "$report$prefix$slice$postfix\n${" " * markOffset}^\n";
  }
}

class IntegerDivisionByZeroException implements Exception {
  const IntegerDivisionByZeroException();
  String toString() => "IntegerDivisionByZeroException";
}
// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart.core;

/**
 * The signature of a generic comparison function.
 *
 * A comparison function represents an ordering on a type of objects.
 * A total ordering on a type means that for two values, either they
 * are equal or one is greater than the other (and the latter must then be
 * smaller than the former).
 *
 * A [Comparator] function represents such a total ordering by returning
 *
 * * a negative integer if [a] is smaller than [b],
 * * zero if [a] is equal to [b], and
 * * a positive integer if [a] is greater than [b].
 */
typedef int Comparator<T>(T a, T b);

/**
 * Interface used by types that have an intrinsic ordering.
 *
 * The [compareTo] operation defines a total ordering of objects,
 * which can be used for ordering and sorting.
 *
 * The [Comparable] interface should be used for the natural ordering of a type.
 * If a type can be ordered in more than one way,
 * and none of them is the obvious natural ordering,
 * then it might be better not to use the [Comparable] interface,
 * and to provide separate [Comparator]s instead.
 *
 * It is recommended that the order of a [Comparable] agrees
 * with its operator [==] equality (`a.compareTo(b) == 0` iff `a == b`),
 * but this is not a requirement.
 * For example, [double] and [DateTime] have `compareTo` methods
 * that do not agree with operator [==].
 * For doubles the [compareTo] method is more precise than the equality,
 * and for [DateTime] it is less precise.
 *
 * Examples:
 *
 *      (0.0).compareTo(-0.0);  // => 1
 *      0.0 == -0.0;            // => true
 *      var dt = new DateTime.now();
 *      var dt2 = dt.toUtc();
 *      dt == dt2;              // => false
 *      dt.compareTo(dt2);      // => 0
 *
 * The [Comparable] interface does not imply the existence
 * of the comparison operators `<`, `<=`, `>` and `>=`.
 * These should only be defined
 * if the ordering is a less-than/greater-than ordering,
 * that is, an ordering where you would naturally
 * use the words "less than" about the order of two elements.
 *
 * If the equality operator and [compareTo] disagree,
 * the comparison operators should follow the equality operator,
 * and will likely also disagree with [compareTo].


DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

/***/ }),
/* 135 */
/***/ (function(module, exports, __webpack_require__) {

	eval("/**\n * Copyright 2013-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule ReactInjection\n */\n\n'use strict';\n\nvar DOMProperty = __webpack_require__(37);\nvar EventPluginHub = __webpack_require__(45);\nvar ReactComponentEnvironment = __webpack_require__(78);\nvar ReactClass = __webpack_require__(136);\nvar ReactEmptyComponent = __webpack_require__(82);\nvar ReactBrowserEventEmitter = __webpack_require__(43);\nvar ReactNativeComponent = __webpack_require__(83);\nvar ReactPerf = __webpack_require__(32);\nvar ReactRootIndex = __webpack_require__(60);\nvar ReactUpdates = __webpack_require__(68);\n\nvar ReactInjection = {\n  Component: ReactComponentEnvironment.injection,\n  Class: ReactClass.injection,\n  DOMProperty: DOMProperty.injection,\n  EmptyComponent: ReactEmptyComponent.injection,\n  EventPluginHub: EventPluginHub.injection,\n  EventEmitter: ReactBrowserEventEmitter.injection,\n  NativeComponent: ReactNativeComponent.injection,\n  Perf: ReactPerf.injection,\n  RootIndex: ReactRootIndex.injection,\n  Updates: ReactUpdates.injection\n};\n\nmodule.exports = ReactInjection;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9yZWFjdC9saWIvUmVhY3RJbmplY3Rpb24uanM/MTM2NiJdLCJzb3V


ion, locomotion_component, self._weapon_action_component, self._combat_ability_action_component, self._alternate_fire_component, weapon_template, self._constants, self._buff_extension) then
				if self._ledge_vaulting_character_state_component.was_sprinting then
					next_state_params.disable_sprint_start_slowdown = true
				end

				return "sprinting"
			else
				return "walking"
			end
		else
			return "falling"
		end
	end

	return nil
end

return PlayerCharacterStateLedgeVaulting